PKI 证书和要求

    Kubernetes 需要 PKI 才能执行以下操作:

    • Kubelet 的客户端证书,用于 API 服务器身份验证
    • API 服务器端点的证书
    • 集群管理员的客户端证书,用于 API 服务器身份认证
    • API 服务器的客户端证书,用于和 Kubelet 的会话
    • 控制器管理器的客户端证书/kubeconfig,用于和 API 服务器的会话
    • 调度器的客户端证书/kubeconfig,用于和 API 服务器的会话
    • 的客户端及服务端证书

    etcd 还实现了双向 TLS 来对客户端和对其他对等节点进行身份验证。

    如果你是通过 kubeadm 安装的 Kubernetes,所有证书都存放在 /etc/kubernetes/pki 目录下。本文所有相关的路径都是基于该路径的相对路径。

    如果你不想通过 kubeadm 生成这些必需的证书,你可以通过下面两种方式之一来手动创建他们。

    你可以创建一个单根 CA,由管理员控制器它。该根 CA 可以创建多个中间 CA,并将所有进一步的创建委托给 Kubernetes。

    需要这些 CA:

    如果你不想将 CA 的私钥拷贝至你的集群中,你也可以自己生成全部的证书。

    需要这些证书:

    默认 CN父级 CAO (位于 Subject 中)类型主机 (SAN)
    kube-etcdetcd-caserver, clientlocalhost, 127.0.0.1
    kube-etcd-peeretcd-caserver, client<hostname>, <Host_IP>, localhost,
    kube-etcd-healthcheck-clientetcd-caclient
    kube-apiserver-etcd-clientetcd-casystem:mastersclient
    kube-apiserverkubernetes-caserver<hostname>, <Host_IP>, <advertise_IP>, [1]
    kube-apiserver-kubelet-clientkubernetes-casystem:mastersclient
    front-proxy-clientkubernetes-front-proxy-caclient

    [1]: 用来连接到集群的不同 IP 或 DNS 名 (就像 kubeadm 为负载均衡所使用的固定 IP 或 DNS 名,kuberneteskubernetes.defaultkubernetes.default.svckubernetes.default.svc.cluster、)。

    其中,kind 对应一种或多种类型的 :

    证书应放置在建议的路径中(以便 kubeadm使用)。无论使用什么位置,都应使用给定的参数指定路径。

    默认 CN建议的密钥路径建议的证书路径命令密钥参数证书参数
    etcd-caetcd/ca.keyetcd/ca.crtkube-apiserver—etcd-cafile
    kube-apiserver-etcd-clientapiserver-etcd-client.keyapiserver-etcd-client.crtkube-apiserver—etcd-keyfile—etcd-certfile
    kubernetes-caca.keyca.crtkube-apiserver—client-ca-file
    kubernetes-caca.keyca.crtkube-controller-manager—cluster-signing-key-file—client-ca-file, —root-ca-file, —cluster-signing-cert-file
    kube-apiserverapiserver.keyapiserver.crtkube-apiserver—tls-private-key-file—tls-cert-file
    kube-apiserver-kubelet-clientapiserver-kubelet-client.keyapiserver-kubelet-client.crtkube-apiserver—kubelet-client-key—kubelet-client-certificate
    front-proxy-cafront-proxy-ca.keyfront-proxy-ca.crtkube-apiserver—requestheader-client-ca-file
    front-proxy-cafront-proxy-ca.keyfront-proxy-ca.crtkube-controller-manager—requestheader-client-ca-file
    front-proxy-clientfront-proxy-client.keyfront-proxy-client.crtkube-apiserver—proxy-client-key-file—proxy-client-cert-file
    etcd-caetcd/ca.keyetcd/ca.crtetcd—trusted-ca-file, —peer-trusted-ca-file
    kube-etcdetcd/server.keyetcd/server.crtetcd—key-file—cert-file
    kube-etcd-peeretcd/peer.keyetcd/peer.crtetcd—peer-key-file—peer-cert-file
    etcd-caetcd/ca.crtetcdctl—cacert
    kube-etcd-healthcheck-clientetcd/healthcheck-client.keyetcd/healthcheck-client.crtetcdctl—key—cert

    注意事项同样适用于服务帐户密钥对:

    你必须手动配置以下管理员帐户和服务帐户:

    文件名凭据名称默认 CNO (位于 Subject 中)
    admin.confdefault-adminkubernetes-adminsystem:masters
    kubelet.confdefault-authsystem:node:<nodeName> (参阅注释)system:nodes
    controller-manager.confdefault-controller-managersystem:kube-controller-manager
    scheduler.confdefault-schedulersystem:kube-scheduler
    1. 为每个配置运行下面的 kubectl 命令:

    这些文件用途如下: