二進制部署k8s集群(5):部署kubelet


將k8s安裝在六個節點上,六個點信息為: 

節點名稱 IP地址 Hostname 安裝內容
harbor私有倉庫 192.168.0.101 yyee-centos-1 harbor
k8s管理節點1 192.168.0.102 yyee-centos-2
etcd,kube-apiserver,kube-controller-manager,
kube-scheduler,CNI 
k8s管理節點2 192.168.0.103 yyee-centos-3
etcd,kube-apiserver,kube-controller-manager,
kube-scheduler, CNI 
k8s工作節點1 192.168.0.104 yyee-centos-4

etcd ,kubelet,docker,kube_proxy,caliop, CNI 
k8s工作節點2 192.168.0.105 yyee-centos-5

kubelet,docker,kube_proxy,caliop, CNI 

k8s工作節點3 192.168.0.106 yyee-centos-6

kubelet,docker,kube_proxy,caliop, CNI 

 

 

 

 

 

 

 

   

 

 

 

【前期准備】:

下載 kubernetes-node:https://dl.k8s.io/v1.18.3/kubernetes-node-linux-amd64.tar.gz

或者下載kube-server,kube-server里包含了kubelet,kubernetes-server下載地址:https://dl.k8s.io/v1.18.3/kubernetes-server-linux-amd64.tar.gz

k8s其它組件下載:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md#v1183 

 

創建kubelet證書。在前一篇 《二進制部署k8s集群(三):部署apiserver》已經創建kubelet證書。

需要用到兩個證書文件(kubelet-key.pem, kubelet.pem),將這兩個證書文件分別拷貝所有管理節點的【/opt/kubernetes/server/bin/certs】目錄,以及拷貝到所有工作節點的 【//opt/kubernetes/node/bin/certs】目錄。

 

下載kubernetes-node安裝包,准備kubelet證書

在k8s所有工作節點上下載kubernetes-node安裝包 

wget https://dl.k8s.io/v1.18.3/kubernetes-node-linux-amd64.tar.gz

 

將kubernetes-node-linux-amd64.tar.gz壓縮包解壓到 /opt/kubernetes目錄。

tar xvf kubernetes-node-linux-amd64.tar.gz -C /opt

 

   

將【k8s管理節點1】上簽 發的kubelet證書,kube-proxy證書,client證書,私鑰證書ca.pem,拷貝到 所有k8s工作節點下的 【/opt/kubernetes/node/bin/certs】目錄。

mkdir -p /opt/kubernetes/node/bin/certs
cd /opt/kubernetes/node/bin/certs
scp 192.168.0.102:/opt/certs/kubelet-key.pem ./
scp 192.168.0.102:/opt/certs/kubelet.pem ./
scp 192.168.0.102:/opt/certs/ca.pem ./
scp 192.168.0.102:/opt/certs/client-key.pem ./
scp 192.168.0.102:/opt/certs/client.pem ./
scp 192.168.0.102:/opt/certs/kube-proxy-client-key.pem ./
scp 192.168.0.102:/opt/certs/kube-proxy-client.pem ./

 

ll /opt/kubernetes/node/bin/certs

 

   

 創建kubectl軟鏈接。

ln -s /opt/kubernetes/node/bin/kubectl  /usr/bin/kubectl

 

創建kubelet用戶配置文件

切換到【k8s管理節點2】(192.168.0.103)主機,因為生成配置的時候用到localhost:8080,所以需要在管理節點上執行。

下面4個步驟,只需要在其中一個管理節點上完成,然后將kubelet.kubeconfig文件和k8s-node.yaml文件拷貝到各個工作節點。

#進入conf目錄才能創建配置文件
mkdir -p /opt/kubernetes/server/conf cd
/opt/kubernetes/server/conf/

 注意,conf目錄在【/opt/kubernetes/server】目錄下面,而不是【/opt/kubernetes/server/bin】。

 

第1步【設置集群參數】

kubectl config set-cluster myk8s \
  --certificate-authority=/opt/kubernetes/server/bin/certs/ca.pem \
  --embed-certs=true \
  --server=https://192.168.0.102:6443 \
  --kubeconfig=kubelet.kubeconfig

--server= 可以配置成負載均衡地址,可以用nginx反向代理 192.168.0.102:6443與192.168.0.103:6443兩個k8s管理節點的kube-apiserver 端口。

然后將--server配置成反向代理的ip(或域名)與端口。

 Cluster "myk8s" set.

    

第2步【設置客戶端認證參數】

kubectl config set-credentials k8s-node \
  --client-certificate=/opt/kubernetes/server/bin/certs/client.pem \
  --client-key=/opt/kubernetes/server/bin/certs/client-key.pem \
  --embed-certs=true \
  --kubeconfig=kubelet.kubeconfig

 

User "k8s-node"  set.

 

第3步【設置上下文參數】

kubectl config set-context myk8s-context \
  --cluster=myk8s \
  --user=k8s-node \
  --kubeconfig=kubelet.kubeconfig

 

Context "myk8s-context"   created.

 

第4步【切換上下文】

kubectl config use-context myk8s-context --kubeconfig=kubelet.kubeconfig

 

Switched to conttext "myk8s-context". 

 

第5步 【分發配置文件到工作節點】

將kubelet.kubeconfig文件分發到三個工作節點kubelet安裝目錄的conf文件夾。

並且還要拷貝到工作節點的 /root/.kube文件夾,以便在工作節點可以使用kubectl命令。

#先在工作節點創建/opt/kubernetes/node/conf文件夾及/root/.kube文件夾
#然后拷貝文件
scp bekelet.kubeconfig 192.168.0.104:/opt/kubernetes/node/conf
scp bekelet.kubeconfig 192.168.0.104:/root/.kube
scp kubelet.kubeconfig 192.168.0.105:/opt/kubernetes/node/conf
scp bekelet.kubeconfig 192.168.0.105:/root/.kube
scp kubelet.kubeconfig 192.168.0.106:/opt/kubernetes/node/conf
scp bekelet.kubeconfig 192.168.0.106:/root/.kube

 

角色綁定

在其中一個k8s管理節點上創建角色綁定配置文件:

切換到【k8s管理節點2】

vi /opt/kubernetes/server/conf/k8s-node.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: k8s-node roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:node subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: k8s-node

 

執行創建角色綁定命令,因為用到localhost:8080,所有要在管理節點上創建。

kubectl create -f k8s-node.yaml

 

  

這一步只需要創建一次,重復創建會報名字已存在的錯誤。

Error from server (AlreadyExists): error when creating "k8s-node.yaml": clusterrolebindings.rbac.authorization.k8s.io "k8s-node" already exists.

.

查看創建的角色綁定

kubectl get clusterrolebinding k8s-node

 

  

查看角色綁定明細

kubectl get clusterrolebinding k8s-node -o yaml

 

  

部署kutele

(1) 拉取kubernetes/pause 鏡像

【拉取一個docker基礎鏡像 kubernetes/pause】

每個k8s工作節點上拉取一個名為kubernetes/pause的基礎鏡像下來,啟動pod需要用到這個基礎鏡像,這個基礎鏡像很小,實際大小為72.28KB 。

docker pull kubernetes/pause

 

 

kubelet啟動文件需要配置kubernetes/pause鏡像。

如果想在啟動kubelet的時候加快鏡像下載速度,可以將這個鏡像打個tag然后上傳到私有倉庫harbor,然后將配置指向私有harbor的kubernetes/pause鏡像。

docker tag kubernetes/pause 192.168.0.101:10080/base/kubernetes/pause:latest
docker login 192.168.0.101:10080
docker push 192.168.0.101:10080/base/kubernetes/pause:latest

  

(2) 創建kubelet啟動文件

【創建k8s工作節點1的kubelet啟動文件】

vi  /opt/kubernetes/node/bin/kuelet.sh

#!/bin/sh
 ./kubelet \
  --anonymous-auth=false \
  --cgroup-driver cgroupfs \
  --cluster-dns 192.168.0.2 \
  --cluster-domain cluster.local \
  --runtime-cgroups=/systemd/system.slice \
  --kubelet-cgroups=/systemd/system.slice \
  --fail-swap-on="false" \
  --client-ca-file ./certs/ca.pem \
  --tls-cert-file ./certs/kubelet.pem \
  --tls-private-key-file ./certs/kubelet-key.pem \
--address 192.168.0.104 \
--hostname-override 192.168.0.104 \ --image-gc-high-threshold 20 \ --image-gc-low-threshold 10 \ --kubeconfig ../conf/kubelet.kubeconfig \ --log-dir /data/logs/kubernetes/kube-kubelet \ --pod-infra-container-image kubernetes/pause \ --root-dir /data/kubelet

 --address 對外服務的監聽地址。

--pod-infra-container-image參數可配置成私有harbor的鏡像:--pod-infra-container-image 192.168.0.101:10080/base/kubernetes/pause \ 。

--hostname-override 節點ip地址,不同節點需要更改。

--cluster-dns k8s dns,用coredns配置。我這里做測試,沒用於生產環境,dns填的宿主機的默認網關。

 

【創建k8s工作節點2的kubelet啟動文件】

vi  /opt/kubernetes/node/bin/kuelet.sh

#!/bin/sh
 ./kubelet \
  --anonymous-auth=false \
  --cgroup-driver cgroupfs \
  --cluster-dns 192.168.0.2 \
  --cluster-domain cluster.local \
  --runtime-cgroups=/systemd/system.slice \
  --kubelet-cgroups=/systemd/system.slice \
  --fail-swap-on="false" \
  --client-ca-file ./certs/ca.pem \
  --tls-cert-file ./certs/kubelet.pem \
  --tls-private-key-file ./certs/kubelet-key.pem \
--address 192.168.0.105 \
--hostname-override 192.168.0.105 \ --image-gc-high-threshold 20 \ --image-gc-low-threshold 10 \ --kubeconfig ../conf/kubelet.kubeconfig \ --log-dir /data/logs/kubernetes/kube-kubelet \ --pod-infra-container-image kubernetes/pause \ --root-dir /data/kubelet

 

【創建k8s工作節點3的kubelet啟動文件】

vi  /opt/kubernetes/node/bin/kuelet.sh

#!/bin/sh
 ./kubelet \
  --anonymous-auth=false \
  --cgroup-driver cgroupfs \
  --cluster-dns 192.168.0.2 \
  --cluster-domain cluster.local \
  --runtime-cgroups=/systemd/system.slice \
  --kubelet-cgroups=/systemd/system.slice \
  --fail-swap-on="false" \
  --client-ca-file ./certs/ca.pem \
  --tls-cert-file ./certs/kubelet.pem \
  --tls-private-key-file ./certs/kubelet-key.pem \
--address 192.168.0.106 \
--hostname-override 192.168.0.106 \ --image-gc-high-threshold 20 \ --image-gc-low-threshold 10 \ --kubeconfig ../conf/kubelet.kubeconfig \ --log-dir /data/logs/kubernetes/kube-kubelet \ --pod-infra-container-image kubernetes/pause \ --root-dir /data/kubelet

 

【創建所有工作節點的日志目錄,賦予啟動文件可執行權限】

mkdir -p /data/logs/kubernetes/kube-kubelet
mkdir -p /data/kubelet
chmod +x /opt/kubernetes/node/bin/kubelet.sh

 

【執行kubelet.sh驗證kubelet啟動狀態】

cd /opt/kubernetes/node/bin
./kubelet.sh

 

 

   

在【k8s管理節點】上查看節點狀態

切換到任意一個管理節點。

kubectl get nodes

  

Ready表示工作節點成功連接到主控節點kube-apiserver,NotReady表示工作節點未連接到主控節點lube-apiserver。

啟動kubelet后如果一直報 failed to get cgroup status for /user.slice 的錯誤,需要修改docker 的 守護參數:

vi  /etc/docker/daemon.json

"exec-opts": ["native.cgroupdriver=cgroupfs"]

然后重啟docker 。

如果將 kubelet.sh啟動文件的cluster-driver設置成 --cluster-driver=systemd,那么docker的配置要修改成:

vi  /etc/docker/daemon.json

"exec-opts": ["native.cgroupdriver=systemd"] 

然后重啟docker :

systemctl  daemon-reload
systemctl restart docker

 

使用supervisor啟動kubelet

supevisor相當於一個systemd服務,用它來啟動與監控kubelet。

 

 (1) 安裝supervisor

yum install supervisor
systemctl enable supervisord
systemctl start supervisord

 

(2) 創建工作節點上的supervisor啟動配置文件

將配置文件放到 /etc/supervisord 目錄下,以.ini作為擴展名,文件名可以任意,可以放置多個不同的啟動配置文件,每個配置文件以不同的服務啟動。

 

創建【工作節點1】的supervisor啟動文件

切換到192.168.0.104

vi  /etc/supervisord.d/kube-kubelet.ini

[program:kube-kubelet-104]
command=/opt/kubernetes/node/bin/kubelet.sh numprocs=1 directory=/opt/kubernetes/node/bin autostart=true autorestart=true startsecs=30 startretries=3 exitcodes=0,2 stopsignal=QUIT stopwaitsecs=10 user=root redirect_stderr=true stdout_logfile=/data/logs/kubernetes/kube-kubelet/kubelet.stdout.log stdout_logfile_maxbytes=64MB stdout_logfile_backups=4 stdout_capture_maxbytes=1MB stdout_events_enabled=false

 

創建【工作節點2】的supervisor啟動文件

切換到192.168.0.105

vi  /etc/supervisord.d/kube-kubelet.ini

[program:kube-kubelet-105]
command=/opt/kubernetes/node/bin/kubelet.sh
numprocs=1
directory=/opt/kubernetes/node/bin
autostart=true
autorestart=true
startsecs=30
startretries=3
exitcodes=0,2
stopsignal=QUIT
stopwaitsecs=10
user=root
redirect_stderr=true
stdout_logfile=/data/logs/kubernetes/kube-kubelet/kubelet.stdout.log
stdout_logfile_maxbytes=64MB
stdout_logfile_backups=4
stdout_capture_maxbytes=1MB
stdout_events_enabled=false

 

創建【工作節點3】的supervisor啟動文件

切換到192.168.0.106

vi  /etc/supervisord.d/kube-kubelet.ini

[program:kube-kubelet-106]
command=/opt/kubernetes/node/bin/kubelet.sh
numprocs=1
directory=/opt/kubernetes/node/bin
autostart=true
autorestart=true
startsecs=30
startretries=3
exitcodes=0,2
stopsignal=QUIT
stopwaitsecs=10
user=root
redirect_stderr=true
stdout_logfile=/data/logs/kubernetes/kube-kubelet/kubelet.stdout.log
stdout_logfile_maxbytes=64MB
stdout_logfile_backups=4
stdout_capture_maxbytes=1MB
stdout_events_enabled=false

 

(3) 分別啟動所有工作節點上的kubelet服務

#啟動新加入到supervisor中的服務
supervisorctl update
#查看狀態
supervisorctl status

  

  

查看kubelet啟動日志

tail -fn 200 /data/logs/kubernetes/kube-kubelet/kubelet.stdout.log

 

【supervisor命令說明】

supervisorctl status                   #查看所有進程的狀態
supervisorctl stop 服務名          #停止服務
supervisorctl start 服務名          #啟動服務
supervisorctl restart 服務名      #重啟服務
supervisorctl update                 #配置文件修改后使用該命令加載新的配置
supervisorctl reload                  #重新啟動配置中的所有程序

 

查看kutelet集群狀態

(1) 在管理節點上使用kubectl

切換到任何一台k8s管理節點。

【查看管理節點集群狀態】

kubetctl get cs

  

【查看kubelet各節點狀態】

kubectl get nodes

或者

kubectl get node

 

(2) 在工作節點上使用kubectl

在工作節點上使用kubectl命令會報錯誤:

The connection to the server localhost:8080 was refused - did you specify the right host or port?

解決的辦法是將【 /opt/kubernetes/node/conf/kubelet.kubeconfig 】與 【/opt/kubernetes/node/conf/kube-proxy.kubeconfig】兩個文件拷貝到【 /root/.kube/  】目錄下面。

mkdir -p /root/.kube
cp /opt/kubernetes/node/conf/kubelet.kubeconfig /root/.kube/config
cp /opt/kubernetes/node/conf/kube-proxy.kubeconfig  /root/.kube/config

 

給kubelet角色加標簽

切換到k8s管理節點。

kubectl label node 192.168.0.104 node-role.kubernetes.io/master=
kubectl label node 192.168.0.104 node-role.kubernetes.io/etcd=
kubectl label node 192.168.0.104 node-role.kubernetes.io/node=
kubectl label node 192.168.0.105 node-role.kubernetes.io/node=
kubectl label node 192.168.0.106 node-role.kubernetes.io/node=

 

kubectl get nodes

 


免責聲明!

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



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