一 前置准備
1.1 互信配置
為了更方便遠程分發文件和執行命令,本實驗配置master節點到其它節點的 ssh 信任關系。
1 [root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@worker03
提示:本步驟操作僅需要在master01節點操作。
1.2 環境變量
后續使用的環境變量都定義在文件 environment.sh 中,同時拷貝到所有節點的 /opt/k8s/bin 目錄:
1 [root@master01 ~]# vi environment.sh #追加worker03相關信息
1 #!/bin/sh 2 #****************************************************************# 3 # ScriptName: environment.sh 4 # Author: xhy 5 # Create Date: 2020-06-27 22:19 6 # Modify Author: xhy 7 # Modify Date: 2020-06-27 22:19 8 # Version: 9 #***************************************************************# 10 # 集群 NODE IP 對應的主機名數組 11 export NODE_NAMES=(worker01 worker02 worker03) 12 13 # 集群所有機器 IP 數組 14 export ALL_IPS=(172.24.8.71 172.24.8.72 172.24.8.73 172.24.8.74 172.24.8.75 172.24.8.76) 15 16 # 集群所有IP 對應的主機名數組 17 export ALL_NAMES=(master01 master02 master03 worker01 worker02 worker03)
1 [root@master01 ~]# chmod u+x *.sh 2 [root@master01 ~]# source /root/environment.sh
1.3 分發並執行環境初始化
1 [root@master01 ~]# scp -rp k8sinit.sh root@worker03:/root/ 2 [root@master01 ~]# scp -rp /etc/hosts root@worker03:/etc/hosts 3 [root@master01 ~]# ssh root@worker03 "bash /root/k8sinit.sh"
提示:本步驟操作僅需要在master01節點操作。
二 證書分發
2.1 分發證書
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# ssh root@worker03 "mkdir -p /etc/kubernetes/cert" 3 [root@master01 work]# scp ca*.pem ca-config.json root@worker03:/etc/kubernetes/cert
提示:本步驟操作僅需要在master01節點操作。
三 部署docker
3.1 安裝和部署Docker
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# scp docker/* root@worker03:/opt/k8s/bin/ 3 [root@master01 work]# ssh root@worker03 "chmod +x /opt/k8s/bin/*"
提示:本步驟操作僅需要在master01節點操作。
3.2 分發Docker system
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# ssh root@worker03 "echo '/sbin/iptables -P FORWARD ACCEPT' >> /etc/rc.local" 3 [root@master01 work]# sed -i -e "s|##DOCKER_DIR##|${DOCKER_DIR}|" docker.service 4 [root@master01 work]# scp docker.service root@worker03:/etc/systemd/system/
提示:本步驟操作僅需要在master01節點操作。
3.3 分發Docker配置文件
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# ssh root@worker03 "mkdir -p /etc/docker/ ${DOCKER_DIR}/{data,exec}" 3 [root@master01 work]# scp docker-daemon.json root@worker03:/etc/docker/daemon.json
提示:本步驟操作僅需要在master01節點操作。
3.4 啟動Docker
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# ssh root@worker03 "systemctl daemon-reload && systemctl enable docker && systemctl restart docker"
提示:本步驟操作僅需要在master01節點操作。
3.5 檢查Docker服務
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# ssh root@worker03 "systemctl status docker|grep Active" 3 Active: active (running) since Sun 2020-06-28 23:57:10 CST; 22s ago
提示:本步驟操作僅需要在master01節點操作。
3.6 檢查Docker 0網橋
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# ssh root@worker03 "/usr/sbin/ip addr show docker0"
提示:本步驟操作僅需要在master01節點操作。
3.7 查看Docker信息
1 [root@master01 ~]# ssh root@worker03 "ps -elfH | grep docker | grep -v grep" 2 [root@master01 ~]# ssh root@worker03 "docker info"
提示:本步驟操作僅需要在master01節點操作。
四 部署flannel
4.1 分發flannel
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# scp flannel/{flanneld,mk-docker-opts.sh} root@worker03:/opt/k8s/bin/ 3 [root@master01 work]# ssh root@worker03 "chmod +x /opt/k8s/bin/*"
提示:本步驟操作僅需要在master01節點操作。
4.2 分發證書和私鑰
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# ssh root@worker03 "mkdir -p /etc/flanneld/cert" 3 [root@master01 work]# scp flanneld*.pem root@worker03:/etc/flanneld/cert
提示:本步驟操作僅需要在master01節點操作。
4.3 分發flannel systemd
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# scp flanneld.service root@worker03:/etc/systemd/system/
提示:本步驟操作僅需要在master01節點操作。
4.4 啟動flannel
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# ssh root@worker03 "systemctl daemon-reload && systemctl enable flanneld && systemctl restart flanneld"
提示:本步驟操作僅需要在master01節點操作。
4.5 檢查flannel啟動
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# ssh root@worker03 "systemctl status flanneld|grep Active" 3 Active: active (running) since Mon 2020-06-29 00:06:27 CST; 18s ago
提示:本步驟操作僅需要在master01節點操作。
4.6 檢查flannel網絡信息
1 [root@master01 ~]# ssh root@worker03 "/usr/sbin/ip addr show flannel.1 && /usr/sbin/ip addr show docker0"
提示:本步驟操作僅需要在master01節點操作。
4.7 驗證各節點flannel
在各節點上部署 flannel 后,檢查是否創建了 flannel 接口(名稱可能為 flannel0、flannel.0、flannel.1 等):
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# source /root/environment.sh 3 [root@master01 work]# ssh root@worker03 "/usr/sbin/ip addr show flannel.1 | grep -w inet" 4 inet 10.10.224.0/32 scope global flannel.1
在各節點上 ping 所有 flannel 接口 IP,確保能通:
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# source /root/environment.sh 3 [root@master01 work]# for all_ip in ${ALL_IPS[@]} 4 do 5 echo ">>> ${all_ip}" 6 ssh ${all_ip} "ping -c 1 10.10.224.0" 7 done
提示:本步驟操作僅需要在master01節點操作。
五 部署 kubelet
5.1 獲取kubelet
提示:master01節點已下載相應二進制,可直接分發至worker節點。
5.2 分發kubelet
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# scp kubernetes/server/bin/kubelet root@worker03:/opt/k8s/bin/ 3 [root@master01 work]# ssh root@worker03 "chmod +x /opt/k8s/bin/*"
提示:本步驟操作僅需要在master01節點操作。
5.3 分發kubeconfig
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# source /root/environment.sh 3 [root@master01 work]# export BOOTSTRAP_TOKEN=$(kubeadm token create \ 4 --description kubelet-bootstrap-token \ 5 --groups system:bootstrappers:worker03 \ 6 --kubeconfig ~/.kube/config) 7 [root@master01 work]# kubectl config set-cluster kubernetes \ 8 --certificate-authority=/etc/kubernetes/cert/ca.pem \ 9 --embed-certs=true \ 10 --server=${KUBE_APISERVER} \ 11 --kubeconfig=kubelet-bootstrap-worker03.kubeconfig 12 [root@master01 work]# kubectl config set-credentials kubelet-bootstrap \ 13 --token=${BOOTSTRAP_TOKEN} \ 14 --kubeconfig=kubelet-bootstrap-worker03.kubeconfig 15 [root@master01 work]# kubectl config set-context default \ 16 --cluster=kubernetes \ 17 --user=kubelet-bootstrap \ 18 --kubeconfig=kubelet-bootstrap-worker03.kubeconfig 19 [root@master01 work]# kubectl config use-context default --kubeconfig=kubelet-bootstrap-worker03.kubeconfig 20 [root@master01 work]# kubectl get secrets -n kube-system|grep bootstrap-token #查看各 token 關聯的 Secret
提示:本步驟操作僅需要在master01節點操作。
5.4 分發bootstrap kubeconfig
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# scp kubelet-bootstrap-worker03.kubeconfig root@worker03:/etc/kubernetes/kubelet-bootstrap.kubeconfig
提示:本步驟操作僅需要在master01節點操作。
5.5 分發kubelet 參數配置文件
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# source /root/environment.sh 3 [root@master01 work]# sed -e "s/##ALL_IP##/172.24.8.76/" kubelet-config.yaml.template > kubelet-config-172.24.8.76.yaml.template 4 [root@master01 work]# scp kubelet-config-172.24.8.76.yaml.template root@172.24.8.76:/etc/kubernetes/kubelet-config.yaml
提示:本步驟操作僅需要在master01節點操作。
5.6 分發kubelet systemd
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# source /root/environment.sh 3 [root@master01 work]# sed -e "s/##ALL_NAME##/worker03/" kubelet.service.template > kubelet-worker03.service 4 [root@master01 work]# scp kubelet-worker03.service root@worker03:/etc/systemd/system/kubelet.service
提示:本步驟操作僅需要在master01節點操作。
5.7 啟動kubelet
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# source /root/environment.sh 3 [root@master01 work]# ssh root@worker03 "mkdir -p ${K8S_DIR}/kubelet/kubelet-plugins/volume/exec/" 4 [root@master01 work]# ssh root@worker03 "/usr/sbin/swapoff -a" 5 [root@master01 work]# ssh root@worker03 "systemctl daemon-reload && systemctl enable kubelet && systemctl restart kubelet"
提示:本步驟操作僅需要在master01節點操作。
5.8 查看kubelet服務
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# source /root/environment.sh 3 [root@master01 work]# ssh root@worker03 "systemctl status kubelet" 4 [root@master01 work]# kubectl get csr 5 [root@master01 work]# kubectl get nodes
提示:本步驟操作僅需要在master01節點操作。
六 approve CSR 請求
6.1 查看 kubelet 的情況
1 [root@master01 work]# kubectl get csr | grep boot #等待一段時間(1-10 分鍾),三個節點的 CSR 都被自動 approved 2 [root@master01 work]# kubectl get nodes #所有節點均 ready
1 [root@master01 work]# ssh root@worker03 "ls -l /etc/kubernetes/kubelet.kubeconfig" 2 [root@master01 work]# ssh root@worker03 "ls -l /etc/kubernetes/cert/ | grep kubelet"
提示:本步驟操作僅需要在master01節點操作。
6.2 手動 approve server cert csr
基於安全性考慮,CSR approving controllers 不會自動 approve kubelet server 證書簽名請求,需要手動 approve。
1 [root@master01 work]# kubectl get csr | grep node | grep Pending 2 csr-hrfw7 3m4s kubernetes.io/kubelet-serving system:node:worker03 Pending 3 [root@master01 work]# kubectl get csr | grep Pending | awk '{print $1}' | xargs kubectl certificate approve 4 [root@master01 work]# ssh root@worker03 "ls -l /etc/kubernetes/cert/kubelet-*"
提示:本步驟操作僅需要在master01節點操作。
七 部署 kube-proxy
kube-proxy 運行在所有節點上,它監聽 apiserver 中 service 和 endpoint 的變化情況,創建路由規則以提供服務 IP 和負載均衡功能。
7.1 安裝kube-proxy
提示:master01 節點已下載相應二進制,可直接分發至node節點。
7.2 分發kube-proxy
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# scp kubernetes/server/bin/kube-proxy root@worker03:/opt/k8s/bin/ 3 [root@master01 work]# ssh root@worker03 "chmod +x /opt/k8s/bin/*"
提示:本步驟操作僅需要在master01節點操作。
7.3 分發kubeconfig
kube-proxy 使用 kubeconfig 文件訪問 apiserver,該文件提供了 apiserver 地址、嵌入的 CA 證書和 kube-proxy 證書:
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# scp kube-proxy.kubeconfig root@worker03:/etc/kubernetes/
提示:本步驟操作僅需要在master01節點操作。
7.4 分發配置文件
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# source /root/environment.sh 3 [root@master01 work]# sed -e "s/##ALL_NAME##/worker03/" -e "s/##ALL_IP##/172.24.8.76/" kube-proxy-config.yaml.template > kube-proxy-config-worker03.yaml.template 4 [root@master01 work]# scp kube-proxy-config-worker03.yaml.template root@worker03:/etc/kubernetes/kube-proxy-config.yaml
提示:本步驟操作僅需要在master01節點操作。
7.5 分發kube-proxy systemd
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# scp kube-proxy.service root@worker03:/etc/systemd/system/
提示:本步驟操作僅需要在master01節點操作。
7.6 啟動kube-proxy 服務
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# ssh root@worker03 "mkdir -p ${K8S_DIR}/kube-proxy" 3 [root@master01 work]# ssh root@worker03 "modprobe ip_vs_rr" 4 [root@master01 work]# ssh root@worker03 "systemctl daemon-reload && systemctl enable kube-proxy && systemctl restart kube-proxy"
提示:本步驟操作僅需要在master01節點操作。
7.7 檢查kube-proxy 服務
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# ssh root@worker03 "systemctl status kube-proxy | grep Active" 3 Active: active (running) since Mon 2020-06-29 00:34:32 CST; 24s ago
提示:本步驟操作僅需要在master01節點操作。
7.8 查看監聽端口
kube-proxy 監聽 10249 和 10256 端口:
- 10249:對外提供 /metrics;
- 10256:對外提供 /healthz 的訪問。
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# ssh root@worker03 "sudo netstat -lnpt | grep kube-prox"
提示:本步驟操作僅需要在master01節點操作。
7.9 查看ipvs 路由規則
1 [root@master01 ~]# cd /opt/k8s/work 2 [root@master01 work]# ssh root@worker03 "/usr/sbin/ipvsadm -ln"
提示:本步驟操作僅需要在master01節點操作。
可見所有通過 https 訪問 K8S SVC kubernetes 的請求都轉發到 kube-apiserver 節點的 6443 端口。
八 確認驗證
8.1 節點確認
1 [root@master01 ~]# kubectl get nodes -o wide
1 [root@master01 ~]# kubectl describe nodes worker03