目錄
?一、理論
1.K8S單Master架構
2.部署 master 組件
3.部署 Woker Node 組件
4.在master1節(jié)點上操作
5.在 node01 節(jié)點上操作
6.在 master01 節(jié)點上操作?
7.在 node01 節(jié)點上操作
8.node02 節(jié)點部署(方法一)
二、實驗
1.環(huán)境
?2.部署 master 組件
3.部署 Woker Node 組件
4.在master1節(jié)點上操作
5.在 node01 節(jié)點上操作
6.在 master01 節(jié)點上操作?
7.在 node01 節(jié)點上操作
8.node02 節(jié)點部署(方法一)
三、問題
1.復制證書到kubernetes.工作目錄的ssl子目錄報錯
四、總結
?一、理論
1.K8S單Master架構
(1) 架構
(2)kube- apiserver
k8s通過kube- apiserver這 個進程提供服務,該進程運行在單個master節(jié)點上。默認有兩個端口6443和8080
? ? ? ?安全端口6443用于接收HTTPS請求,用于基于Token文件或客戶端證書等認證
? ? ? ?本地端口8080用于接收HTTP請求,非認證或授權的HTTP請求通過該端口訪問APIServer
?
(3)?kubeconfig.sh
kubeconfig.sh文件包含集群參數(CA 證書、API Server 地址),客戶端參數(上面生成的證書和私鑰),集群context上下文參數(集群名稱、用戶名)。Kubenetes 組件(如kubelet、 kube-proxy) 通過啟動時指定不同的kubeconfig文件可以切換到不同的集群,連接到apiserver
(4)? kubelet
?kubelet采用TLS Bootstrapping 機制,自動完成到kube -apiserver的注冊,在node節(jié)點量較大或者后期自動擴容時非常有用。
Master apiserver 啟用TLS 認證后,node 節(jié)點kubelet 組件想要加入集群,必須使用CA簽發(fā)的有效證書才能與apiserver 通信,當node節(jié)點很多時,簽署證書是一件很繁瑣的事情。因此Kubernetes 引入了TLS bootstraping 機制來自動頒發(fā)客戶端證書,kubelet會以一個低權限用戶自動向apiserver 申請證書,kubelet 的證書由apiserver 動態(tài)簽署。
? ? ? ? kubelet首次啟動通過加載bootstrap.kubeconfig中的用戶Token 和apiserver CA證書發(fā)起首次CSR請求,這個Token被預先內置在apiserver 節(jié)點的token.csv 中,其身份為kubelet-bootstrap 用戶和system: kubelet- bootstrap用戶組:想要首次CSR請求能成功(即不會被apiserver 401拒絕),則需要先創(chuàng)建一個ClusterRoleBinding, 將kubelet-bootstrap 用戶和system:node - bootstrapper內置ClusterRole 綁定(通過kubectl get clusterroles 可查詢),使其能夠發(fā)起CSR認證請求。
? ? ? ?TLS bootstrapping 時的證書實際是由kube-controller-manager組件來簽署的,也就是說證書有效期是kube-controller-manager組件控制的; kube-controller-manager 組件提供了一個--experimental-cluster-signing-duration參數來設置簽署的證書有效時間:默認為8760h0m0s, 將其改為87600h0m0s, 即10年后再進行TLS bootstrapping 簽署證書即可。
? ? ? ? 也就是說kubelet 首次訪問API Server 時,是使用token 做認證,通過后,Controller Manager 會為kubelet生成一個證書,以后的訪問都是用證書做認證了。
?
2.部署 master 組件
(1)在 master01 節(jié)點上操作
cd /opt/k8s/
unzip master.zip
chmod +x *.sh
(2)創(chuàng)建kubernetes工作目錄
mkdir -p /opt/kubernetes/{cfg,bin,ssl}
(3)創(chuàng)建用于生成CA證書、相關組件的證書和私鑰的目錄
mkdir /opt/k8s/k8s-cert
mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert
cd /opt/k8s/k8s-cert/
chmod +x *.sh
./k8s-cert.sh #生成CA證書、相關組件的證書和私鑰
ls *pem
(4)復制證書
controller-manager 和 kube-scheduler 設置為只調用當前機器的 apiserver, 使用127.0.0.1:8080 通信,因此不需要簽發(fā)證書
復制CA證書、apiserver 相關證書和私鑰到kubernetes. 工作目錄的ssl子目錄中
cp ca*pem apiserver*pem /opt/kubernetes/ssl/
上傳kubernetes-server-linux-amd64.tar.gz 到/opt/k8s/ 目錄中,解壓kubernetes 壓縮包
cd /opt/k8s/
tar zxvf kubernetes-server-linux-amd64.tar.gz
復制master組件的關鍵命令文件到kubernetes. 工作目錄的bin子目錄中
cd /opt/k8s/kubernetes/server/bin
cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
ln -s /opt/kubernetes/bin/* /usr/local/bin/
創(chuàng)建bootstrap token 認證文件,apiserver 啟動時會調用,然后就相當于在集群內創(chuàng)建了一個這個用戶,接下來就可以用RBAC給他授權
cd /opt/k8s/
vim token.sh
#!/bin/bash
#獲取隨機數前16個字節(jié)內容,以十六進制格式輸出,并刪除其中空格
BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
#生成token.csv 文件,按照Token序列號,用戶名,UID,用戶組的格式生成
cat > /opt/kubernetes/cfg/token.csv <<EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF
chmod +x token.sh
./token.sh
cat /opt/kubernetes/cfg/token.csv
(5)開啟 apiserver 服務
二進制文件、token、證書都準備好后,開啟 apiserver 服務
cd /opt/k8s/
./apiserver.sh 192.168.204.171 https://192.168.204.171:2379,https://192.168.204.173:2379,https://192.168.204.175:2379
#檢查進程是否啟動成功
ps aux | grep kube-apiserver
查詢端口
netstat -natp | grep 6443
netstat -natp | grep 8080
查看版本信息(必須保證apiserver啟動正常,不然無法查詢到server的版本信息)
kubectl version
(6)啟動scheduler 服務
cd /opt/k8s/
./scheduler.sh 127.0.0.1
ps aux | grep kube-scheduler
查看節(jié)點狀態(tài)
kubectl get componentstatuses
或
kubectl get cs
(7) 啟動controller-manager服務
cd /opt/k8s/
./controller-manager.sh 127.0.0.1
查看節(jié)點狀態(tài)
kubectl get componentstatuses
或
kubectl get cs
3.部署 Woker Node 組件
(1)在 master01 節(jié)點上操作
把kubelet、 kube-proxy拷貝到node 節(jié)點
cd /opt/k8s/kubernetes/server/bin
scp kubelet kube-proxy root@192.168.204.173:/opt/kubernetes/bin/
scp kubelet kube-proxy root@192.168.204.175:/opt/kubernetes/bin/
(2)在 node01 節(jié)點上操作
上傳node.zip 到/opt 目錄中,解壓node.zip 壓縮包,獲得kubelet.sh、proxy.sh
cd /opt/
unzip node.zip
4.在master1節(jié)點上操作
(1)創(chuàng)建用于生成kubelet的配置文件的目錄
mkdir /opt/k8s/kubeconfig
(2)上傳 kubeconfig.sh 文件到/opt/k8s/kubeconfig 目錄中
cd /opt/k8s/kubeconfig
chmod +x kubeconfig.sh
(3)生成kubelet的配置文件
cd /opt/k8s/kubeconfig
./kubeconfig.sh 192.168.204.171 /opt/k8s/k8s-cert/
ls
(4)把配置文件bootstrap.kubeconfig、kube-proxy.kubeconfig拷貝到node節(jié)點
cd /opt/k8s/kubeconfig
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.204.173:/opt/kubernetes/cfg/
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.204.175:/opt/kubernetes/cfg/
RBAC授權,將預設用戶kubelet-bootatrap 與內置的ClusterRole system:node-bootatrapper 綁定到一起,使其能夠發(fā)起CSR請求
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
(5)查看角色
kubectl get clusterroles | grep system:node-bootstrapper
查看已授權的角色
kubectl get clusterrolebinding
5.在 node01 節(jié)點上操作
(1)使用kubelet.sh腳本啟動kubelet服務
cd /opt/
chmod +x kubelet.sh
./kubelet.sh 192.168.204.173
(2)檢查kubelet服務啟動
ps aux | grep kubelet
此時還沒有生成證書
ls /opt/kubernetes/ssl/
6.在 master01 節(jié)點上操作?
(1)檢查到node1 節(jié)點的kubelet 發(fā)起的CSR請求,Pending 表示等待集群給該節(jié)點簽發(fā)證書
kubectl get csr
(2)通過CSR請求
kubectl certificate approve node-csr-Y4fiQXiK38SS0LtDOKASTyMKsqnFXA10IOlW0-baLrg
(3)再次查看CSR請求狀態(tài),Approved, Issued表示已授權CSR請求并簽發(fā)證書
kubectl get csr
(4)查看群集節(jié)點狀態(tài),成功加入node1節(jié)點
kubectl get nodes
7.在 node01 節(jié)點上操作
(1)自動生成了證書和kubelet.kubeconfig 文件
ls /opt/kubernetes/cfg/kubelet.kubeconfig
ls /opt/kubernetes/ssl/
(2)加載ip_vs模塊
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
(3)?使用proxy.sh腳本啟動proxy服務
cd /opt/
chmod +x proxy.sh
./proxy.sh 192.168.111.173
systemctl status kube-proxy.service
8.node02 節(jié)點部署(方法一)
(1)?在node1 節(jié)點上將kubelet.sh、 proxy.sh 文件拷貝到node2 節(jié)點
cd /opt/
scp kubelet.sh proxy.sh root@192.168.204.175:/opt/
(2)node02 節(jié)點部署
使用kubelet.sh腳本啟動kubelet服務
cd /opt/
chmod +x kubelet.sh
./kubelet.sh 192.168.204.175
(3)?在 master01 節(jié)點上操作
使用kubelet.sh腳本啟動kubelet服務
kubectl get csr
通過CSR請求
kubectl certificate approve node-csr-Stux3Mk16W9oyKNn9QzVrrtz3N-B6LBtnL8_jLsbBzE
再次查看CSR請求狀態(tài),Approved, Issued表示已授權CSR請求并簽發(fā)證書
kubectl get csr
查看群集節(jié)點狀態(tài)
kubectl get nodes
加載ip_vs模塊
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
使用proxy.sh腳本啟動proxy服務
cd /opt/
chmod +x proxy.sh
./proxy.sh 192.168.204.175
systemctl status kube-proxy.service
創(chuàng)建一個鏡像并查看
kubectl create deployment nginx-test --image=nginx:1.14
kubectl get pod
查看容器詳細信息
kubectl get pod -o wide #查看容器詳細信息
在node節(jié)點查看能否進入容器
docker ps -a
docker exec -it d14bcf3f8fb7
二、實驗
由實驗:二進制部署K8S單Master架構(一)繼續(xù)進行
1.環(huán)境
表1 K8S環(huán)境
主機 | IP | 軟件 | 硬件 |
k8s集群master01 | ?192.168.204.171 | kube-apiserver kube-controller-manager kube-scheduler etcd | 4核4G |
k8s集群node1 | ?192.168.204.173 | kubelet kube-proxy docker flannel | 4核4G |
k8s集群node2 | ?192.168.204.175 | kubelet kube-proxy docker flannel | 4核4G |
?2.部署 master 組件
(1)在 master01 節(jié)點上操作
(2)創(chuàng)建kubernetes工作目錄
(3)創(chuàng)建用于生成CA證書、相關組件的證書和私鑰的目錄
?
(4)復制證書
controller-manager 和 kube-scheduler 設置為只調用當前機器的 apiserver, 使用127.0.0.1:8080 通信,因此不需要簽發(fā)證書
復制CA證書、apiserver 相關證書和私鑰到kubernetes. 工作目錄的ssl子目錄中
上傳kubernetes-server-linux-amd64.tar.gz 到/opt/k8s/ 目錄中,解壓kubernetes 壓縮包
復制master組件的關鍵命令文件到kubernetes.工作目錄的bin子目錄中
創(chuàng)建bootstrap token 認證文件,apiserver 啟動時會調用,然后就相當于在集群內創(chuàng)建了一個這個用戶,接下來就可以用RBAC給他授權
(5)開啟 apiserver 服務
二進制文件、token、證書都準備好后,開啟 apiserver 服務
查詢端口
查看版本信息(必須保證apiserver啟動正常,不然無法查詢到server的版本信息)
(6)啟動scheduler 服務
查看節(jié)點狀態(tài),目前controller-manager 節(jié)點還處于未健康的狀態(tài)
(7)啟動controller-manager服務
所有節(jié)點都健康
3.部署 Woker Node 組件
(1)在 master01 節(jié)點上操作
把kubelet、 kube-proxy拷貝到node 節(jié)點
(2)在 node01 節(jié)點上操作
上傳node.zip 到/opt 目錄中,解壓node.zip 壓縮包,獲得kubelet.sh、proxy.sh
4.在master1節(jié)點上操作
(1)創(chuàng)建用于生成kubelet的配置文件的目錄
(2)上傳 kubeconfig.sh 文件到/opt/k8s/kubeconfig 目錄中
(3)生成kubelet的配置文件
(4)把配置文件bootstrap.kubeconfig、kube-proxy.kubeconfig拷貝到node節(jié)點
RBAC授權,將預設用戶kubelet-bootatrap 與內置的ClusterRole system:node-bootatrapper 綁定到一起,使其能夠發(fā)起CSR請求
(5)查看角色
查看已授權的角色
5.在 node01 節(jié)點上操作
(1)使用kubelet.sh腳本啟動kubelet服務
(2)檢查kubelet服務啟動
此時還沒有生成證書
6.在 master01 節(jié)點上操作?
(1)檢查到node1 節(jié)點的kubelet 發(fā)起的CSR請求,Pending 表示等待集群給該節(jié)點簽發(fā)證書
(2)通過CSR請求
(3)再次查看CSR請求狀態(tài),Approved, Issued表示已授權CSR請求并簽發(fā)證書
(4)查看群集節(jié)點狀態(tài),成功加入node1節(jié)點
7.在 node01 節(jié)點上操作
(1)自動生成了證書和kubelet.kubeconfig 文件
(2)加載ip_vs模塊
(3)?使用proxy.sh腳本啟動proxy服務
8.node02 節(jié)點部署(方法一)
(1)?在node1 節(jié)點上將kubelet.sh、 proxy.sh 文件拷貝到node2 節(jié)點
(2)node02 節(jié)點部署
使用kubelet.sh腳本啟動kubelet服務
(3)?在 master01 節(jié)點上操作
使用kubelet.sh腳本啟動kubelet服務
通過CSR請求
再次查看CSR請求狀態(tài),Approved, Issued表示已授權CSR請求并簽發(fā)證書
查看群集節(jié)點狀態(tài)
加載ip_vs模塊
使用proxy.sh腳本啟動proxy服務
創(chuàng)建一個鏡像并查看
查看容器詳細信息
在node節(jié)點查看能否進入容器
三、問題
1.復制證書到kubernetes.工作目錄的ssl子目錄報錯
(1)報錯
無法獲取"apiserver*pem" 的文件狀態(tài)(stat): 沒有那個文件或目錄
(2)原因分析
k8s-cert.sh 配置文件未刪除注釋
(3)解決方法
刪除注釋
修改前:
修改后:
成功
四、總結
k8s通過kube- apiserver這 個進程提供服務,該進程運行在單個master節(jié)點上。默認有兩個端口6443和8080:
?安全端口6443用于接收HTTPS請求,用于基于Token文件或客戶端證書等認證文章來源:http://www.zghlxwxcb.cn/news/detail-688936.html
?本地端口8080用于接收HTTP請求,非認證或授權的HTTP請求通過該端口訪問APIServer文章來源地址http://www.zghlxwxcb.cn/news/detail-688936.html
到了這里,關于云原生Kubernetes:二進制部署K8S單Master架構(二)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!