1, 虛擬機兩台
(ip按自己的網絡環境相應配置)(master/node)
vim /etc/hosts
機器IP | hostname |
---|---|
192.168.56.215 | k8s-master |
192.168.56.216 | k8s-node1 |
192.168.56.217 | k8s-node2 |
2, 關閉防火牆
(master/node)
systemctl stop firewalld
systemctl disable firewalld
3, 關閉selinux
(master/node)
setenforce 0 # 臨時關閉 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 永久關閉
(master/node)
swapoff -a # 臨時關閉;關閉swap主要是為了性能考慮 free # 可以通過這個命令查看swap是否關閉了 sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久關閉
5, 添加主機名與IP對應的關系
(master/node)
$ vim /etc/hosts #添加如下內容: 192.168.100.215 k8s-master 192.168.100.216 k8s-node1 #保存退出
6, 修改主機名(master/node)
k8s-master:
[root@localhost ~] hostname
localhost.localdomain
[root@localhost ~] hostname k8s-master ##臨時生效
[root@localhost ~] hostnamectl set-hostname k8s-master ##重啟后永久生效
k8s-node1:
[root@localhost ~] hostname
localhost.localdomain
[root@localhost ~] hostname k8s-node1 ##臨時生效
[root@localhost ~] hostnamectl set-hostname k8s-node1 ##重啟后永久生效
7,橋接設置
1, 網絡參數 修改參數
#沒有ipvs cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF #查詢 sysctl --system #啟動 ipvs cat >> /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF #配置生效 modprobe br_netfilter modprobe nf_conntrack modprobe nf_conntrack_ipv4 sysctl -p /etc/sysctl.d/k8s.conf #檢查 lsmod | grep nf_conntrack_ipv4 2,啟動 ipvs cat > /etc/sysconfig/modules/ipvs.modules << EOF #!/bin/bash ipvs_modules_dir="/usr/lib/modules/\$(uname -r)/kernel/net/netfilter/ipvs"
for kernel_module in \$(ls \$ipvs_modules_dir | sed -r 's@(.*).ko.xz@\1@'); do
/sbin/modinfo -F filename \$kernel_module &> /dev/null
echo $kernel_module >> /etc/modules-load.d/ipvs.conf if [ \$? -eq 0 ]; then
/sbin/modprobe \$kernel_module fi
done
EOF 注意: 啟動IPVS服務 第2章節 詳見 3.10-linux一下內核,使用k8s-1.18以上版本 啟動IPVS可能會報錯 錯誤處理 詳見 雖然k8s所支持的ipvs模塊不是太多,在這里我們選擇全部加載 由於不同的內核版本的模塊后綴不一樣,所以我們要確認模塊的后綴到底是什么,對於3.X版本的內核,該模塊的后綴是 xx.ko.xz,而對於4.X版本的內核的后綴是 xx.ko
修改文件權限,並手動為當前系統加載內核模塊:
chmod +x /etc/sysconfig/modules/ipvs.modules bash /etc/sysconfig/modules/ipvs.modules 查看是否加載成功 lsmod | grep ip_vs #檢查 lsmod | grep nf_conntrack p.s.
以上幾步最好照着都執行一下,以免后面報一大堆錯*
8, 安裝docker
1 (master/node) 2
3 添加軟件源 4 $yum install -y yum-utils device-mapper-persistent-data lvm2 5 6 $ yum -y install wget
7 # 添加docker yum源 8 $ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O/etc/yum.repos.d/docker-ce.repo
9 #查看可用版本 10 $yum list docker-ce --showduplicates 11 # 安裝 12 $ yum -y install docker-ce-18.09.9-3.el7 13 # 設置開機啟動 14 $ systemctl enable docker 15 # 啟動docker 16 $ systemctl start docker 17 如果無法安裝 18
19 或者 20 yum install -y --setopt=obsoletes=0 docker-ce-18.09.9-3.el7 21 #添加 --setopt=obsoletes=0
22 #是一個忽略廢棄策略的參數 23 基本配置 24
25 修改配置信息 26
27 # vim /usr/lib/systemd/system/docker.service 28 ... 29 ExecStart=/usr/bin/dockerd --exec-opt native.cgroupdriver=systemd -H fd:// --containerd=/run/containerd/containerd.sock
30 ... 31 #添加 32 --exec-opt native.cgroupdriver=systemd
33 添加docker軟件源 34
35 sudo mkdir -p /etc/docker 36 sudo tee /etc/docker/daemon.json <<-'EOF'
37 { 38 "registry-mirrors": ["https://******.mirror.aliyuncs.com"] 39 } 40 EOF 41 sudo systemctl daemon-reload 42 sudo systemctl restart docker
9,添加阿里雲YUM軟件源
1 cat > /etc/yum.repos.d/kubernetes.repo << EOF 2 [k8s] 3 name=k8s 4 enabled=1
5 gpgcheck=0
6 baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
7 EOF
10,安裝kubeadm,kubelet和kubectl
1 #版本可以選擇自己要安裝的版本號,目前最新是1.19.2,我安裝的是1.18.0
2 $ yum install -y kubelet-1.18.0 kubectl-1.18.0 kubeadm-1.18.0
3 # 此時,還不能啟動kubelet,因為此時配置還不能,現在僅僅可以設置開機自啟動 4 $ systemctl enable kubelet
5 kubelet配置 6 7 配置cgroup 8 9 # 獲取 docker 的 cgroups 10 11 DOCKER_CGROUPS=$(docker info | grep 'Cgroup' | cut -d' ' -f3) 12 13 echo $DOCKER_CGROUPS 14 15 # 配置 kubelet 的 cgroups 16 17 cat > /etc/sysconfig/kubelet << EOF 18 KUBELET_EXTRA_ARGS="--cgroup-driver=$DOCKER_CGROUPS --fail-swap-on=false"
19 EOF 20 21 #手動 22 KUBELET_EXTRA_ARGS="--cgroup-driver=systemd --fail-swap-on=false"
23 "--cgroup-driver=systemd --fail-swap-on=false"
24 服務自啟動 25
26 $systemctl enable kubelet
27 注意:
28
29 --cgroup-driver= 屬性很重要,否則的話,集群初始化的時候,會發生如下報錯: 30
31 Error while processing event ("/sys/fs/cgroup/devices/libcontainer_...): inoti
32
33 fy_add_watch /sys/fs/cgroup/devices/libcontainer_...: no such file or directory 34
35 因為新版的k8s不支持開啟swap,所以要附加 --fail-swap-on=false 禁用swap
11,部署Kubernetes (master)
1 部署Kubernetes (master) 2 node節點不需要kubeadm init 3 4 kubeadm init 5 6 kubeadm init \ 7 --apiserver-advertise-address=10.0.8.10 \ 8 --image-repository registry.aliyuncs.com/google_containers \ 9 --kubernetes-version v1.18.0 \ 10 --service-cidr=10.1.0.0/16 \ 11 --pod-network-cidr=10.244.0.0/16 12 成功后末尾輸出信息如下: 13 14 kubeadm join 10.0.8.10:6443 --token o07ylk.rsb5hbcingulujzy \ 15 --discovery-token-ca-cert-hash sha256:7b8ae247026495075b00ae2c0b64d2fa3760dbddba4872fc44f8c17f23dc2a78 16
p.s.這里是通過kubeadm init安裝,所以執行后會下載相應的docker鏡像,
一般會發現在控制台卡着不動很久,這時就是在下載鏡像,你可以docker images查看是不是有新的鏡像增加。 17 18 查看安裝的鏡像 19 20 $ docker images 21 REPOSITORY TAG IMAGE ID CREATED SIZE 22 registry.aliyuncs.com/google_containers/kube-proxy v1.17.0 7d54289267dc 7 months ago 116MB 23 registry.aliyuncs.com/google_containers/kube-apiserver v1.17.0 0cae8d5cc64c 7 months ago 171MB 24 registry.aliyuncs.com/google_containers/kube-controller-manager v1.17.0 5eb3b7486872 7 months ago 161MB 25 registry.aliyuncs.com/google_containers/kube-scheduler v1.17.0 78c190f736b1 7 months ago 94.4MB 26 registry.aliyuncs.com/google_containers/coredns 1.6.5 70f311871ae1 8 months ago 41.6MB 27 registry.aliyuncs.com/google_containers/etcd 3.4.3-0 303ce5db0e90 9 months ago 288MB 28 registry.aliyuncs.com/google_containers/pause 3.1 da86e6ba6ca1 2 years ago 742kB
12,使用kubectl工具
1 kubeadm安裝好后,控制台也會有提示執行以下命令,照着執行 2 3 mkdir -p $HOME/.kube 4 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 5 sudo chown $(id -u):$(id -g) $HOME/.kube/config 6 測試一下kubectl命令 7 8 [root@k8s-master ~]# kubectl get nodes 9 NAME STATUS ROLES AGE VERSION 10 k8s-master NotReady master 23m v1.18.0
13,安裝Pod網絡插件
1 kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
2 報錯:The connection to the server raw.githubusercontent.com was refused - did you specify the right host or port? 3 4 原因:外網不可訪問 解決辦法: 5 6 sudo vim /etc/hosts 7 #在/etc/hosts增加以下這條 8 199.232.28.133 raw.githubusercontent.com 9 10 重新執行上面命令,便可成功安裝!
14, node節點加入master
1 node 2 kubeadm join 10.0.8.10:6443 --token o07ylk.rsb5hbcingulujzy \ 3 --discovery-token-ca-cert-hash sha256:7b8ae247026495075b00ae2c0b64d2fa3760dbddba4872fc44f8c17f23dc2a78 4 5 在master查看 6
7 kubectl get nodes 8 NAME STATUS ROLES AGE VERSION 9 k8s-master Ready master 22m v1.18.0
10 k8s-node1 Ready <none> 18m v1.18.0
11 注意 12 安裝時注意自己安裝的程序版本 13 14 k8s組件也是以docker容器的形式存在,所以會下載很多dokcer image 15 16 一般安裝不會在勝利,會出現不少問題,用tailf /var/log/messages跟蹤下日志 17 18 最好把幾台機器系統時間同步下,節點通訊中的token與時間也有關
第二,其他環境
1, 開啟ipvs
1 檢查配置信息 2
3 $ kubectl get cm -n kube-system 4 ..... 5 NAME DATA AGE 6 coredns 1 10h 7 extension-apiserver-authentication 6 10h 8 kube-flannel-cfg 2 10h 9 kube-proxy 2 10h 10 kubeadm-config 2 10h 11 kubelet-config-1.18 1 10h 12 ..... 13 修改配置信息 14
15 $ kubectl edit configmap kube-proxy -n kube-system 16 ... 17 mode: "ipvs"
18 ... 19 獲取所有kube-proxy 20
21 $ kubectl get pods -n kube-system | proxy 22 23 kube-proxy-dqwcm 1/1 Running 4 97m 24 kube-proxy-lfhzt 1/1 Running 4 98m 25 kube-proxy-v28m7 1/1 Running 4 97m 26 27 重啟所有proxy 28
29 手動 30 $ kubectl delete pods kube-proxy-dqwcm -n kube-system 31 32 自動 33 重啟所有proxy 34 proxy_list=$(kubectl get pod -n kube-system | grep kube-proxy | awk '{print $1}') 35 for pod in $proxy_list 36 do
37 kubectl delete pod $pod -n kube-system 38 done
39 40 查看日志 是否成功 41
42 $ kubectl logs kube-proxy-dqwcm -n -system 43
2, 測試環境
1 啟動NGINX 2
3 #啟動Nginx 4 kubectl run nginx --image=nginx 5 #創建 deployment 調度器 6 kubectl crate deployment nginx --image=nginx 7 #映射端口 8 kubectl expose deployment nginx --port=80 --type=NodePort 9 #查看 10 kubectl get all 11
12 查看你的端口號: 假設9000 13
14 瀏覽器打開 15 http//192.168.56.101:9000
故障排查
1 K8S在kubeadm init后,沒有記錄kubeadm join如何查詢? 2
3 #再生成一個token即可 4 kubeadm token create --print-join-command 5 #下在的命令可以查看歷史的token 6 kubeadm token list 7 node節點kubeadm join失敗后,要重新join怎么辦? 8
9 #先執行 10 kubeadm -y reset 11 #再執行 12 kubeadm join xx..... 13 重啟kubelet 14
15 systemctl daemon-reload 16 systemctl restart kubelet 17 查詢 18
19 #查詢節點 20 kubectl get nodes 21 #查詢pods 一般要帶上"-n"即命名空間。不帶等同 -n dafault 22 kubectl get pods -n kube-system
-
故障排查
一、故障產生
在不關閉kubernets相關服務的情況下,對kubernets的master節點進行重啟。(模擬服務器的異常掉電)
二、故障狀況
啟動后無法遠程到kubernets的dashbaord,后進行如下命令報錯。
1 # kubectl get nodes 2 The connection to the server <master>:6443 was refused - did you specify the right host or port?
ipvs 報錯
kubernetes 1.18+ 使用ipvs后coredns無法解析域名采坑記
升級到 kubernetes 1.18 版本出現 IPVS 報錯,所以去 Kubernetes Github 查看相關 issues,發現有人在升級
Kubernetes 版本到 1.18 后,也遇見了相同的問題,經過 issue 中 Kubernetes 維護人員討論,分析出原因可能為新版
Kubernetes 使用的 IPVS 模塊是比較新的,需要系統內核版本支持,本人使用的是 CentOS 系統,內核版本為 3.10,里面的
IPVS 模塊比較老舊,缺少新版 Kubernetes IPVS 所需的依賴。
根據該 issue 討論結果,解決該問題的辦法是,更新內核為新的版本。
> 注:該 issues 地址為 https://github.com/kubernetes/kubernetes/issues/89520
解決問題
-
參考 http://team.jiunile.com/blog/2020/05/k8s-1-18-ipvs-problem.html
升級系統內核版本
升級 Kubernetes 集群各個節點的 CentOS 系統內核版本:
# 載入公鑰
$ rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 安裝 ELRepo 最新版本
$ yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
# 列出可以使用的 kernel 包版本
$ yum list available --disablerepo=* --enablerepo=elrepo-kernel
# 安裝指定的 kernel 版本:
$ yum install -y kernel-lt-5.4.102-1.el7.elrepo --enablerepo=elrepo-kernel
# 查看系統可用內核
$ cat /boot/grub2/grub.cfg | grep menuentry
menuentry 'CentOS Linux (3.10.0-1062.el7.x86_64) 7 (Core)' --class centos (略)
menuentry 'CentOS Linux (5.4.102-1.el7.elrepo.x86_64) 7 (Core)' --class centos ...(略)
# 設置開機從新內核啟動
$ grub2-set-default "CentOS Linux (5.4.102-1.el7.elrepo.x86_64) 7 (Core)"
# 查看內核啟動項
$ grub2-editenv list
saved_entry=CentOS Linux (5.4.102-1.el7.elrepo.x86_64) 7 (Core)重啟系統使內核生效,啟動完成查看內核版本是否更新:
$ uname -r
5.4.102-1.el7.elrepo.x86_64查看是否解決
$ kubectl logs kube-proxy-dqwcm -n kube-system
[root@k8s-master ~]# kubectl logs kube-proxy-dqwcm -n kube-system
I0304 14:05:38.818316 1 node.go:136] Successfully retrieved node IP: 10.0.8.10
I0304 14:05:38.820216 1 server_others.go:259] Using ipvs Proxier.
W0304 14:05:38.820500 1 proxier.go:429] IPVS scheduler not specified, use rr by default
I0304 14:05:38.820685 1 server.go:583] Version: v1.18.0
I0304 14:05:38.820998 1 conntrack.go:52] Setting nf_conntrack_max to 131072
I0304 14:05:38.821793 1 config.go:315] Starting service config controller
I0304 14:05:38.821802 1 shared_informer.go:223] Waiting for caches to sync for service config
I0304 14:05:38.821812 1 config.go:133] Starting endpoints config controller
I0304 14:05:38.821820 1 shared_informer.go:223] Waiting for caches to sync for endpoints config
I0304 14:05:38.922200 1 shared_informer.go:230] Caches are synced for service config
I0304 14:05:38.924720 1 shared_informer.go:230] Caches are synced for endpoints config
故障處理:
1.檢查環境變量情況(正常)
env | grep -i kub
2.檢查docker服務(正常)
systemctl status docker.service
3.檢查kubelet服務(表面正常)
systemctl status kubelet.service
4.查看端口是是否被監聽(沒有監聽)
netstat -pnlt | grep 6443
5.檢查防火牆狀態(正常)
systemctl status firewalld.service
6.查看日志
journalctl -xeu kubelet
這里分析,應該是鏡像的問題。
6.1 重新導入一下API鏡像即可。
docker load -i kube-apiserver-amd64_v1.9.0.tar
6.2 重啟docker和kubelet服務
# systemctl restart docker.service
# systemctl restart kubelet.service
6.3 檢查服務(此時正常)
kubectl get nodes
至此,故障處理完成。
解決方法1: export KUBECONFIG=/etc/kubernetes/admin.conf export $HOME/.kube/config
解決方法2: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf HOME/.kube/config sudo chown (id -u):$(id -g) $HOME/.kube/config Alternatively you can also export KUBECONFIG variable like this: export KUBECONFIG=$HOME/.kube/config
解決方法3: #!/bin/bash swapoff -a systemctl start kubelet docker start (docker ps -a -q) docker start (docker ps -a -q)
解決方法4: sudo systemctl status firewalld #redhat centos sudo systemctl stop firewalld #redhat, centos sudo ufw status verbose #ubuntu sudo ufw disable #ubuntu
解決方法5: master: 192.168.211.40 node1: 192.168.211.41 node2: 192.168.211.42 master
———————————————— 版權聲明:
本文為CSDN博主「翟雨佳blogs」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yujia_666/article/details/114118291