美文网首页
k8s证书梳理

k8s证书梳理

作者: cloudFans | 来源:发表于2022-09-25 08:46 被阅读0次

在部署k8s的时候经常要搞一些证书,而且还挺多,感觉有必要梳理一下这些证书。

k8s需要PKI证书来基于TLS来做认证。如果是基于kubeadm安装的k8s,那么证书会自动生成。
为了保证私钥足够安全,请不要将私钥存储于api server。 下面梳理下集群中需要的这些证书。

证书嘛: 就是表示 客户端和服务端双方的 “口令” 对双方来说是可以对应的上的,比如 “天王盖地虎,宝塔镇河妖”。
不管是谁,只要符合 “口令”的对应关系,双方就可以建立信任关系,交互信息。

比如之前用用户名和密码,证书也是一种类似的形式,一般在一个请求连接中密码只校验一次,然后会给一个token,之后基于token就可以了,当然token是有过期时间的。

  1. 怎么会用到这么多证书呢?
  • 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的时候才需要
  1. 证书存储在哪里?
    如果是用kubeadm部署的,那么就存储在 /etc/kubernetes/pki. 如果是别的部署的,应该就在/etc/kubernetes 下。
  1. 如果手动创建证书?

我们先简单说说证书签发,首先需要签发一个根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

  1. 所有证书一览:
    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
  1. 证书所在的路径

即使是个人生成的证书,也最好和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的名字一毛一样。
如果不一样,那估计要深入下官方文档。

  1. For each config, generate an x509 cert/key pair with the given CN and O.
    对于表中的每一个配置文件,都要基于给定的CN和O 标签,创建 x509 cert/key 密钥对。

  2. 然后按照下述命令模板执行

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

参考:

  1. https://kubernetes.io/docs/setup/best-practices/certificates/

  2. https://yuyicai.com/posts/k8s-cert/

相关文章

  • k8s证书梳理

    在部署k8s的时候经常要搞一些证书,而且还挺多,感觉有必要梳理一下这些证书。 k8s需要PKI证书来基于TLS来做...

  • 46-k8s-高可用集群-证书

    一、k8s集群中的证书 在k8s集群中各个组件之间通信时为了安全起见都是需要安全认证的(通过公、私钥) 1、证书 ...

  • k8s1.20.6用kubeadm安装的3master+3nod

    失败翻车记录 一、查看k8s中所有证书的到期时间: 查看基础配置 二、查看CA证书过期时间: 查看集群证书过期时间...

  • k8s 安装访问dashboard

    安装 dashbaord 验证 配置访问 第一步 生成证书,并使用证书创建 K8S secret gencert....

  • 手工实现 k8s 集群的搭建清单

    目标 搭建 1 主 2 从无证书认证的 k8s 集群 准备 3 台主机: 9.1 作为 k8s 集群的 maste...

  • kubernetes笔记-证书管理

    1.1.1.都有哪些证书? K8s用到的证书都在/etc/kubernetes/pki路径下: 一共有三套ca,每...

  • K8S命令的梳理

    K8S命令的梳理 kubectl是一个基础的K8S集群管理命令,可以实现对K8S资源的查询,创建,删除,更新,回退...

  • K8s 1.6.2 安装配置-证书(一)

    一:创建 k8s 各组件 TLS 加密通信的证书和秘钥 kubernetes 系统的各组件需要使用 TLS 证书对...

  • k8s证书配置,dns,dashboard

    一.签发证书 TLS双向认知需要预先自建CA签发证书,权威CA机构的证书应该不可用,因为大部分k8s都是在内网中部...

  • kubeadm初始化 apiserver证书到期替换.md

    Kubernetes证书到期导致解决方法 由于使用kubeadm 初始化 k8s集群,默认签发的CA证书是1年有效...

网友评论

      本文标题:k8s证书梳理

      本文链接:https://www.haomeiwen.com/subject/njezortx.html