K8S1.18 安裝教程


第一 ,詳細步驟

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 # 永久關閉

 

4, 關閉swap

 (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+ 使用ipvscoredns無法解析域名采坑記

升級到 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




免責聲明!

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



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