在 Kubernetes 集群中,为了保证通信的安全,需要使用证书进行认证和加密。证书管理是 Kubernetes 集群中比较重要的一部分。在本篇文章中,我们将深入介绍如何在 Kubernetes 中管理集群证书,包括生成证书、更新证书、证书续订等操作。
生成证书
在 Kubernetes 中生成证书一般采用自签证书的方式,即自己颁发证书。首先需要创建一个 CA(Certificate Authority) 证书,然后使用 CA 证书颁发 kube-api-server、kubelet 等组件的证书。下面是生成证书的具体步骤。
创建 CA 证书
首先,在生成 CA 证书的机器上,创建一个目录并进入目录中:
mkdir -p ~/certs && cd ~/certs
创建一个 OpenSSL 的配置文件 ca-config.json,用于生成 CA 证书:
// javascriptcn.com 代码示例 { "signing": { "default": { "expiry": "8760h" }, "profiles": { "kubernetes": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "8760h" } } } }
其中 signing.profile.kubernetes.usages
字段表示该 CA 证书可以用来签署身份认证、服务端认证和客户端认证证书。
创建 OpenSSL 的配置文件 ca-csr.json,用于生成 CA 证书的签发请求:
// javascriptcn.com 代码示例 { "CN": "Kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Shenzhen", "O": "Kubernetes", "OU": "CA", "ST": "Guangdong" } ] }
其中 names.OU
字段表示部门名称,CN
字段表示证书名称。
生成 CA 证书和私钥:
openssl genrsa -out ca-key.pem 2048 openssl req -new -key ca-key.pem -out ca.csr -config ca-csr.json openssl x509 -req -in ca.csr -signkey ca-key.pem -out ca.pem -days 3650 -extensions v3_ca -extfile ca-config.json
其中最后一行 -extensions v3_ca -extfile ca-config.json
表示使用 ca-config.json 配置文件中的配置生成证书。
创建 kube-api-server 证书
kube-api-server 是 Kubernetes 中最主要的组件之一,所有的 API 访问都会经过它,因此它的证书必须要由 CA 颁发。下面是生成 kube-api-server 证书的具体步骤。
创建 OpenSSL 的配置文件 apiserver-csr.json,用于生成 kube-api-server 证书的签发请求:
// javascriptcn.com 代码示例 { "CN": "kube-apiserver", "hosts": [ "127.0.0.1", "192.168.0.100", "kubernetes", "kubernetes.default", "kubernetes.default.svc", "kubernetes.default.svc.cluster", "kubernetes.default.svc.cluster.local" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Shenzhen", "O": "Kubernetes", "OU": "kube-api-server", "ST": "Guangdong" } ] }
其中 hosts
字段表示 kube-api-server 可以使用的主机名。
生成 kube-api-server 证书和私钥:
openssl genrsa -out apiserver-key.pem 2048 openssl req -new -key apiserver-key.pem -out apiserver.csr -config apiserver-csr.json openssl x509 -req -in apiserver.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out apiserver.pem -days 3650 -extensions v3_req -extfile ca-config.json
其中最后一行 -extensions v3_req -extfile ca-config.json
表示使用 ca-config.json 配置文件中的配置生成证书。
创建 kubelet 证书
kubelet 是 Kubernetes 中运行在 Node 节点上的组件,它负责管理 Node 上的容器。下面是生成 kubelet 证书的具体步骤。
创建 OpenSSL 的配置文件 kubelet-csr.json,用于生成 kubelet 证书的签发请求:
// javascriptcn.com 代码示例 { "CN": "system:node:node01", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Shenzhen", "O": "system:nodes", "OU": "kubelet", "ST": "Guangdong" } ] }
其中 CN
字段是在 Kubernetes 中的 Node 的名称。
生成 kubelet 证书和私钥:
openssl genrsa -out kubelet-key.pem 2048 openssl req -new -key kubelet-key.pem -out kubelet.csr -config kubelet-csr.json openssl x509 -req -in kubelet.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out kubelet.pem -days 3650 -extensions v3_req -extfile ca-config.json
颁发证书
在证书生成后,将 kube-api-server.pem、kube-api-server-key.pem、kubelet.pem、kubelet-key.pem、ca.pem 复制到对应的目录中即可。下面是复制命令:
mkdir /etc/kubernetes/certs cp ca.pem /etc/kubernetes/certs/ cp apiserver.pem /etc/kubernetes/certs/ cp apiserver-key.pem /etc/kubernetes/certs/ cp kubelet.pem /etc/kubernetes/certs/ cp kubelet-key.pem /etc/kubernetes/certs/
更新证书
当证书过期或是需要更新证书时,需要重新生成证书并在集群中更新证书。下面是更新证书的具体步骤。
首先,重新生成对应的证书,然后将新的证书和私钥复制到对应的目录中。
然后,重启组件,使其使用新的证书。下面是重启命令:
systemctl restart kube-apiserver kube-controller-manager kube-scheduler systemctl restart kubelet
在更新证书时,需要注意不能使用 kubeadm init
命令重新初始化集群,否则会将集群销毁,需要重新安装集群。
证书续订
证书有一定的有效期,过期后需要重新生成证书。对于 Kubernetes 集群证书,可以使用 cert-manager 进行自动续订,避免证书过期。
cert-manager 可以通过简单的配置,为 Kubernetes 集群管理证书,并可以在到期前自动进行证书续订,简化了证书管理的过程。如果要了解更多关于 cert-manager 的信息,请参考官方文档。
总结
本文主要介绍了如何在 Kubernetes 集群中管理集群证书,包括生成证书、更新证书和证书续订等操作。证书管理是 Kubernetes 集群中比较重要的一部分,需要掌握好。如果您有其他问题,可以参阅相关文档,也可以在 Kubernetes 官方社区寻求帮助。
附:kubernetes 证书保管类脚本
// javascriptcn.com 代码示例 #!/bin/bash COMPONENT=$1 KUBE_CONFIG_FILE=$2 if [[ -z $COMPONENT ]] then echo "Component name must be provided" exit 1 fi if [[ -z $KUBE_CONFIG_FILE ]] then echo "Kubeconfig file must be provided" exit 1 fi CSR_NAME=$COMPONENT-csr NAMESPACE=kube-system TMP_DIR=$(mktemp -d) CERTS_DIR=certs/$COMPONENT mkdir -p $CERTS_DIR cat <<EOF >$TMP_DIR/$CSR_NAME-csr.json { "CN": "$COMPONENT", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Shenzhen", "O": "Kubernetes", "OU": "System" } ] } EOF kubectl --kubeconfig=$KUBE_CONFIG_FILE \ create namespace $NAMESPACE kubectl --kubeconfig=$KUBE_CONFIG_FILE \ create -f $TMP_DIR/$CSR_NAME-csr.json sleep 1 CSR=$(kubectl --kubeconfig=$KUBE_CONFIG_FILE \ get csr $CSR_NAME \ -n $NAMESPACE \ -o jsonpath='{.spec.request}') echo $CSR | base64 -d > $TMP_DIR/$CSR_NAME.csr ca_bundle=$(kubectl --kubeconfig=$KUBE_CONFIG_FILE \ config view --raw \ -o jsonpath='{.clusters[0].cluster.certificate-authority-data}') cat <<EOF >$TMP_DIR/approve-csr.yaml apiVersion: certificates.k8s.io/v1 kind: CertificateSigningRequest metadata: name: $CSR_NAME namespace: $NAMESPACE spec: groups: - system:authenticated request: $(cat $TMP_DIR/$CSR_NAME.csr | base64 | tr -d '\n') usages: - digital signature - key encipherment - server auth EOF kubectl --kubeconfig=$KUBE_CONFIG_FILE \ create -f $TMP_DIR/approve-csr.yaml sleep 1 CERT=$(kubectl --kubeconfig=$KUBE_CONFIG_FILE \ get csr $CSR_NAME \ -n $NAMESPACE \ -o jsonpath='{.status.certificate}') echo $CERT | base64 -d > $CERTS_DIR/tls.crt kubectl --kubeconfig=$KUBE_CONFIG_FILE \ patch secret $COMPONENT-tls \ -n $NAMESPACE \ --type='json' \ -p='[{"op": "add", "path": "/data/tls.crt", "value":"'$(base64 $CERTS_DIR/tls.crt)'"},{"op": "add", "path": "/data/tls.key", "value":"'$(base64 $CERTS_DIR/tls.key)'"},{"op":"add", "path":"/type", "value":"kubernetes.io/tls"}]' > /dev/null kubectl --kubeconfig=$KUBE_CONFIG_FILE \ delete csr $CSR_NAME \ -n $NAMESPACE > /dev/null kubectl --kubeconfig=$KUBE_CONFIG_FILE \ delete -f $TMP_DIR/$CSR_NAME-csr.json > /dev/null kubectl --kubeconfig=$KUBE_CONFIG_FILE \ delete -f $TMP_DIR/approve-csr.yaml > /dev/null
将以上脚本保存为 bash 文件,并且添加sudo权限后使用即可。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653a608a7d4982a6eb45e74f