前面我們二進制部署K8S集群時,三台master節點僅僅作為集群管理節點,所以master節點上中並未部署docker、kubelet、kube-proxy等服務。后來我在部署mertics-server、istio組件服務時,發現無法正常運行,后來嘗試把master節點也加入集群進行調度,這些組件才能夠正常部署,並可以正確獲取集群資源。所以本篇文章主要介紹如何在已經部署好集群的master節點部署docker、kubelet、kube-proxy等服務。
注意:本篇文章操作是基於我之前部署集群時,沒有在master節點部署kubele、kube-proxy、docker等組件,若你的集群是kubeadm方式部署(默認已經部署這些組件),可以不關注此文章。
master節點部署與node節點部署方式基本一致,所以文章中涉及的證書及各配置文件都可以通用,詳情可以參考前面三個章節部署;
K8S從入門到放棄系列-(8)kube-apiserver 高可用配置
K8S從入門到放棄系列-(9)kubernetes集群之kubelet部署
K8S從入門到放棄系列-(10)kubernetes集群之kube-proxy部署
1、部署docker
## 設置存儲庫 [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'yum install -y yum-utils device-mapper-persistent-data lvm2' ## 添加yum源 [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo' ## 安裝指定版本docker [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'yum install docker-ce-18.09.5-3.el7 -y' ## 啟動 [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl enable docker' [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl start docker'
2、部署kubelet
對於在 master 節點啟動 kubelet 來說,不需要 nginx 做負載均衡;可以跳過nginx-proxy部署,直接進行kubelet、kube-proxy的安裝,並修改 kubelet.kubeconfig、kube-proxy.kubeconfig 中的 apiserver 地址為當前 master ip 6443 端口即可,我配置文件中是127.0.0.1:6443,無需修改。
## 把配置文件分發至各master節點
### bootstrap.kubeconfig
[root@k8s-master01 ~]# ansible k8s-master -m copy -a 'src=/root/bootstrap.kubeconfig dest=/etc/kubernetes/config/'
### kubelet.conf(別忘了修改參數中對應的主機名、IP地址、--node-labels選項)
[root@k8s-master01 ~]# ansible k8s-master -m copy -a 'src=/opt/k8s/cfg/kubelet.conf dest=/etc/kubernetes/config/'
### master節點設置taint
[root@k8s-master01 ~]# kubectl taint nodes k8s-master01 node-role.kubernetes.io/master=:NoSchedule
[root@k8s-master02 ~]# kubectl taint nodes k8s-master02 node-role.kubernetes.io/master=:NoSchedule
[root@k8s-master03 ~]# kubectl taint nodes k8s-master03 node-role.kubernetes.io/master=:NoSchedule
注意:kubelet.conf配置文件中--node-labels=node-role.kubernetes.io/k8s-node=true 這個選項,它的作用只是在 kubectl get node 時 ROLES 欄顯示是什么節點;
對於master節點需要修改為--node-labels=node-role.kubernetes.io/k8s-master=true,后面這個 node-role.kubernetes.io/master 是 kubeadm 用的,這個 label 會告訴 k8s 調度器當前節點為 master節點;
如果不想讓master節點參與到正常的pod調度,則需要對master進行打污點標簽,這樣master就不會有pod創建(pod創建時可以進行容忍度設置,這樣master還是可以進行pod調度)
### kubelet.service
[root@k8s-master01 ~]# ansible k8s-master -m copy -a 'src=/opt/k8s/unit/kubelet.service dest=/usr/lib/systemd/system/'
## 創建kubelet數據目錄
[root@k8s-master01 ~]# ansible k8s-master -m file -a 'path=/var/lib/kubelet state=directory'
## 啟動服務
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl daemon-reload'
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl enable kubelet'
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl start kubelet
## 查看未授權的csr請求
[root@k8s-master01 ~]# kubectl get csr
## 批准kubelet 的 TLS 證書請求
[root@k8s-master01 ~]# kubectl get csr|grep 'Pending' | awk 'NR>0{print $1}'| xargs kubectl certificate approve
## 查看各節點就緒狀態
### 需要等待一段時間,因為需要下載安裝網絡組件鏡像
[root@k8s-master01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready <none> 25h v1.14.1
k8s-master02 Ready <none> 25h v1.14.1
k8s-master03 Ready <none> 25h v1.14.1
k8s-node01 Ready <none> 10d v1.14.1
k8s-node02 Ready <none> 10d v1.14.1
2、kube-proxy部署
## 開啟ipvs [root@k8s-master01 ~]# ansible k8s-master -m shell -a "yum install -y ipvsadm ipset conntrack" [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'modprobe -- ip_vs' [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'modprobe -- ip_vs_rr' [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'modprobe -- ip_vs_wrr' [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'modprobe -- ip_vs_sh' [root@k8s-master01 ~]# ansible k8s-master -m shell -a 'modprobe -- nf_conntrack_ipv4'
## 分發kube-proxy證書文件
[root@k8s-master01 certs]# ansible k8s-master -m copy -a 'src=/opt/k8s/certs/kube-proxy-key.pem dest=/etc/kubernetes/ssl/'
[root@k8s-master01 certs]# ansible k8s-master -m copy -a 'src=/opt/k8s/certs/kube-proxy.pem dest=/etc/kubernetes/ssl/'
## kubeconfig
[root@k8s-master01 ~]# ansible k8s-master -m copy -a 'src=/root/kube-proxy.kubeconfig dest=/etc/kubernetes/config/'
## kube-proxy.conf配置文件(修改hostname-override字段所屬主機名)
[root@k8s-master01 ~]# ansible k8s-master -m copy -a 'src=/opt/k8s/cfg/kube-proxy.conf dest=/etc/kubernetes/config/'
## kube-proxy.service啟動腳本
[root@k8s-master01 ~]# ansible k8s-master -m copy -a 'src=/opt/k8s/unit/kube-proxy.service dest=/usr/lib/systemd/system/'
## 啟動
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl daemon-reload'
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl enable kube-proxy'
[root@k8s-master01 ~]# ansible k8s-master -m shell -a 'systemctl start kube-proxy'
總結:以上就是master節點部署kubelet、kube-proxy組件過程,以上有幾個關鍵點重新整理:
1、對於新安裝集群來說,建議在部署集群時就安裝三個服務,而不是集群部署后,遇到問題再進行部署。
2、master節點上kubelet.conf中--node-labels=node-role.kubernetes.io/k8s-node=true修改為--node-labels=node-role.kubernetes.io/k8s-master=true
3、master節點上,kubelet、kube-proxy直接與本地kube-apiserver通信即可,無需進行nginx負載均衡配置,及不需要部署nginx-proxy