通过cert-rotate将新节点添加到K8S集群

此处的设置是通过Kelsey Hightower的Kubernetes the Hard Way创建的。因此,如果您按照此步骤进行操作,请进行所有设置,直到执行Bootstrapping Kubernetes Worker Nodes步骤。

在这种情况下,请不要启动kubelet,而是启动其他服务containerdkube-proxy

创建Bootstrap Token

方式一

按照TLS Bootstrapping的文档,我们首先创建 token 认证文件。创建一个具有以下内容的文件:

$ cat tokenfile 
02b50b05283e98dd0fd71db496ef01e8,kubelet-bootstrap,10001,"system:bootstrappers"

您应该通过运行以下命令来创建尽可能随机的 token :

head -c 16 /dev/urandom | od -An -t x | tr -d ' '

现在我们需要告诉kube apiserver有关此文件的信息。因此,将以下标志添加到kube-apiserver服务文件中,并带有上标记文件的路径。

--token-auth-file=/home/vagrant/tokenfile

方式二

参考

cat > bootstrap-token-09426c.yaml <<EOF
apiVersion: v1
kind: Secret
metadata:
  # Name MUST be of form "bootstrap-token-<token id>"
  name: bootstrap-token-09426c
  namespace: kube-system

# Type MUST be 'bootstrap.kubernetes.io/token'
type: bootstrap.kubernetes.io/token
stringData:
  # Human readable description. Optional.
  description: "The default bootstrap token generated by 'kubeadm init'."

  # Token ID and secret. Required.
  token-id: 09426c
  token-secret: g262dkeidk3dx21x

  # Expiration. Optional.
  expiration: 2020-03-10T03:22:11Z

  # Allowed usages.
  usage-bootstrap-authentication: "true"
  usage-bootstrap-signing: "true"

  # Extra groups to authenticate the token as. Must start with "system:bootstrappers:"
  auth-extra-groups: system:bootstrappers:node03
EOF

master$ kubectl create -f bootstrap-token-09426c.yaml

主节点kube-apiserver配置

将该--client-ca-file=FILENAME添加到kube-apiserver命令以启用客户端证书认证,因此,我的kube-apiserver服务文件如下所示:

$ cat /etc/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes

[Service]
ExecStart=/usr/local/bin/kube-apiserver \
  --advertise-address=192.168.50.10 \
  --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://192.168.50.10: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 \
  --token-auth-file=/home/vagrant/tokenfile \
  --v=2
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

完成此操作后,只需运行以下命令即可重新启动apiserver:

sudo systemctl daemon-reload
sudo systemctl restart kube-apiserver
sudo systemctl status kube-apiserver

授权kubelet创建CSR

现在,节点已作为组system:bootstrappers的一部分进行身份验证,需要对其进行授权以创建证书签名请求(CSR)并在完成后取回它。

现在api-server也已重新启动,我们需要授予权限,以便我们的工作节点可以自动请求证书,为此,请运行以下命令:

# 授权节点kubelet创建CSR请求
kubectl create clusterrolebinding kubelet-bootstrap \
    --clusterrole=system:node-bootstrapper \
    --user=kubelet-bootstrap

kube-controller-manager配置

在apiserver接收来自kubelet的证书请求并对它们进行身份验证时,kube-controller-manager负责发布实际的签名证书。

为了使kube-controller-manager可以对证书进行签名,需要以下内容:

  • 访问您创建或者分发的“ Kubernetes CA密钥和证书”
  • 批准CSR

访问密钥和证书

确保kube-controller-manager有如下配置信息:

更改kube-controller-manager设置。添加以下参数:

--controllers=*,bootstrapsigner,tokencleaner
这是一种删除签署了ConfigMap的撤销令牌的设置。
--cluster-signing-cert-file=/var/lib/kubernetes/ca.pem
指定用于颁发群集范围证书的证书路径。
--cluster-signing-key-file=/var/lib/kubernetes/ca-key.pem
指定用于签名集群范围证书的私钥路径。
--experimental-cluster-signing-duration=8760h0m0s
指定签名证书的有效期。默认值为8760h0m0s(365天)。在验证环境中,将其设置为0h30m0s以快速确认证书已更新。

将Kubernetes CA密钥和证书提供给kube-controller-manager,请使用以下标志:

--cluster-signing-cert-file="/etc/path/to/kubernetes/ca/ca.crt" --cluster-signing-key-file="/etc/path/to/kubernetes/ca/ca.key"

例如:

--cluster-signing-cert-file="/var/lib/kubernetes/ca.pem" --cluster-signing-key-file="/var/lib/kubernetes/ca-key.pem"

签名证书的有效期限可以使用以下标志配置:

--experimental-cluster-signing-duration

批准CSR

# Approve all CSRs for the group "system:bootstrappers"
# 批准CSR请求
kubectl create clusterrolebinding node-client-auto-approve-csr \
    --clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient \
    --group=system:node-bootstrappers
# Approve renewal CSRs for the group "system:nodes"
# 更新CSR请求
kubectl create clusterrolebinding node-client-auto-renew-crt \
    --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeclient \
    --group=system:nodes

工作节点kubelet配置

首先,创建一个被kubelet 使用的bootstrap kubeconfig文件。运行以下命令来创建它。

考试中使用kubectl config set-cluster -h 查看命令使用

# cluster(集群信息、访问方式、CA等)
# I have used the ip address of my api-server use yours
kubectl config set-cluster kthw \
  --certificate-authority=ca.pem \
  --embed-certs=true \
  --server=https://192.168.50.10:6443 \
  --kubeconfig=/home/vagrant/bootstrap.kubeconfig

# user(cluster、user、ns映射关系)
# this token is above generated
kubectl config set-credentials kubelet-bootstrap \
  --token=02b50b05283e98dd0fd71db496ef01e8 \
  --kubeconfig=/home/vagrant/bootstrap.kubeconfig
# context(客户端认证凭据、token、password、证书等)
kubectl config set-context default \
  --cluster=kthw \
  --user kubelet-bootstrap \
  --kubeconfig=/home/vagrant/bootstrap.kubeconfig
# 切换上下文
kubectl config use-context default \
  --kubeconfig=/home/vagrant/bootstrap.kubeconfig 

现在我们有了这个文件,将以下标志添加到kubeletsystemd服务文件。

--bootstrap-kubeconfig=/home/vagrant/bootstrap.kubeconfig
--kubeconfig=/home/vagrant/kubeconfig
--rotate-certificates=true
--rotate-server-certificates=true

提供之前生成bootstrap.kubeconfig的路径。即使kubeconfig仍然没有提供kubelet允许写入的路径。kubelet将为您创建此文件。

因此,我的kubeletsystemd文件如下所示:

设置kubelet。指定以下参数:

--bootstrap-kubeconfig=/var/lib/kubelet/bootstrap-kubeconfig
指定先前创建的bootstrap-kubeconfig路径。
--cert-dir=/var/lib/kubelet/
指定保存自动生成的证书的位置。
--kubeconfig=/var/lib/kubelet/kubeconfig
指定保存自动生成的kubeconfig的位置。
--rotate-certificates=true
启用自动证书续订。到期日期临近时,它将自动更新。
$ cat /etc/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/kubernetes/kubernetes
After=containerd.service
Requires=containerd.service

[Service]
ExecStart=/usr/local/bin/kubelet \
  --bootstrap-kubeconfig=/home/vagrant/bootstrap.kubeconfig \
  --config=/var/lib/kubelet/kubelet-config.yaml \
  --container-runtime=remote \
  --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock \
  --image-pull-progress-deadline=2m \
  --kubeconfig=/home/vagrant/kubeconfig \
  --network-plugin=cni \
  --register-node=true \
  --rotate-certificates=true \
  --rotate-server-certificates=true \
  --v=2
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

而且KubeletConfiguration是这样的:

$ cat /var/lib/kubelet/kubelet-config.yaml
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
  anonymous:
    enabled: false
  webhook:
    enabled: true
  x509:
    clientCAFile: "/var/lib/kubernetes/ca.pem"
authorization:
  mode: Webhook
clusterDomain: "cluster.local"
clusterDNS:
  - "10.32.0.10"
podCIDR: "10.200.0.0/24"
resolvConf: "/run/systemd/resolve/resolv.conf"
runtimeRequestTimeout: "15m"

完成此操作后,只需运行以下命令即可重新启动kubelet:

sudo systemctl daemon-reload
sudo systemctl restart kubelet
sudo systemctl status kubelet

验证

主节点

列出节点已发出的请求:

$ kubectl get csr
NAME                                                   AGE   REQUESTOR           CONDITION
node-csr-WXnon3AEhdxgZ1FZ2reqKRQmWS-pwP3x263YbwUAH9k   11m   kubelet-bootstrap   Pending

同意该请求:

$ kubectl certificate approve node-csr-WXnon3AEhdxgZ1FZ2reqKRQmWS-pwP3x263YbwUAH9k
certificatesigningrequest.certificates.k8s.io/node-csr-WXnon3AEhdxgZ1FZ2reqKRQmWS-pwP3x263YbwUAH9k approved

现在,您可以看到已经创建了该节点,并且可以通过运行以下命令进行列出:

$ kubectl get nodes
NAME   STATUS   ROLES    AGE   VERSION
node   Ready    <none>   27s   v1.12.0

参考链接:
https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/

发布了389 篇原创文章 · 获赞 1041 · 访问量 163万+

猜你喜欢

转载自blog.csdn.net/fly910905/article/details/103466197