TLS Bootstraping:在kubernetes集群中,Node上組件kebelet和kube-proxy都需要與kube-apiserver進行通信,為了增加傳輸安全性,采用https方式,
這就涉及到node組件需要具備kube-apiserver用的證書頒發機構CA簽發客戶端證書,當規模較大時,這種客戶端證書頒發需要大量工作,同時也會增加集群擴展復雜度。
為了簡化流程,kubernetes引入了TLS bootstraping機制來自動頒發客戶端證書,所以強烈建議在node上使用這種方式
具體實現步驟有5步
前提是已經存在二進制環境的集群
1、kube-apiserver啟用bootstrap Token (master操作)
--enable-bootstrap-token-auth=true (必須啟用)
查看的文件路徑:
1:ps -ef | grep kube-apiserver #查找到安裝路徑
2:確認system守護文件:cat /usr/lib/systemd/system/kube-apiserver.service
EnvironmentFile就是配置文件的位置,找到配置文件位置后查看是否有
--enable-bootstrap-token-auth=true 這個選項或者啟用狀態
2、使用Secret存儲Bootstrap Token
Bootstrap Token值格式:07401b.f395accd246ae52d (左邊是token,右邊是Token Secret)
生成token ID方式:
head -c 16 /dev/urandom | od -An -t x | tr -d ' '
cat secret-token.yaml
apiVersion: v1 kind: Secret metadata: name: bootstrap-token-07401b namespace: kube-system type: bootstrap.kubernetes.io/token stringData: description: "The default bootstrap token generated by 'kubeadm init'." token-id: 07401b token-secret: f395accd246ae52d expiration: 2020-10-10T03:22:11Z #token id 過期時間,當前時間往后推 usage-bootstrap-authentication: "true" usage-bootstrap-signing: "true" auth-extra-groups: system:bootstrappers:worker,system:bootstrappers:ingress
生效清單文件
kubectl apply -f secret-token.yaml kubectl get secret -n kube-system
3、創建RBAC角色綁定,運行kubelet bootstrap創建CSR請求
4、kubelet配置Bootstrap kubeconfig文件
5、查看申請和批准
kubectl get csr kubectl certificate approve xxx
3-5一起操作
master操作
創建認證授權清單文件
cat bootstrap.yaml
# enable bootstrapping nodes to create CSR apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: create-csrs-for-bootstrapping subjects: - kind: Group name: system:bootstrappers apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: system:node-bootstrapper apiGroup: rbac.authorization.k8s.io
生效認證清單文件
kubectl apply -f bootstrap.yaml
node操作
相關系統優化
純凈的系統,優化相關參數,關閉防火牆、selinux、docker(加速)、關閉swap等
1、時間同步
echo "#time sync by fage at 2019-7-22" >>/var/spool/cron/root
echo "*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1" >>/var/spool/cron/root
systemctl restart crond.service
2、關閉防火牆和selinux
systemctl stop firewalld systemctl disable firewalld setenforce 0 && sed -i s#SELINUX=enforcing#SELINUX=disable#g /etc/selinux/config
3、更改主機名
hostname k8s-node-3 echo " k8s-node-3" >/etc/hostname
4、更改hosts文件
cat >/etc/hosts <<EOF 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.10.160 k8s-master-1 192.168.10.161 k8s-node-1 192.168.10.162 k8s-node-2 192.168.10.163 k8s-node-3 EOF
5、節點node要禁用swap設備 不禁用要配置聲明
swapoff -a sed -i "s@/dev/mapper/centos-swap swap@#/dev/mapper/centos-swap swap@g" /etc/fstab
6、將橋接的IPv4流量傳遞到iptables的鏈
cat > /etc/sysctl.d/k8s.conf << EOF net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system #生效配置
安裝docker
方法一:yum方式安裝
yum install -y docker mkdir -p /etc/docker cat > /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] } EOF systemctl daemon-reload && systemctl start docker.service && systemctl enable docker.service
方法二:二進制方式
在部署好的機器上直接復制新增加的節點上,沒有就下載軟件包或者選擇yum安裝
scp -r /usr/lib/systemd/system/docker.service root@192.168.10.163:/usr/lib/systemd/system/ cd /usr/bin/ scp -r containerd containerd-shim docker dockerd docker-init docker-proxy runc root@192.168.10.163:/usr/bin/ scp -r /etc/docker root@192.168.10.163:/etc/ systemctl daemon-reload && systemctl start docker.service && systemctl enable docker.service
其他部署好的node上操作:拷貝節點kubelet、CNI、kube-proxy組件到節點
scp -r /opt/kubernetes/ root@192.168.10.163:/opt/ scp -r /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@192.168.10.163:/usr/lib/systemd/system/ scp -r /opt/cni/ root@192.168.10.163:/opt
新部署的node操作:
需要刪除kubelet的相關配置文件,kubelet的證書會自動頒發,每個節點上的證書都不一樣,kubelet.kubeconfig自動生成,bootstrap.kubeconfig需要重新生成
rm -f /opt/kubernetes/ssl/kube* cd /opt/kubernetes/cfg/ && rm -f kubelet.kubeconfig bootstrap.kubeconfig
更改指向master地址、主機名
sed -i "s#k8s-master#k8s-node-3#g" /opt/kubernetes/cfg/kubelet.conf sed -i "s#k8s-master#k8s-node-3#g" /opt/kubernetes/cfg/kube-proxy-config.yml
創建bootstrap
cat >/opt/kubernetes/cfg/bootstrap.kubeconfig <<EOF apiVersion: v1 kind: Config clusters: - cluster: certificate-authority: /opt/kubernetes/ssl/ca.pem server: https://192.168.10.160:6443 name: bootstrap contexts: - context: cluster: bootstrap user: kubelet-bootstrap name: bootstrap current-context: bootstrap preferences: {} users: - name: kubelet-bootstrap user: token: 07401b.f395accd246ae52d EOF
需要重啟docker和kubelet
systemctl restart docker.service systemctl start kubelet && systemctl enable kubelet systemctl start kube-proxy && systemctl enable kube-proxy
master操作:驗證配置、批准加入
kubectl get csr #查詢到最新的頒發請求,復制這個請求 kubectl certificate approve node-csr-xxxxxxxxxxxxx #批准頒發證書 kubectl get nodes # 會自動安裝cni網絡插件,安裝完成后就會就緒了
至此node節點加入完成