一、背景信息
K8S二进制部署,有两大难点,第一个就是证书的生成,第二个就是需要部署哪些组件。这里就首先介绍一下,K8S需要生成哪些证书文件?
Kubelet 的客户端证书,用于 API 服务器身份验证
Kubelet 服务端证书, 用于 API 服务器与 Kubelet 的会话
API 服务器端点的证书
集群管理员的客户端证书,用于 API 服务器身份认证
API 服务器的客户端证书,用于和 Kubelet 的会话
API 服务器的客户端证书,用于和 etcd 的会话
控制器管理器的客户端证书或 kubeconfig,用于和 API 服务器的会话
调度器的客户端证书或 kubeconfig,用于和 API 服务器的会话
前端代理的客户端及服务端证书
1.1、ca证书
我们先简单说一下证书签发,首先需要签发一个根CA(证书签发机构),然后使用CA来签发服务端证书(server)、客户端证书(client)、对等证书(peer),其中对等证书就是既可以做服务端证书,也可以做客户端证书。
我们需要三个CA(当然你懒一些用同一个CA也是可以的),这里就介绍三个CA,如下所示:
证书及密钥路径 | 证书文件 | 密钥文件 | 默认CN | 说明 |
---|---|---|---|---|
/etc/kubernetes/pki | ca.pem | ca-key.pem | kubernetes-ca | Kubernetes 通用 CA |
/etc/kubernetes/pki/etcd | ca.pem | ca-key.pem | etcd-ca | 与 etcd 相关的所有功能 |
/etc/kubernetes/pki | front-proxy-ca.pem | front-proxy-ca-key.pem | kubernetes-front-proxy-ca | 用于前端代理 |
1.2、etcd需要的证书
证书及密钥路径 | 证书文件 | 密钥文件 | 父级CA | 默认CN | 说明 |
---|---|---|---|---|---|
/etc/kubernetes/pki/etcd | server.pem | server-key.pem | etcd-ca | kube-etcd | etcd对外提供服务,要有一套etcd server证书 |
/etc/kubernetes/pki/etcd | healthcheck-client.pem | healthcheck-client-key.pem | etcd-ca | kube-etcd-healthcheck-client | 客户端证书 |
/etc/kubernetes/pki/etcd | peer.pem | peer-key.pem | etcd-ca | kube-etcd-peer | etcd各节点之间进行通信,要有一套etcd peer证书 |
1.3、kube-apiserver需要的证书文件
证书及密钥路径 | 证书文件 | 密钥文件 | 令牌认证文件 | 父级CA | 默认CN | 证书类型 | 说明 |
---|---|---|---|---|---|---|---|
/etc/kubernetes/pki/etcd | ca.pem | ca-key.pem | 无 | etcd-ca | ca | etcd集群ca根证书 | |
/etc/kubernetes/pki | apiserver-etcd-client.pem | apiserver-etcd-client-key.pem | etcd-ca | kube-apiserver-etcd-client | client | kube-apiIserver访问etcd,要有一套etcd客户端证书 | |
/etc/kubernetes/pki | ca.pem | ca-key.pem | 无 | kubernetes-ca | ca | k8s集群ca根证书 | |
/etc/kubernetes/pki | apiserver.pem | apiserver-key.pem | kubernetes-ca | kube-apiserver | server | kube-apiserver对外提供服务,要有一套kube-apiserver服务端证书 | |
/etc/kubernetes/pki | apiserver-kubelet-client.pem | apiserver-kubelet-client-key.pem | kubernetes-ca | kube-apiserver-kubelet-client | client | 用于API服务器安全地连接到kubelet的客户端证书 | |
/etc/kubernetes/pki | front-proxy-ca.pem | front-proxy-ca-key.pem | 无 | kubernetes-front-proxy-ca | ca | 用于前端代理证书颁发机构 | |
/etc/kubernetes/pki | front-proxy-client.pem | front-proxy-client-key.pem | kubernetes-front-proxy-ca | front-proxy-client | client | 用于前端代理客户端 | |
/etc/kubernetes/pki | sa.pub | sa.key | 无 | 无 | 密钥对 | 用于控制器管理器签署ServiceAccount时使用的密钥 | |
/etc/kubernetes/pki | token.csv | 无 | 无 | 身份认证依据 |
1.4、kube-controller-manager需要的证书文件
证书及密钥路径 | 证书文件 | 密钥文件 | kubeconfig文件 | 父级CA | 默认CN | 证书类型 | 说明 |
---|---|---|---|---|---|---|---|
/etc/kubernetes/pki | ca.pem | ca-key.pem | 无 | kubernetes-ca | ca | k8s集群ca根证书 | |
/etc/kubernetes | controller-manager.kubeconfig | 控制器管理器的kubeconfig,用于和API服务器的会话 | |||||
/etc/kubernetes/pki | sa.key | 无 | 无 | 密钥对 | 用于控制器管理器签署ServiceAccount时使用的密钥 |
1.5、kube-scheduler需要的证书文件
证书及密钥路径 | 证书文件 | 密钥文件 | kubeconfig文件 | 父级CA | 默认CN | 证书类型 | 说明 |
---|---|---|---|---|---|---|---|
/etc/kubernetes | scheduler.kubeconfig | 调度器的kubeconfig,用于和API服务器的会话 |
1.6、kube-proxy需要的证书文件
证书及密钥路径 | 证书文件 | 密钥文件 | kubeconfig文件 | 父级CA | 默认CN | 证书类型 | 说明 |
---|---|---|---|---|---|---|---|
/etc/kubernetes | kube-proxy.kubeconfig | kube-proxy的kubeconfig,用于和API服务器的会话 |
1.7、kubelet需要的证书文件
kubelet证书推荐使用TLS bootstrap方式自动签发,手动签发的话需要给每一个node节点的kubelet签发证书,且kubelet证书CN要为system:node:nodeName,O要为system:nodes。
证书及密钥路径 | 证书文件 | 密钥文件 | kubeconfig文件 | 父级CA | 默认CN | 证书类型 | 说明 |
---|---|---|---|---|---|---|---|
/etc/kubernetes/pki | ca.pem | ca-key.pem | 无 | kubernetes-ca | ca | k8s集群ca根证书 | |
/etc/kubernetes | kubelet-bootstrap.kubeconfig | kubelet的kubeconfig,用于和API服务器的会话 |
1.8、kubectl需要的证书文件
证书及密钥路径 | 证书文件 | 密钥文件 | kubeconfig文件 | 父级CA | 默认CN | 证书类型 | 说明 |
---|---|---|---|---|---|---|---|
/etc/kubernetes | admin.kubeconfig | 集群管理员的客户端证书,用于API服务器身份认证 |
二、手动生成证书
说明:kubernetes系统各组件需要使用TLS(SSL)证书对通信进行加密,本文档使用CloudFlare的PKI工具集cfssl来生成Certificate Authority (CA) 证书和秘钥文件,CA是自签名的证书,用来签名后续创建的其它TLS证书。
2.1、安装cfssl工具集
curl -L https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssl_1.6.3_linux_amd64 -o /usr/local/bin/cfssl
curl -L https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssljson_1.6.3_linux_amd64 -o /usr/local/bin/cfssljson
curl -L https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssl-certinfo_1.6.3_linux_amd64 -o /usr/local/bin/cfssl-certinfo
curl -L https://dl.k8s.io/release/v1.24.12/bin/linux/amd64/kubectl -o /usr/local/bin/kubectl
chmod +x /usr/local/bin/cfssl* && chmod +x /usr/local/bin/kubectl
2.2、创建CA证书配置文件
说明:根据K8S集群要求,需要三个CA证书,分别是etcd CA证书、front-proxy CA证书、kubernetes CA证书。这些CA 证书可以共用一个相同的CA证书配置文件。
2.2.1、创建CA证书配置文件目录
mkdir -p /opt/ssl && cd /opt/ssl
2.2.2、创建CA证书配置文件
vim ca-config.json
{
"signing": {
"default": {
"expiry": "864000h"
},
"profiles": {
"server": {
"expiry": "864000h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
},
"client": {
"expiry": "864000h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
},
"peer": {
"expiry": "864000h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
字段参数详解:
ca-config.json:可以定义多个profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个profile;
signing:表示该证书可用于签名其它证书;生成的ca.pem证书中CA=TRUE;
peer:双向证书,用于etcd集群成员间通信
server auth:表示client可以用该CA对server提供的证书进行验证;
client auth:表示server可以用该CA对client提供的证书进行验证;
2.3、生成etcd相关证书
2.3.1、创建证书文件目录
mkdir -p /opt/ssl/etcd && cd /opt/ssl/etcd
2.3.2、生成 etcd CA 证书
1、创建etcd-ca-csr.json文件,这是etcd CA证书的签名请求文件
vim etcd-ca-csr.json
{
"CN": "etcd-ca",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
&