我在不使用 Google 云的情况下遵循 Kubernetes 的艰难方式,而是使用容器 Linux 和单独的 etcd 集群(该集群不存在于 API 服务器所在的控制平面的控制器节点上)。
环境如下:
etcd01
,,etcd02
etcd03
controller01
,,controller02
controller03
worker01
,,worker02
worker03
每个 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 成员都有自己的具有不同名称的证书文件(包括唯一的主题备用名称和通用名称)时,我该如何实现这一点?