Kubernetes1.91(K8s)安裝部署過程(六)--node節點部署


hi,everybody,我回來了,之前安裝到flannel之后,文章一直沒有更新,甚至不少小伙伴都來加qq詢問是否繼續更新了,

這里說明下原因,我在部署1.91node的時候的確出現了各種各樣的問題,導致節點啟動后哦,master總是看不到,遇到的問題大概有

1、虛擬機時間同步不一致問題,導致etcd創建資源不成功

2、node節點無法自動創建kubelet.kubeconfig問題,這個是最嚴重的問題,原因是config文件沒有拷貝到node的/etc/kubernetes文件夾內,因為kubelet啟動調用

kubelet配置文件的時候也會同時調用這個文件,具體見kubelt的servier文件配置方法,這個文件是自動生成的。如果沒有自動生產,檢查所有配置參數和報錯,特別是config和kublet文件。

3、有關config文件並不是你從客戶端拷貝過來的時候就直接可以用了,需要里面修改master地址,因為apiserver的配置啟動參數綁定的地址中安全的訪問地址是10.10.90.105:6443,不安全是127.0.0.1:8080,這里可以簡單理解為6443是安全端口,不過只監聽在master的10.10.90.105的ip上,所以要修改node中config配置文件的master地址為 10.10.90.90.105:6443,而如果你master節點同時也是node節點的話,我測試了這個形式,那么你的config文件只能用127.0.0.1:8080訪問,使用6443也是不行的,也就是說本地和其他機器訪問apiserver的方式不同時的,否則log中會狂報錯無法連接api,這里注意一下,如果node復用了master節點同事需要重啟scheduler和control服務。

4、Failed at step CHDIR spawning /usr/local/bin/kubelet: No such file or directory 是沒有創建 /var/lib/kubelt文件夾

5、配置過程中一定要關閉防火牆,selinux,防止虛擬機重啟了這些服務業自動重啟。

6、1.8后面的kubelet配置文件不需要--api-servers參數,請注釋掉!!

7、swap 分區請在/etc/fstab注釋掉,並重啟虛擬機和所有服務。

8、node節點涉及的docker服務文件的修改,這里容易出現問題,文章中我會介紹。

 

master文章說明:

  前面的master節點因為以前配置有問題,采用了其他apiversion,發現后面問題很多,並且缺少了node認證方式,我已經在更新了這一篇文正,請小伙伴們去查看相關文正

並重啟apiserver服務,另外1.9的kubelet啟動參數和1.8也少許變化,如果你發現你/var/log/message文章用友unknown flag的報錯,就是你的參數不識別了,可以參考我的文章看哪個參數有出入。

 

好,上面只是一些我還有印象的注意事項,其他的請多多查看log文件排錯。

廢話不多說,直接開始配置node節點了,再次感慨大家的支持和等待!。

1、檢查2個node節點配置文件和ssl證書是否齊全,這一步很重要。

注意ssl里面有幾個kubelet開頭的文件 ,是通過過自動生成的文件。

 

2、配置docker的服務文件

 

因為需要docker聯合flannel使用,所以需要修改docker的服務service文件

我們前面是flannel插件是通過yum方式安裝的,修改方式如下:

修改docker的配置文件/usr/lib/systemd/system/docker.service,增加一條環境變量配置:

EnvironmentFile=-/run/flannel/docker

同時為start添加一個參數 --exec-opt native.cgroupdriver=systemd,這里的systemd和kubelet配置文件里面的--cgroup-drive相同即可,否則kubelet啟動報錯

如圖:

 

 修改配置參數后,重啟docker服務

systemctl restart docekr

 

 3、安裝kubelet工具及配置

 

kubelet是node節點安裝的工具,我們依然從我們前面下載的server包的bin里面可以找到,同時還需要kube-proxy問,可以同時上傳的文件夾的/usr/local/bin文件

並且賦予可執行權限。

注意事項:swap分區務必注釋掉並重啟服務器。

 

配置前我們需要現在master節點上執行如下操作,創建認證角色:

cd /etc/kubernetes
kubectl create clusterrolebinding kubelet-bootstrap \
  --clusterrole=system:node-bootstrapper \
  --user=kubelet-bootstrap

created成功后,我們回到node節點操作:

我們已經獲得了bin文件,開始配置相應的服務器文件

添加配置文件kubelt:

cd /etc/kubernetes
cat > kubelet << EOF
###
## kubernetes kubelet (minion) config
#
## The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=10.10.90.106"
#
## The port for the info server to serve on
#KUBELET_PORT="--port=10250"
#
## You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=10.10.90.106"
#
## location of the api-server
## COMMENT THIS ON KUBERNETES 1.8+
#KUBELET_API_SERVER="--api-servers=http://172.20.0.113:8080"
#
## pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=pause-amd64:3.0"
#
## Add your own!
KUBELET_ARGS="--cgroup-driver=systemd --cluster-dns=10.254.0.2 --experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig --kubeconfig=/etc/kubernetes/kubelet.kubeconfig  --cert-dir=/etc/kubernetes/ssl --cluster-domain=cluster.local --hairpin-mode promiscuous-bridge --serialize-image-pulls=false"
EOF

說明:里面的ip地址都為node節點的ip地址,其他節點相應就好就好,注意KUBELET_API_SERVER已經在1.8的時候不用了。注釋掉。

KUBELET_POD_INFRA_CONTAINER是指定pod運行的基礎鏡像,必須存在,我這里直接指定的是一個本地的鏡像,鏡像的或許地址為:
docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0 

下載到本地后tag一下,方便使用,當然你也可以添加其他的公共pod基礎鏡像,在線地址也行,注意不要被牆就好。 docker tag registry.cn
-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0 pause-amd64:3.0

 

添加kubelt的服務文件/usr/lib/systemd/system/kubelet.service
內容如下:
[Unit]
Description=Kubernetes Kubelet Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service

[Service]
WorkingDirectory=/var/lib/kubelet
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/kubelet
ExecStart=/usr/local/bin/kubelet \
            $KUBE_LOGTOSTDERR \
            $KUBE_LOG_LEVEL \
            $KUBELET_API_SERVER \
            $KUBELET_ADDRESS \
            $KUBELET_PORT \
            $KUBELET_HOSTNAME \
            $KUBE_ALLOW_PRIV \
            $KUBELET_POD_INFRA_CONTAINER \
            $KUBELET_ARGS
Restart=on-failure

[Install]
WantedBy=multi-user.target

添加工作目錄:不添加啟動報錯

mkdir /var/lib/kubelet

啟動kubelt:

systemctl daemon-reload
systemctl enable kubelet
systemctl start kubelet
systemctl status kubelet

 

4、接受node請求

啟動后,如果政策會自動向master節點發送驗證加入請求,我們在master節點操作:

kubectl get csr 

#此命令可以看到所有請求,所有為pending狀態,則是需要批准的

kubectl certificate approve 節點name

#此命令可以通過請求

我這是是已經approve過了,顯示為approved和issued狀態。就正常了

 

命令擴展:

kubectl delete csr 節點名稱 #刪除單個節點的請求  

kubectl delete csr --all  #刪除所有節點請求

kubectl  delete nodes  node名稱  #刪除加入的節點

kubectl  delete nodes --all   #刪除所有節點

 

5、配置kube-proxy服務

現安裝個工具conntrack,具體是干什么的還不是很清楚:

yum install -y conntrack-tools

 

創建 kube-proxy 的service配置文件,路徑/usr/lib/systemd/system/kube-proxy.service,內容:

[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target

[Service]
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/proxy
ExecStart=/usr/local/bin/kube-proxy \
        $KUBE_LOGTOSTDERR \
        $KUBE_LOG_LEVEL \
        $KUBE_MASTER \
        $KUBE_PROXY_ARGS
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

 

添加配置文件/etc/kubernetes/proxy:內容為:

 proxy config

# default config should be adequate

# Add your own!
KUBE_PROXY_ARGS="--bind-address=10.10.90.106 --hostname-override=10.10.90.106 --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig --cluster-cidr=10.254.0.0/16"

ip修改為本機ip即可。

注意事項:

--hostname-override 參數值必須與 kubelet 的值一致,否則 kube-proxy 啟動后會找不到該 Node,從而不會創建任何 iptables 規則;
kube-proxy 根據 --cluster-cidr 判斷集群內部和外部流量,指定 --cluster-cidr 或 --masquerade-all 選項后 kube-proxy 才會對訪問 Service IP 的請求做 SNAT;
--kubeconfig 指定的配置文件嵌入了 kube-apiserver 的地址、用戶名、證書、秘鑰等請求和認證信息;
預定義的 RoleBinding cluster-admin 將User system:kube-proxy 與 Role system:node-proxier 綁定,該 Role 授予了調用 kube-apiserver Proxy 相關 API 的權限;

啟動proxy服務:

systemctl daemon-reload
systemctl enable kube-proxy
systemctl start kube-proxy
systemctl status kube-proxy

 

 

補充知識點:

有關node節點名稱修改:

在master上通過kubectl get node 獲得的列表中,Name顯示的名稱是通過 客戶端kubelet和proxy配置文件中hostname-override配置參數定義的,修改這2個參數為你想要的名稱,並且刪除kubelet.kubeconfig(這個文件是master認證后客戶端自動生成的,如果不刪除會報node節點forbidden)文件,重新啟動着2個服務,master端重新 kubectl certificate approve name名稱 就可以看到新名稱。

 修改配置文件,不刪除kubelet.kubeconfig文件會報錯誤:

kubelet_node_status.go:106] Unable to register node "node2" with API server: nodes "node2" is forbidden: node "10.10.90.107" cannot modify node "node2"

 

 

6、驗證測試

我們可以創建一個nginx部署驗證集群是否正常:

 

#delete是清理不用的所有pods,service和deployment,非必須執行
kubectl delete pods --all
kubectl delete service --all
kubectl delete deployment --all

這里以下是測試一個nginx集群部署的
1、定義集群並啟動
kubectl run nginx --replicas=3 --labels="run=load-balancer-example" --image=nginx  --port=80
2、定義集群服務
kubectl expose deployment nginx --type=NodePort --name=example-service
3、查看服務信息
kubectl describe svc example-service
4、查看pod狀態,全為running既正常,否則使用kubectl describe pods {有問題的pod名稱} 查看具體的報錯。
kubectl get pods

 

其他電腦訪問node節點+ip是可以訪問的,創建service的有其他類型可以選擇。

 

 

 

 

再次提醒我后面的node節點是按照3台來裝的,跟初始的設計不太一樣,只不過不master也當成一台node了,到這里一個基本的集群就完成了,后面的還有輔助工具dns和圖形化展示等功能,這兩天慢慢補充。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM