kubernetes证书介绍
kubernetes证书介绍
不管是二进制搭建还是kubeadm安装kubernetes集群都需要有证书,因为在Kubernetes 集群中通过证书才能进行基于 TLS 的身份验证;在Kubernetes 的组件之间进行通信时,数字证书的验证是在协议层面通过 TLS 完成的,除了需要在建立通信时提供相关的证书和密钥外,在应用层面并不需要进行特殊处理。采用 TLS 进行验证有两种方式:
- 服务器单向认证:只需要服务器端提供证书,客户端通过服务器端证书验证服务的身份,但服务器并不验证客户端的身份。这种情况一般适用于对 Internet 开放的服务,例如搜索引擎网站,任何客户端都可以连接到服务器上进行访问,但客户端需要验证服务器的身份,以避免连接到伪造的恶意服务器。
- 双向 TLS 认证:除了客户端需要验证服务器的证书,服务器也要通过客户端证书验证客户端的身份。这种情况下服务器提供的是敏感信息,只允许特定身份的客户端访问。
- 官网PKI 证书和要求:https://kubernetes.io/zh-cn/docs/setup/best-practices/certificates/
- 官网kubernetes中的用户认证:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/authentication/#x509-client-certs
kubernetes集群间的通讯:
1 kubernetes集群中有哪些证书文件
1.1 二进制安装
# .conf文件为服务配置文件
# .kubeconfig文件为账户授权信息文件,对标kubeadm集群的.conf文件
[root@master ~]# tree /etc/kubernetes/
/etc/kubernetes/
├── kube-apiserver.conf
├── kube-controller-manager.conf
├── kube-controller-manager.kubeconfig
├── kubelet-bootstrap.kubeconfig
├── kubelet.conf
├── kubelet-conf.yaml
├── kubelet.kubeconfig
├── kube-proxy.kubeconfig
├── kube-proxy.yaml
├── kube-scheduler.conf
├── kube-scheduler.kubeconfig
├── ssl
│ ├── admin-key.pem
│ ├── admin.pem
│ ├── ca-key.pem
│ ├── ca.pem
│ ├── kube-apiserver-key.pem
│ ├── kube-apiserver.pem
│ ├── kube-controller-manager-key.pem
│ ├── kube-controller-manager.pem
│ ├── kubelet-client-2023-04-01-20-00-28.pem
│ ├── kubelet-client-current.pem -> /etc/kubernetes/ssl/kubelet-client-2023-04-01-20-00-28.pem
│ ├── kubelet.crt
│ ├── kubelet.key
│ ├── kube-proxy-key.pem
│ ├── kube-proxy.pem
│ ├── kube-scheduler-key.pem
│ └── kube-scheduler.pem
└── token.csv
1 directory, 28 files
[root@master ~]# tree /etc/etcd/
/etc/etcd/
├── etcd.conf
└── ssl
├── ca-key.pem
├── ca.pem
├── etcd-key.pem
└── etcd.pem
1 directory, 5 files
1.2 kubeadm安装
[root@kubeadm ~]# tree /etc/kubernetes/
/etc/kubernetes/
├── admin.conf #admin.conf是kubeadm集群配置管理员的,包含整个集群各个节点的授权信息,以及本身的一些配置信息;
├── controller-manager.conf
├── kubelet.conf
├── manifests #资源清单
│ ├── etcd.yaml
│ ├── kube-apiserver.yaml
│ ├── kube-controller-manager.yaml
│ └── kube-scheduler.yaml
├── pki
│ ├── apiserver.crt
│ ├── apiserver.key
│ ├── apiserver-etcd-client.crt
│ ├── apiserver-etcd-client.key
│ ├── apiserver-kubelet-client.crt
│ ├── apiserver-kubelet-client.key
│ ├── ca.crt
│ ├── ca.key
│ ├── etcd
│ │ ├── ca.crt
│ │ ├── ca.key
│ │ ├── healthcheck-client.crt
│ │ ├── healthcheck-client.key
│ │ ├── peer.crt
│ │ ├── peer.key
│ │ ├── server.crt
│ │ └── server.key
│ ├── front-proxy-ca.crt
│ ├── front-proxy-ca.key
│ ├── front-proxy-client.crt
│ ├── front-proxy-client.key
│ ├── sa.key #用于服务账户管理的密钥对sa.key和sa.pub
│ └── sa.pub
└── scheduler.conf
3 directories, 30 files
#可以看出kubeadm安装的k8s集群有三套ca证书:
/etc/kubernetes/pki/ca.crt #给kubernates内部组件使用,核心api
/etc/kubernetes/pki/etcd/ca.crt #给ETCD使用
/etc/kubernetes/pki/front-proxy-ca.crt #用于聚合层 apiserver 鉴权的
2 用于证书签名的根证书--CA证书
- kubeadm安装的k8s集群有三套ca证书:一套CA给ETCD使用,一套是给kubernates内部组件使用,还有一套是给配置聚合层使用的;
- 二进制安装可以通过一套CA证书管理;
- Kubernetes apiserver 会检查个集群各组件的请求的证书;如果它是由CA 证书签名的,并且用户是公用名 CN= 的值,而组是组织 O= 的取值,则该请求被视为合法请求。
2.1 什么是聚合层(Aggregation Layer)
- 使用聚合层(Aggregation Layer),用户可以通过附加的 API 扩展 Kubernetes, 而不局限于 Kubernetes 核心 API 提供的功能。 这里的附加 API 可以是现成的解决方案,比如 metrics server, 或者你自己开发的 API。
- 聚合层不同于 定制资源(Custom Resources)。 后者的目的是让 kube-apiserver 能够识别新的对象类别(Kind)。
- 官网kubernetes API聚合:https://kubernetes.io/zh-cn/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/
#kubeadm安装的的集群组件配置文件中的ca证书
[root@kubeadm ~]# cat /etc/kubernetes/manifests/etcd.yaml | grep ca.crt #只配置了etcd的ca证书
- --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
- --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
[root@kubeadm ~]#
[root@kubeadm ~]# cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep ca.crt #配置了三套ca证书
- --client-ca-file=/etc/kubernetes/pki/ca.crt
- --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
- --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
[root@kubeadm ~]#
[root@kubeadm ~]# cat /etc/kubernetes/manifests/kube-controller-manager.yaml | grep ca.crt #配置了聚合层 和 核心api两套CA证书
- --client-ca-file=/etc/kubernetes/pki/ca.crt
- --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt
- --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
- --root-ca-file=/etc/kubernetes/pki/ca.crt
[root@kubeadm ~]#
官网requestheader-client-ca-file:https://kubernetes.io/zh-cn/docs/tasks/extend-kubernetes/configure-aggregation-layer/#ca-reusage-and-conflicts
3 etcd的证书
3.1 etcd集群的证书有哪些
[root@kubeadm ~]# ll /etc/kubernetes/pki/etcd/
总用量 32
-rw-r--r--. 1 root root 1058 4月 3 15:59 ca.crt #etcd集群的CA和私钥
-rw-------. 1 root root 1679 4月 3 15:59 ca.key
-rw-r--r--. 1 root root 1139 4月 3 15:59 healthcheck-client.crt #etcd 验证访问其服务的客户端的证书和私钥
-rw-------. 1 root root 1679 4月 3 15:59 healthcheck-client.key
-rw-r--r--. 1 root root 1176 4月 3 15:59 peer.crt #etcd 节点之间相互进行认证的 peer 证书和私钥
-rw-------. 1 root root 1675 4月 3 15:59 peer.key
-rw-r--r--. 1 root root 1176 4月 3 15:59 server.crt #etcd 对外提供服务的服务器证书及私钥
-rw-------. 1 root root 1679 4月 3 15:59 server.key
4 为用户账户配置证书.conf或.kubeconfig
kubeadm为例:
文件名 | 凭据名称 | 默认CN | O(位于 Subject 中) | 说明 |
---|---|---|---|---|
admin.conf | default-admin | kubernetes-admin | system:masters | 配置集群的管理员 |
kubelet.conf | default-auth | system:node: |
system:nodes | 集群中的每个节点都需要一份 |
controller-manager.conf | default-controller-manager | system:kube-controller-manager | 必需添加到kube-controller-manager.yaml清单中 | |
scheduler.conf | default-scheduler | system:kube-scheduler | 必需添加到kube-scheduler.yaml清单中 |
说明:
- k8s集群中每个组件都在apiserver注册了自己的账户授权文件即.conf或.kubeconfig;用于组件之间和api http 通信;
- kubelet.conf 中
的值 必须 与 kubelet 向 apiserver 注册时提供的节点名称的值完全匹配; - 官网kubernetes中的用户认证:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/authentication/#x509-client-certs