kubernetes证书介绍

kubernetes证书介绍

不管是二进制搭建还是kubeadm安装kubernetes集群都需要有证书,因为在Kubernetes 集群中通过证书才能进行基于 TLS 的身份验证;在Kubernetes 的组件之间进行通信时,数字证书的验证是在协议层面通过 TLS 完成的,除了需要在建立通信时提供相关的证书和密钥外,在应用层面并不需要进行特殊处理。采用 TLS 进行验证有两种方式:

  1. 服务器单向认证:只需要服务器端提供证书,客户端通过服务器端证书验证服务的身份,但服务器并不验证客户端的身份。这种情况一般适用于对 Internet 开放的服务,例如搜索引擎网站,任何客户端都可以连接到服务器上进行访问,但客户端需要验证服务器的身份,以避免连接到伪造的恶意服务器。
  2. 双向 TLS 认证:除了客户端需要验证服务器的证书,服务器也要通过客户端证书验证客户端的身份。这种情况下服务器提供的是敏感信息,只允许特定身份的客户端访问。
  3. 官网PKI 证书和要求:https://kubernetes.io/zh-cn/docs/setup/best-practices/certificates/
  4. 官网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证书

  1. kubeadm安装的k8s集群有三套ca证书:一套CA给ETCD使用,一套是给kubernates内部组件使用,还有一套是给配置聚合层使用的;
  2. 二进制安装可以通过一套CA证书管理;
  3. Kubernetes apiserver 会检查个集群各组件的请求的证书;如果它是由CA 证书签名的,并且用户是公用名 CN= 的值,而组是组织 O= 的取值,则该请求被视为合法请求。

2.1 什么是聚合层(Aggregation Layer)

  1. 使用聚合层(Aggregation Layer),用户可以通过附加的 API 扩展 Kubernetes, 而不局限于 Kubernetes 核心 API 提供的功能。 这里的附加 API 可以是现成的解决方案,比如 metrics server, 或者你自己开发的 API。
  2. 聚合层不同于 定制资源(Custom Resources)。 后者的目的是让 kube-apiserver 能够识别新的对象类别(Kind)。
  3. 官网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清单中

说明:

  1. k8s集群中每个组件都在apiserver注册了自己的账户授权文件即.conf或.kubeconfig;用于组件之间和api http 通信;
  2. kubelet.conf 中 的值 必须 与 kubelet 向 apiserver 注册时提供的节点名称的值完全匹配;
  3. 官网kubernetes中的用户认证:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/authentication/#x509-client-certs
posted @ 2023-04-03 17:56  du-z  阅读(507)  评论(0编辑  收藏  举报