接下來兩個章節是部署Kube-Node相關的服務,包含:kubelet,kube-proxy。node
# kubelet採用TLS Bootstrapping 機制,自動完成到kube-apiserver的註冊,在node節點量較大或者後期自動擴容時很是有用。 # kubelet 啓動時向 kube-apiserver 發送 TLS bootstrapping 請求,須要先將 bootstrap token 文件中的 kubelet-bootstrap 用戶賦予ClusterRole system:node-bootstrapper 角色(經過kubectl get clusterroles可查詢),而後 kubelet 纔有權限建立認證請求,經過建立ClusterRoleBinding可實現; # --user=kubelet-bootstrap 指定用戶名,這裏即文件 /etc/kubernetes/bootstrap/token.csv (前文建立)中指定的用戶名,同時也須要寫入kubeconfig文件 /etc/kubernetes/bootstrap.kubeconfig; [root@kubenode1 ~]# kubectl create clusterrolebinding kubelet-bootstrap \ --clusterrole=system:node-bootstrapper \ --user=kubelet-bootstrap
# ClusterRoleBinding:kubelet-bootstrap建立成功 [root@kubenode1 ~]# kubectl get clusterrolebinding
[root@kubenode1 ~]# cd /etc/kubernetes/bootstrap/ # 配置集羣參數; # --embed-certs:設置爲 true 表示將 certificate-authority 證書寫入到生成的 bootstrap.kubeconfig 文件中 [root@kubenode1 bootstrap]# kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server=https://172.30.200.10:6443 \ --kubeconfig=bootstrap.kubeconfig # 配置客戶端認證參數; # 認證用戶爲前文token.csv文件中的「kubelet-bootstrap」; # 指定token,前文中已設定的token的環境變量,證書與私鑰由kube-apiserver在kubeler首次註冊是自動生成 [root@kubenode1 bootstrap]# kubectl config set-credentials kubelet-bootstrap \ --token=${BOOTSTRAP_TOKEN} \ --kubeconfig=bootstrap.kubeconfig # 配置上下文參數 [root@kubenode1 bootstrap]# kubectl config set-context default \ --cluster=kubernetes \ --user=kubelet-bootstrap \ --kubeconfig=bootstrap.kubeconfig # 配置默認上下文 [root@kubenode1 bootstrap]# kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
# 分發bootstrap.kubeconfig到全部node節點 [root@kubenode1 bootstrap]# scp bootstrap.kubeconfig root@172.30.200.22:/etc/kubernetes/bootstrap/ [root@kubenode1 bootstrap]# scp bootstrap.kubeconfig root@172.30.200.23:/etc/kubernetes/bootstrap/
相關可執行文件在部署kubectl時已部署完成。git
# kubelet依賴於docker.service服務,在其啓動以後啓動; # 可經過ExecStartPost設置iptables開放tcp 4194端口,爲cAdvisor作準備 [root@kubenode1 ~]# touch /usr/lib/systemd/system/kubelet.service [root@kubenode1 ~]# vim /usr/lib/systemd/system/kubelet.service [Unit] Description=Kubernetes Kubelet Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=docker.service Requires=docker.service [Service] WorkingDirectory=/var/lib/kubelet EnvironmentFile=/usr/local/kubernetes/kubelet.conf ExecStart=/usr/local/kubernetes/bin/kubelet $KUBELET_ARGS Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target # 建立工做目錄 [root@kubenode1 ~]# mkdir -p /var/lib/kubelet # 配置啓動參數文件; # --address:綁定主機ip地址,默認值」0.0.0.0」表示使用所有網絡接口; # --hostname-override:設置node在集羣中的主機名,默認使用主機hostname;若是設置了此項參數,kube-proxy服務也須要設置此項參數; # --pod-infra-container-image:用於Pod內namespace共享的基礎pause鏡像,默認值即」 gcr.io/google_containers/pause-amd64:3.0」;建議節點上提早pull相關鏡像以提高部署效率; # --bootstrap-kubeconfig:kubelet首次啓動在沒有客戶端證書文件時,將使用指定的kubeconfig配置到kube-apiserver獲取客戶端證書;經過csr請求,成功獲取後在--kubeconfig指定的路徑生成kubeconfig文件;證書與私鑰文件將被保存到--cert-dir指定的目錄下; # --cluster-dns:指定集羣內dns服務器,以逗號分隔;kubelet在新建立的Pod中設DNS域名解析配置文件/etc/resolv.conf文件,寫入nameserver與search配置; # --cluster-domain:集羣內dns服務器域名; # --allow-privileged:是否容許以特權模式啓動容器,默認false; # --serialize-image-pulls:按順序pull鏡像,默認值true; # --fail-swap-on=false:若是節點開啓了swap,節點不能啓動kubelet服務,默認值true,在v1.8.x與v1.9.x版本時注意 [root@kubenode1 ~]# touch /usr/local/kubernetes/kubelet.conf [root@kubenode1 ~]# vim /usr/local/kubernetes/kubelet.conf KUBELET_ARGS="--address=172.30.200.21 \ --hostname-override=172.30.200.21 \ --pod-infra-container-image=gcr.io/google_containers/pause-amd64:3.0 \ --bootstrap-kubeconfig=/etc/kubernetes/bootstrap/bootstrap.kubeconfig \ --kubeconfig=/etc/kubernetes/bootstrap/kubelet.kubeconfig \ --cert-dir=/etc/kubernetes/bootstrap \ --cluster-dns=169.169.0.11 \ --cluster-domain=cluster.local. \ --allow-privileged=true \ --serialize-image-pulls=false \ --fail-swap-on=false \ --logtostderr=false \ --log-dir=/var/log/kubernetes/kubelet \ --v=2" # 建立日誌目錄 [root@kubenode1 ~]# mkdir -p /var/log/kubernetes/kubelet
[root@kubenode1 ~]# systemctl daemon-reload [root@kubenode1 ~]# systemctl enable kubelet [root@kubenode1 ~]# systemctl start kubelet [root@kubenode1 ~]# systemctl status kubelet
kubelet 首次啓動向 kube-apiserver 發送證書籤名請求,必須由 kubernetes 系統容許經過後,纔會將該 node 加入到集羣。github
以kubenode1爲例,其他節點相似。docker
# 查看未受權的csr請求,處於」Pending」狀態 [root@kubenode1 ~]# kubectl get csr
# 經過csr請求,狀態變動爲」Approved, Issued」; # 集羣節點已「Ready」 [root@kubenode1 ~]# kubectl certificate approve node-csr-Gl5zdgp6IZYQBAV1S59vXDZzHbirH9qDMb0xHaDnDIA [root@kubenode1 ~]# kubectl get nodes
# 在指定的目錄,可查詢自動生成的kubelet證書,私鑰及kubeconfig文件等; [root@kubenode1 ~]# ll /etc/kubernetes/bootstrap/