前言
在構建 Kubernetes 多 Master 集群時,實現負載均衡是至關重要的一環。通過多臺 Master 節點配合使用 Nginx 和 Keepalived 等工具,可以有效提高集群的可靠性和穩定性,確保系統能夠高效運行并有效應對故障。接下來將介紹如何配置這些組件。
接上篇:二進制部署Kubernetes集群——單Master和Node組件-CSDN博客
目錄
一、環境配置
1. 集群節點配置
2. 操作系統初始化配置
二、部署 master02 節點
1.?拷貝證書文件、master 組件
2.?修改配置文件 kube-apiserver 中的 IP
3.?啟動各服務并設置開機自啟
4.?查看 node 節點狀態
三、部署負載均衡
1.?配置 nginx 的官方 yum 源
2. 安裝 nginx,修改配置文件
2.1 yum 安裝
2.2 配置反向代理負載均衡
2.3?啟動 nginx 服務
3.?部署 keepalived 服務
3.1 yum 安裝
3.2?修改配置文件
3.3?創建 nginx 狀態檢查腳本
3.4?啟動 keepalived 服務
4.?修改 node 節點配置文件
4.1 修改 bootstrap.kubeconfig 和 kubelet.kubeconfig 配置
4.2?重啟 kubelet 和 kube-proxy 服務
5. 查看節點連接狀態
6.?測試創建 pod
6.1 部署容器
6.2 查看 Pod 的狀態信息
7. 訪問頁面
8. 查看日志?
四、部署 Dashboard
1.?Dashboard 簡介
2. 上傳生成鏡像包?
2.1 分別在 node01、node02 節點生成鏡像
3.?上傳 recommended.yaml 文件
4.?創建 service account 并綁定默認 cluster-admin 管理員集群角色
5.?使用輸出的 token 登錄 Dashboard
五、錯誤示例?
1. 錯誤狀態
2. 錯誤原因
2.1 查看 ?kubelet 服務日志
2.2 檢查 keepalived 服務 vip
一、環境配置
1. 集群節點配置
機器內存有限,按需自行分配:
節點名稱 | IP | 部署組件 | 配置 |
k8s集群master01 | 192.168.190.100 | kube-apiserver? kube-controller-manager? kube-scheduler | 2C/3G |
k8s集群master02 | 192.168.190.101 | kube-apiserver? kube-controller-manager? kube-scheduler | 2C/2G |
k8s集群node01 | 192.168.190.102 | kubelet? kube-proxy? docker | 2C/2G |
k8s集群node02 | 192.168.190.103 | kubelet? kube-proxy? docker | 2C/2G |
etcd集群etcd01 | 192.168.190.100 | etcd | |
etcd集群etcd02 | 192.168.190.102 | etcd | |
etcd集群etcd03 | 192.168.190.103 | etcd | |
負載均衡nkmaster | 192.168.190.104 | nginx+keepalive01 | 1C/1G |
負載均衡nkbackup | 192.168.190.105 | nginx+keepalive02 | 1C/1G |
2. 操作系統初始化配置
新增節點設備做一下配置:
①?關閉防火墻及其他規則
所有節點操作:
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
# 清空iptables防火墻的規則,包括過濾規則、NAT規則、Mangle規則以及自定義鏈
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
②?關閉 swap
所有節點操作:
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 在/etc/fstab文件中找到包含swap的行,并在這些行之前加上#,從而注釋掉這些行
③ 在 master01、master02?添加 hosts
cat >> /etc/hosts << EOF
192.168.190.100 master01
192.168.190.101 master02
192.168.190.102 node01
192.168.190.103 node02
EOF
④ 調整內核參數
所有節點操作:
cat > /etc/sysctl.d/k8s.conf << EOF
#開啟網橋模式,可將網橋的流量傳遞給iptables鏈
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#關閉ipv6協議
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOFsysctl --system
# 重新加載內核參數設置
⑤ 時間同步
所有機器均需要同步:
yum install ntpdate -y
ntpdate time.windows.com
二、部署 master02 節點
1.?拷貝證書文件、master 組件
從 master01 節點上拷貝證書文件、各master組件的配置文件和服務管理文件到 master02 節點
[root@master01 ~]# scp -r /opt/etcd/ root@master02:/opt/
[root@master01 ~]# scp -r /opt/kubernetes/ root@master02:/opt/
[root@master01 ~]# scp -r /root/.kube root@master02:/root/
[root@master01 ~]# scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@master02:/usr/lib/systemd/system/
2.?修改配置文件 kube-apiserver 中的 IP
[root@master02 ~]# vim /opt/kubernetes/cfg/kube-apiserver
--etcd-servers=https://192.168.190.100:2379,https://192.168.190.102:2379,https://192.168.190.103:2379 \
--bind-address=192.168.190.101 \ # 修改為 master02 ip
--secure-port=6443 \
--advertise-address=192.168.190.101 \ # 修改為 master02 ip
3.?啟動各服務并設置開機自啟
[root@master02 ~]# systemctl enable --now kube-apiserver.service
[root@master02 ~]# systemctl status kube-apiserver.service Active: active (running) since 三 2024-05-15 17:09:29 CST; 19s ago[root@master02 ~]# systemctl enable --now kube-controller-manager.service
[root@master02 ~]# systemctl status kube-controller-manager.serviceActive: active (running) since 三 2024-05-15 17:10:56 CST; 9s ago[root@master02 ~]# systemctl enable --now kube-scheduler.service
[root@master02 ~]# systemctl status kube-scheduler.serviceActive: active (running) since 三 2024-05-15 17:12:12 CST; 8s ago
4.?查看 node 節點狀態
[root@master02 ~]# ln -s /opt/kubernetes/bin/* /usr/local/bin/
[root@master02 ~]# kubectl get nodes
# 列出所有集群中的節點,包括節點的名稱和狀態信息
NAME STATUS ROLES AGE VERSION
192.168.190.102 Ready <none> 42h v1.20.11
192.168.190.103 Ready <none> 178m v1.20.11
[root@master02 ~]# kubectl get nodes -o wide
# -o=wide:輸出額外信息;對于Pod,將輸出Pod所在的Node名
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
192.168.190.102 Ready <none> 42h v1.20.11 192.168.190.102 <none> CentOS Linux 7 (Core) 3.10.0-693.el7.x86_64 docker://26.1.2
192.168.190.103 Ready <none> 178m v1.20.11 192.168.190.103 <none> CentOS Linux 7 (Core) 3.10.0-693.el7.x86_64 docker://26.1.2
此時在 master02 節點查到的 node 節點狀態僅是從 etcd 查詢到的信息,而此時 node 節點實際上并未與 master02 節點建立通信連接,因此需要使用一個 VIP 把 node 節點與 master 節點都關聯起來。
三、部署負載均衡
配置 load balancer 集群雙機熱備負載均衡(nginx 實現負載均衡,keepalived 實現雙機熱備),在 nkmaster、nkbackup 節點上操作。
1.?配置 nginx 的官方 yum 源
cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
EOF
2. 安裝 nginx,修改配置文件
2.1 yum 安裝
yum install nginx -y
2.2 配置反向代理負載均衡
修改 nginx 配置文件,配置四層反向代理負載均衡,指定 k8s 群集兩臺 master 的節點 ip 和 6443 端口。
vim /etc/nginx/nginx.confevents {worker_connections 1024;
}stream {log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';access_log /var/log/nginx/k8s-access.log main;upstream k8s-apiserver {server 192.168.190.100:6443;server 192.168.190.101:6443;}server {listen 6443;proxy_pass k8s-apiserver;}
}http {
……
2.3?啟動 nginx 服務
nginx -t
systemctl enable --now nginx.service netstat -natp | grep nginx # 查看已監聽6443端口
tcp 0 0 0.0.0.0:6443 0.0.0.0:* LISTEN 2410/nginx: master
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2410/nginx: master
3.?部署 keepalived 服務
3.1 yum 安裝
yum install keepalived -y
3.2?修改配置文件
vim /etc/keepalived/keepalived.conf
3.3?創建 nginx 狀態檢查腳本
vim /etc/nginx/check_nginx.sh#!/bin/bash
#egrep -cv "grep|$$" 用于過濾掉包含grep 或者 $$ 表示的當前Shell進程ID,即腳本運行的當前進程ID號
count=$(ps -ef | grep nginx | egrep -cv "grep|$$")
if [ "$count" -eq 0 ];thensystemctl stop keepalived
fichmod +x /etc/nginx/check_nginx.sh
3.4?啟動 keepalived 服務
systemctl enable --now keepalived.service[root@nkmaster ~]# ip ainet 192.168.190.200/24 scope global secondary ens33
4.?修改 node 節點配置文件
修改node節點上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件為VIP
4.1 修改 bootstrap.kubeconfig 和 kubelet.kubeconfig 配置
[root@node01 ~]# cd /opt/kubernetes/cfg/
[root@node01 cfg]# vim bootstrap.kubeconfigserver: https://192.168.190.200:6443
[root@node01 cfg]# vim kubelet.kubeconfigserver: https://192.168.190.200:6443
[root@node01 cfg]# vim kube-proxy.kubeconfigserver: https://192.168.190.200:6443
4.2?重啟 kubelet 和 kube-proxy 服務
systemctl restart kubelet.service
systemctl restart kube-proxy.service
5. 查看節點連接狀態
在 nkmaster 上查看 nginx 和 node、master 節點的連接狀態
[root@nkmaster ~]# netstat -natp | grep nginx
tcp 0 0 0.0.0.0:6443 0.0.0.0:* LISTEN 2410/nginx: master
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2410/nginx: master
tcp 0 0 192.168.190.200:6443 192.168.190.102:44658 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.200:6443 192.168.190.103:41016 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.104:59136 192.168.190.100:6443 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.104:38484 192.168.190.101:6443 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.104:38472 192.168.190.101:6443 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.200:6443 192.168.190.102:44642 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.104:38494 192.168.190.101:6443 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.200:6443 192.168.190.103:41020 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.200:6443 192.168.190.103:41014 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.200:6443 192.168.190.102:44650 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.200:6443 192.168.190.103:41012 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.200:6443 192.168.190.102:44644 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.200:6443 192.168.190.102:44626 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.200:6443 192.168.190.103:41042 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.200:6443 192.168.190.103:41018 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.104:59156 192.168.190.100:6443 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.104:59122 192.168.190.100:6443 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.200:6443 192.168.190.102:44652 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.104:59132 192.168.190.100:6443 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.104:38498 192.168.190.101:6443 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.104:38502 192.168.190.101:6443 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.200:6443 192.168.190.102:44646 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.104:38488 192.168.190.101:6443 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.104:38480 192.168.190.101:6443 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.200:6443 192.168.190.103:40996 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.104:59144 192.168.190.100:6443 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.104:59118 192.168.190.100:6443 ESTABLISHED 2411/nginx: worker
tcp 0 0 192.168.190.104:38514 192.168.190.101:6443 ESTABLISHED 2411/nginx: worker
6.?測試創建 pod
在 master01 節點上操作
6.1 部署容器
[root@master01 ~]# kubectl run nginx --image=nginx
pod/nginx created
6.2 查看 Pod 的狀態信息
[root@master01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 0/1 ContainerCreating 0 50s
[root@master01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 109s# ContainerCreating:正在創建中
# Running:創建完成,運行中[root@master01 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 2m26s 10.244.0.4 192.168.190.102 <none> <none>
# READY為1/1,表示這個Pod中有1個容器
7. 訪問頁面
在對應網段的 node 節點上操作,可以直接使用瀏覽器或者 curl 命令訪問
[root@node01 ~]# curl 10.244.0.4
8. 查看日志?
在master01節點上查看nginx日志
[root@master01 ~]# kubectl logs nginx
10.244.0.1 - - [15/May/2024:10:41:13 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
四、部署 Dashboard
1.?Dashboard 簡介
儀表板是基于 Web 的 Kubernetes 用戶界面,用于部署、故障排除和管理容器化應用程序和集群資源。通過儀表板,您可以概述應用程序狀態、創建/修改 Kubernetes 資源,執行滾動更新、重啟 Pod 等操作,并獲取資源狀態和錯誤信息。
2. 上傳生成鏡像包?
上傳 dashboard.tar 和 metrics-scraper.tar 至 node 節點 /opt/
2.1 分別在 node01、node02 節點生成鏡像
[root@node01 opt]# docker load -i dashboard.tar
69e42300d7b5: Loading layer 224.6MB/224.6MB
Loaded image: kubernetesui/dashboard:v2.0.0
[root@node01 opt]# docker load -i metrics-scraper.tar
57757cd7bb95: Loading layer 238.6kB/238.6kB
14f2e8fb1e35: Loading layer 36.7MB/36.7MB
52b345e4c8e0: Loading layer 2.048kB/2.048kB
Loaded image: kubernetesui/metrics-scraper:v1.0.4
[root@node01 opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest e784f4560448 11 days ago 188MB
quay.io/coreos/flannel v0.14.0 8522d622299c 2 years ago 67.9MB
k8s.gcr.io/coredns 1.7.0 bfe3a36ebd25 3 years ago 45.2MB
kubernetesui/dashboard v2.0.0 8b32422733b3 4 years ago 222MB
kubernetesui/metrics-scraper v1.0.4 86262685d9ab 4 years ago 36.9MB
busybox 1.28.4 8c811b4aec35 5 years ago 1.15MB
registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64 3.0 99e59f495ffa 8 years ago 747kB
3.?上傳 recommended.yaml 文件
在 master01 節點上操作,上傳 recommended.yaml 文件到 /opt/k8s 目錄中
[root@master01 ~]# cd /opt/k8s/
[root@master01 k8s]# rz -E
rz waiting to receive.
[root@master01 k8s]# vim recommended.yaml
……
spec:ports:- port: 443targetPort: 8443nodePort: 30001 # 添加type: NodePort # 添加
…… [root@master01 k8s]# kubectl apply -f recommended.yaml
4.?創建 service account 并綁定默認 cluster-admin 管理員集群角色
[root@master01 k8s]# kubectl create serviceaccount dashboard-admin -n kube-system
serviceaccount/dashboard-admin created
# 在 kube-system 命名空間下創建了一個名為 dashboard-admin 的服務賬戶
# 主要用于給 Pod 中運行的應用程序提供對 API 服務器的訪問憑證
[root@master01 k8s]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created
# 創建了一個集群角色綁定 (ClusterRoleBinding),它將名為 cluster-admin 的集群角色綁定到了之前創建的服務賬戶 dashboard-admin 上,且該服務賬戶位于 kube-system 命名空間
# cluster-admin 是一個非常強大的角色,擁有對整個集群的完全訪問權限。這意味著通過 dashboard-admin 服務賬戶運行的任何 Pod 都將擁有集群管理員權限。
[root@master01 k8s]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
# 列出 kube-system 命名空間下的所有 Secrets,并通過 awk 篩選出與 dashboard-admin 服務賬戶相關的 Secret 名稱(通常服務賬戶會自動生成一個 Secret 來存儲其訪問令牌)
# 根據上一步得到的 Secret 名稱,這個命令用來展示該 Secret 的詳細信息
Name: dashboard-admin-token-zwbg5
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name: dashboard-adminkubernetes.io/service-account.uid: 50dbe025-dcfe-4954-b430-e3fb70393679Type: kubernetes.io/service-account-tokenData
====
ca.crt: 1359 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IlNhajQyX1pHSXBZSm1uOVRDc3ROSWpfWFlPNFRwaDAwT3lpeFljeldYM3cifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tdGwybW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiN2JiNTc2MmUtNGMyOS00NjhkLTliM2EtYTUwYmU4NWZiNzhmIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.XqOPb-_MU-B3bh-JeYWbDMRGiG0VC5DWhNiZHXZGLy8Zwzt5IbbOCsrQdFg4SMQ4mQSd1bM3zd3X8QxiuhqFUdn8VmW2nABG0M0h8uI9RFZRQePJ4AOnVMXfgyZbqtuHqeDc3T4eX0-ZZvdkV3jc7bbYKf2byzC-pqnm73-XEk13RhNFahGGvt08AmzIUb6v6jiO85weKbrT3M_reKTarBv9SCaqo-fNms5UAfnOyGuPTObFQGqu6Tp21Gy1L4GsmGILM-IGvPRkqSgwc0cpjcFD9sJyG7-esrUvYOM_KPsTQn9G5rYRpYd4Ad40JLsKIBFJ7k72kLYHJV5l-_r0cQ
5.?使用輸出的 token 登錄 Dashboard
https://NodeIP:30001,建議使用360安全瀏覽器或者火狐瀏覽器
五、錯誤示例?
1. 錯誤狀態
[root@master01 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
192.168.190.102 NotReady <none> 2d12h v1.20.11
192.168.190.103 NotReady <none> 13h v1.20.11# kubernetes 集群中有兩個節點處于 NotReady 狀態,無法接受新的 Pod 部署
2. 錯誤原因
2.1 查看 ?kubelet 服務日志
節點 192.168.190.102 的 kubelet 服務無法更新節點狀態,因為無法連接到 192.168.190.200:6443
[root@node01 ~]# journalctl -f -u kubelet.service
-- Logs begin at 一 2024-05-13 10:23:14 CST. --
5月 16 10:53:04 node01 kubelet[59283]: E0516 10:53:04.821047 59283 kubelet_node_status.go:470] Error updating node status, will retry: error getting node "192.168.190.102": Get "https://192.168.190.200:6443/api/v1/nodes/192.168.190.102?timeout=10s": dial tcp 192.168.190.200:6443: connect: no route to host
5月 16 10:53:07 node01 kubelet[59283]: E0516 10:53:07.825185 59283 kubelet_node_status.go:470] Error updating node status, will retry: error getting node "192.168.190.102": Get "https://192.168.190.200:6443/api/v1/nodes/192.168.190.102?timeout=10s": dial tcp 192.168.190.200:6443: connect: no route to host
5月 16 10:53:10 node01 kubelet[59283]: E0516 10:53:10.833419 59283 reflector.go:138] object-"kube-system"/"flannel-token-qsnr6": Failed to watch *v1.Secret: failed to list *v1.Secret: Get "https://192.168.190.200:6443/api/v1/namespaces/kube-system/secrets?fieldSelector=metadata.name%3Dflannel-token-qsnr6&resourceVersion=2727": dial tcp 192.168.190.200:6443: connect: no route to host# journalctl: 是 Systemd 系統日志查詢工具,用于查看和管理 systemd 初始化系統產生的日志。
# -f: 參數表示跟隨模式,即在終端上持續顯示新的日志條目,這對于監視服務的實時運行狀況非常有用。
# -u kubelet.service: 指定查看 kubelet.service 這個 Systemd 單元的服務日志。kubelet 是 Kubernetes 的核心組件之一,負責在每個節點上運行容器,管理 pod 狀態并與 Kubernetes 主控進行通信。
2.2 檢查 keepalived 服務 vip
由于虛擬環境掛起,導致服務無響應,vip 可能會消失。由于配置文件 bootstrap.kubeconfig、kubelet.kubeconfig、kube-proxy.kubeconfig 指向 vip,重啟 keepalived 服務恢復。