在部署k8s的时候经常要搞一些证书,而且还挺多,感觉有必要梳理一下这些证书。
k8s需要PKI证书来基于TLS来做认证。如果是基于kubeadm安装的k8s,那么证书会自动生成。
为了保证私钥足够安全,请不要将私钥存储于api server。 下面梳理下集群中需要的这些证书。
证书嘛: 就是表示 客户端和服务端双方的 “口令” 对双方来说是可以对应的上的,比如 “天王盖地虎,宝塔镇河妖”。
不管是谁,只要符合 “口令”的对应关系,双方就可以建立信任关系,交互信息。
比如之前用用户名和密码,证书也是一种类似的形式,一般在一个请求连接中密码只校验一次,然后会给一个token,之后基于token就可以了,当然token是有过期时间的。
- 怎么会用到这么多证书呢?
- kubelet客户端证书用于发给kube-api:比如加入新的node,kubelet发送请求到kube-api需要校验kubelet的客户端证书
- kubelet服务端证书用于和kube-api交互:比如 kube-api通知kubelet创建pod,那么就需要校验触发kubelet进行服务端证书的校验
- kube-api服务端证书用于endpoint粒度:kube-api server endpoint 服务端证书
- 管理员客户端证书用于发给kube-api: 集群管理员访问apiserver的时候需要带着该证书
- kube-api 客户端证书用于发给kubelet: 当kube-api向kubelet发起请求时,需要带客户端证书
- kube-api 客户端证书用于发给etcd: 当kube-api向etcd发起请求时,需要带客户端证书
- controller manager 客户端证书 certificate/kubeconfig 用于发给kube-api
- scheduler 客户端证书 certificate/kubeconfig 用于发给kube-api
- 前端代理所需要的客户端和服务端证书: front-proxy证书只有在kubeproxy支持扩展api server的时候才需要
- 证书存储在哪里?
如果是用kubeadm部署的,那么就存储在 /etc/kubernetes/pki. 如果是别的部署的,应该就在/etc/kubernetes 下。
- 如果手动创建证书?
我们先简单说说证书签发,首先需要签发一个根CA(证书签发机构),然后使用CA来签发服务端证书、客户端证书、对等证书(对等证书就是即可以做服务端证书也可以做客户端证书)。 我们需要三个CA(当然你懒一些用同一个CA也是可以的),我们需要以下三个CA。
如果不想用kube-adm 一键生成的话,可以手动创建一个 根 CA。 然后用该 跟CA 创建中间证书
root CA ----> intermediate CA
根证书 --> 子证书(给k8s,etcd等服务放到指定路径,指定名字,配置为指定参数)即可
子证书(给k8s,etcd等服务放到指定路径,指定名字,配置为指定参数)即可
上面1说的那些证书都是子证书,根证书由管理员妥善保管。
这三个证书,都是我们需要先手动创建的跟证书,当然为了方便维护也可以只用一个CA,基于一个重命名为三个文件名即可。
path | Default CN | description |
---|---|---|
ca.crt,key | kubernetes-ca | Kubernetes general CA |
etcd/ca.crt,key | etcd-ca | For all etcd-related functions |
front-proxy-ca.crt,key | kubernetes-front-proxy-ca | For the front-end proxy |
/etc/kubernetes/pki/ca.crt
/etc/kubernetes/pki/ca.key
/etc/kubernetes/pki/etcd/ca.crt
/etc/kubernetes/pki/etcd/ca.key
/etc/kubernetes/pki/front-proxy-ca.crt
/etc/kubernetes/pki/front-proxy-ca.key
除了上面的证书,对于每一个CA,还要搞一个公钥|私钥 秘钥对用于 服务账户(service account)管理,比如 sa.key
and sa.pub
。
- 所有证书一览:
If you don't wish to copy the CA private keys to your cluster, you can generate all certificates yourself.
如果你不希望复制ca 私钥到集群中,那么就只能自己生成证书(这个意思是生成证书存到服务中,而没有静态文件?,还是自己一个节点一个节点的逐个生成基于同一个root CA,感觉原文档这句话怪怪的)。
Default CN | Parent CA | O (in Subject) | kind | hosts (SAN) |
---|---|---|---|---|
kube-etcd | etcd-ca | server, client |
<hostname> , <Host_IP> , localhost , 127.0.0.1
|
|
kube-etcd-peer | etcd-ca | server, client |
<hostname> , <Host_IP> , localhost , 127.0.0.1
|
|
kube-etcd-healthcheck-client | etcd-ca | client | ||
kube-apiserver-etcd-client | etcd-ca | system:masters | client | |
kube-apiserver | kubernetes-ca | server |
<hostname> , <Host_IP> , <advertise_IP> , [1]
|
|
kube-apiserver-kubelet-client | kubernetes-ca | system:masters | client | |
front-proxy-client | kubernetes-front-proxy-ca | client |
[1]: any other IP or DNS name you contact your cluster on (as used by kubeadm the load balancer stable IP and/or DNS name, kubernetes
, kubernetes.default
, kubernetes.default.svc
, kubernetes.default.svc.cluster
, kubernetes.default.svc.cluster.local
)
where kind
maps to one or more of the x509 key usage types:
kind | Key usage |
---|---|
server | digital signature, key encipherment, server auth |
client | digital signature, key encipherment, client auth |
- 证书所在的路径
即使是个人生成的证书,也最好和kubeadm保持一致
Default CN | recommended key path | recommended cert path | command | key argument | cert argument |
---|---|---|---|---|---|
etcd-ca | etcd/ca.key | etcd/ca.crt | kube-apiserver | --etcd-cafile | |
kube-apiserver-etcd-client | apiserver-etcd-client.key | apiserver-etcd-client.crt | kube-apiserver | --etcd-keyfile | --etcd-certfile |
kubernetes-ca | ca.key | ca.crt | kube-apiserver | --client-ca-file | |
kubernetes-ca | ca.key | ca.crt | kube-controller-manager | --cluster-signing-key-file | --client-ca-file, --root-ca-file, --cluster-signing-cert-file |
kube-apiserver | apiserver.key | apiserver.crt | kube-apiserver | --tls-private-key-file | --tls-cert-file |
kube-apiserver-kubelet-client | apiserver-kubelet-client.key | apiserver-kubelet-client.crt | kube-apiserver | --kubelet-client-key | --kubelet-client-certificate |
front-proxy-ca | front-proxy-ca.key | front-proxy-ca.crt | kube-apiserver | --requestheader-client-ca-file | |
front-proxy-ca | front-proxy-ca.key | front-proxy-ca.crt | kube-controller-manager | --requestheader-client-ca-file | |
front-proxy-client | front-proxy-client.key | front-proxy-client.crt | kube-apiserver | --proxy-client-key-file | --proxy-client-cert-file |
etcd-ca | etcd/ca.key | etcd/ca.crt | etcd | --trusted-ca-file, --peer-trusted-ca-file | |
kube-etcd | etcd/server.key | etcd/server.crt | etcd | --key-file | --cert-file |
kube-etcd-peer | etcd/peer.key | etcd/peer.crt | etcd | --peer-key-file | --peer-cert-file |
etcd-ca | etcd/ca.crt | etcdctl | --cacert | ||
kube-etcd-healthcheck-client | etcd/healthcheck-client.key | etcd/healthcheck-client.crt | etcdctl | --key | --cert |
Same considerations apply for the service account key pair:
private key path | public key path | command | argument |
---|---|---|---|
sa.key | kube-controller-manager | --service-account-private-key-file | |
sa.pub | kube-apiserver | --service-account-key-file |
下面就是上表里的证书所在的决定路径
/etc/kubernetes/pki/etcd/ca.key
/etc/kubernetes/pki/etcd/ca.crt
/etc/kubernetes/pki/apiserver-etcd-client.key
/etc/kubernetes/pki/apiserver-etcd-client.crt
/etc/kubernetes/pki/ca.key
/etc/kubernetes/pki/ca.crt
/etc/kubernetes/pki/apiserver.key
/etc/kubernetes/pki/apiserver.crt
/etc/kubernetes/pki/apiserver-kubelet-client.key
/etc/kubernetes/pki/apiserver-kubelet-client.crt
/etc/kubernetes/pki/front-proxy-ca.key
/etc/kubernetes/pki/front-proxy-ca.crt
/etc/kubernetes/pki/front-proxy-client.key
/etc/kubernetes/pki/front-proxy-client.crt
/etc/kubernetes/pki/etcd/server.key
/etc/kubernetes/pki/etcd/server.crt
/etc/kubernetes/pki/etcd/peer.key
/etc/kubernetes/pki/etcd/peer.crt
/etc/kubernetes/pki/etcd/healthcheck-client.key
/etc/kubernetes/pki/etcd/healthcheck-client.crt
/etc/kubernetes/pki/sa.key
/etc/kubernetes/pki/sa.pub
5. 为用户账户配置证书
必须手动配置下面这些管理员账户以及服务账户的CA
filename | credential name | Default CN | O (in Subject) |
---|---|---|---|
admin.conf | default-admin | kubernetes-admin | system:masters |
kubelet.conf | default-auth | system:node:<nodeName> (see note) |
system:nodes |
controller-manager.conf | default-controller-manager | system:kube-controller-manager | |
scheduler.conf | default-scheduler | system:kube-scheduler |
注意: kubelet.conf
的 node名, <nodeName>
必须要和 kubelet当时注册到kube-api的名字一毛一样。
如果不一样,那估计要深入下官方文档。
-
For each config, generate an x509 cert/key pair with the given CN and O.
对于表中的每一个配置文件,都要基于给定的CN和O 标签,创建 x509 cert/key 密钥对。 -
然后按照下述命令模板执行
KUBECONFIG=<filename> kubectl config set-cluster default-cluster --server=https://<host ip>:6443 --certificate-authority <path-to-kubernetes-ca> --embed-certs
KUBECONFIG=<filename> kubectl config set-credentials <credential-name> --client-key <path-to-key>.pem --client-certificate <path-to-cert>.pem --embed-certs
KUBECONFIG=<filename> kubectl config set-context default-system --cluster default-cluster --user <credential-name>
KUBECONFIG=<filename> kubectl config use-context default-system
上述表中的文件的使用场景如下
filename | command | comment |
---|---|---|
admin.conf | kubectl | Configures administrator user for the cluster |
kubelet.conf | kubelet | One required for each node in the cluster. |
controller-manager.conf | kube-controller-manager | Must be added to manifest in manifests/kube-controller-manager.yaml
|
scheduler.conf | kube-scheduler | Must be added to manifest in manifests/kube-scheduler.yaml
|
The following files illustrate full paths to the files listed in the previous table:
/etc/kubernetes/admin.conf
/etc/kubernetes/kubelet.conf
/etc/kubernetes/controller-manager.conf
/etc/kubernetes/scheduler.conf
网友评论