將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