配置 Kubernetes API 服务器以连接到单独的 TLS 安全 etcd 集群,每个成员都有自己独特的公共证书

配置 Kubernetes API 服务器以连接到单独的 TLS 安全 etcd 集群,每个成员都有自己独特的公共证书

我在不使用 Google 云的情况下遵循 Kubernetes 的艰难方式,而是使用容器 Linux 和单独的 etcd 集群(该集群不存在于 API 服务器所在的控制平面的控制器节点上)。

环境如下:

etcd01,,etcd02etcd03

controller01,,controller02controller03

worker01,,worker02worker03

每个 etcd 成员都有自己独特的公共证书,该证书etcd{01,02,03}.lab.com.crt以自己独特的主题备用名称和通用名称命名,并且控制器主机的 API 服务器在每台机器上都有一个证书,它们都共享这个证书(api-server.crt)。

按照 Kubernetes 艰难之路的说明,在“Kubernetes API 服务器证书",他创建了以下证书:

kubernetes-key.pem
kubernetes.pem

在 ”配置 etcd 服务器“,他在配置中使用这两个证书,目的是在控制器本身上托管 etcd 实例。

[Service]
ExecStart=/usr/local/bin/etcd \\
  --name ${ETCD_NAME} \\
  --cert-file=/etc/etcd/kubernetes.pem \\
  --key-file=/etc/etcd/kubernetes-key.pem \\
  --peer-cert-file=/etc/etcd/kubernetes.pem \\
  --peer-key-file=/etc/etcd/kubernetes-key.pem \\
  --trusted-ca-file=/etc/etcd/ca.pem \\
  --peer-trusted-ca-file=/etc/etcd/ca.pem \\
  --peer-client-cert-auth \\
  --client-cert-auth \\
  --initial-advertise-peer-urls https://${INTERNAL_IP}:2380 \\
  --listen-peer-urls https://${INTERNAL_IP}:2380 \\
  --listen-client-urls https://${INTERNAL_IP}:2379,https://127.0.0.1:2379 \\
  --advertise-client-urls https://${INTERNAL_IP}:2379 \\
  --initial-cluster-token etcd-cluster-0 \\
  --initial-cluster controller-0=https://10.240.0.10:2380,controller-1=https://10.240.0.11:2380,controller-2=https://10.240.0.12:2380 \\
  --initial-cluster-state new \\
  --data-dir=/var/lib/etcd

以下是他在“中使用的配置”配置 Kubernetes API 服务器“对于 API 服务器,使用与之前提到的相同的证书:

[Service]
ExecStart=/usr/local/bin/kube-apiserver \\
  --advertise-address=${INTERNAL_IP} \\
  --allow-privileged=true \\
  --apiserver-count=3 \\
  --audit-log-maxage=30 \\
  --audit-log-maxbackup=3 \\
  --audit-log-maxsize=100 \\
  --audit-log-path=/var/log/audit.log \\
  --authorization-mode=Node,RBAC \\
  --bind-address=0.0.0.0 \\
  --client-ca-file=/var/lib/kubernetes/ca.pem \\
  --enable-admission-plugins=Initializers,NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota \\
  --enable-swagger-ui=true \\
  --etcd-cafile=/var/lib/kubernetes/ca.pem \\
  --etcd-certfile=/var/lib/kubernetes/kubernetes.pem \\
  --etcd-keyfile=/var/lib/kubernetes/kubernetes-key.pem \\
  --etcd-servers=https://10.240.0.10:2379,https://10.240.0.11:2379,https://10.240.0.12:2379 \\
  --event-ttl=1h \\
  --experimental-encryption-provider-config=/var/lib/kubernetes/encryption-config.yaml \\
  --kubelet-certificate-authority=/var/lib/kubernetes/ca.pem \\
  --kubelet-client-certificate=/var/lib/kubernetes/kubernetes.pem \\
  --kubelet-client-key=/var/lib/kubernetes/kubernetes-key.pem \\
  --kubelet-https=true \\
  --runtime-config=api/all \\
  --service-account-key-file=/var/lib/kubernetes/service-account.pem \\
  --service-cluster-ip-range=10.32.0.0/24 \\
  --service-node-port-range=30000-32767 \\
  --tls-cert-file=/var/lib/kubernetes/kubernetes.pem \\
  --tls-private-key-file=/var/lib/kubernetes/kubernetes-key.pem \\
  --v=2
Restart=on-failure
RestartSec=5

在查找Kubernetes API 服务器关于配置选项--etcd-certfile,它指出:

string: SSL certification file used to secure etcd communication.

如果每个 etcd 成员都有相同的证书,那么这很好,但是当每个 etcd 成员都有自己的具有不同名称的证书文件(包括唯一的主题备用名称和通用名称)时,我该如何实现这一点?

相关内容