此处的设置是通过Kelsey Hightower的Kubernetes the Hard Way创建的。因此,如果您按照此步骤进行操作,请进行所有设置,直到执行Bootstrapping Kubernetes Worker Nodes步骤。
在这种情况下,请不要启动kubelet
,而是启动其他服务containerd
和kube-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
现在我们有了这个文件,将以下标志添加到kubelet
systemd服务文件。
--bootstrap-kubeconfig=/home/vagrant/bootstrap.kubeconfig
--kubeconfig=/home/vagrant/kubeconfig
--rotate-certificates=true
--rotate-server-certificates=true
提供之前生成bootstrap.kubeconfig
的路径。即使kubeconfig
仍然没有提供kubelet
允许写入的路径。kubelet
将为您创建此文件。
因此,我的kubelet
systemd文件如下所示:
设置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/