4.2 K8S超級完整安裝配置

盛開的太陽發表於2022-02-28

前言: 採坑

k8s有3種安裝方式,如下所示:

  • minikube:這是一個k8s叢集模擬器,只有一個節點的叢集,只為了測試使用,master和node都在一臺機器上
  • 直接使用帶有容器功能的雲平臺安裝:這個可以採用阿里雲或者騰訊雲伺服器帶有容器功能的,這個的優點就是視覺化搭建,步驟簡單,完全不用自己去安裝了,缺點是收費。
  • 裸機安裝:至少有兩臺伺服器,一個主節點,一個工作節點。需要在即安裝k8s的元件。配置稍微麻煩點。

我因為是自己學習使用,所以採用裸機安裝。全程自己操作,我是通過在本機安裝虛擬機器,安裝了3臺虛擬機器,我的環境是mac筆記本。如果想要參考mac筆記本安裝虛擬機器,可以看這篇文章:https://www.cnblogs.com/ITPower/p/15906012.html


一. 環境準備

作業系統:macOS 筆記本

虛擬機器: Parallels

網路環境搭建:參考文章- https://www.cnblogs.com/ITPower/p/15906012.html

二. 叢集搭建

1、搭建環境需要的元件

1) master節點需要的元件

  • docker
  • kubectl:叢集命令列互動工具
  • kubeadm:叢集初始化工具

2)node節點需要的元件

  • docker
  • kubelet:管理pod的容器,確保他們健康穩定的執行
  • Kube-proxy: 網路代理,負責網路相關工作

2、開始搭建

第一步:設定每個節點的主機名

sudo hostnamectl set-hostname master
sudo hostnamectl set-hostname node1
sudo hostnamectl set-hostname node2

這條命令會刪除/etc/hostname檔案中的主機名,然後替換為新的主機名。系統會更新/etc/hosts檔案.

然後輸入名稱查詢是否已經變更了主機名

hostname

第二步:新增ip和主機名的對映關係

獲取伺服器的ip,並在宿主機訪問. 我的三臺虛擬機器的ip是

10.211.55.200
10.211.55.201
10.211.55.202

將ip和主機名的對映關係新增到3臺伺服器中,執行命令

sudo vim /etc/hosts

然後將下列程式碼拷貝進去

10.211.55.200 master
10.211.55.201 node1
10.211.55.202 node2

全部都配置好了以後,在三臺服務ping一下,看看是否能訪問通

ping master
ping node1
ping node2

能ping通就說明配置沒問題。

第三步:關閉所有節點的SELINUX

關閉所有節點的SELINUX, Redhat使用了SELinux來增強安全

setenforce 0  
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

上面兩個命令的含義:第一個是臨時關閉防火牆,不需要重啟服務;第二個是永久關閉防火牆,需要重啟。

驗證防火牆是否關閉成功

getenforce  或者 sestatus

SELINUX相關命令科普

sestatus # 查詢SELINUX的狀態

關閉selinux的方法有兩種:臨時關閉和永久關閉。

  1. 臨時關閉防火牆

    臨時關閉在重啟後會失效。

    臨時關閉命令:

    setenforce 0
    

    檢視是否關閉成功:

    getenforce
    

    臨時關閉報錯 setenforce: setenforce() failed ,問題是許可權不夠,我們需要管理員許可權才可以。要先獲取root許可權

    su  - root 
    setenforce  0
    
  2. 永久關閉防火牆

    編輯配置檔案 /etc/selinux/config 。需要重啟才可以生效

    sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
    

    我們常用的方法是,先配置臨時生效,再更改配置檔案。這樣就算伺服器重啟了,selinux也還是關閉的。

第四步:關閉所有節點的防火牆和swapoff

systemctl stop firewalld
systemctl disable firewalld

驗證防火牆的狀態

systemctl status firewalld

關閉swapoff

swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab

第五步:新增k8s安裝源和docker安裝源

新增k8s安裝源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

新增docker安裝源

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

第六步:安裝k8s元件

yum install -y kubelet kubeadm kubectl docker-ce

三臺伺服器都安裝。

第七步:啟動kubelet、docker,並設定開機啟動

systemctl enable kubelet
systemctl start kubelet
  
systemctl enable docker
systemctl start docker
  

Kubelet元件執行在Node節點上,維持執行中的Pods以及提供kuberntes執行時環境,主要完成以下使命:
1.監視分配給該Node節點的pods
2.掛載pod所需要的volumes
3.下載pod的secret
4.通過docker/rkt來執行pod中的容器
5.週期的執行pod中為容器定義的liveness探針
6.上報pod的狀態給系統的其他元件
7.上報Node的狀態

一定要檢查kubelet的狀態是否正常

systemctl daemon-reload
systemctl status kubelet
image

這是啟動成功的狀態。

我在啟動kubelet這裡遇到的麻煩,總是提示啟動失敗。各種排查都沒有找到原因。最後解除安裝重新安裝了,記錄一下解除安裝流程

第一步:我使用的yum install安裝的,所以解除安裝使用 yum remove

yum -y remove kubelet  //-y表示又詢問都是yes

第二步:檢視kubelet包在linux中是否存在

yum list kubelet

我們看到包還在,原因是軟體解除安裝了,並沒有刪除軟體包

第三步:檢查刪除的狀態

systemctl status kubelet

狀態提示:

Warning: kubelet.service changed on disk. Run 'systemctl daemon-reload' to reload units.

第四步:驗證刪除成功

執行systemctl daemon-reload

systemctl daemon-reload

執行完以後在查詢狀態

systemctl status kubelet

Unit kubelet.service could not be found.

第五步:重新安裝

yum -y install kubelet

第六步:啟動kubelet,並開機啟動

systemctl enable kubelet
systemctl start kubelet

第八步:修改docker配置

kuberneters官方推薦docker等使用systemd作為cgroupdriver,否則kubelet啟動不了

為什麼要修改docker的cgroup driver? https://www.cnblogs.com/architectforest/p/12988488.html

cat <<EOF > /etc/docker/daemon.json
{
    "registry-mirrors": ["https://registry.docker-cn.com"],
    "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

重啟docker

// 守護程式重啟
systemctl daemon-reload
systemctl restart docker

驗證docker的Cgroup是否是systemd

docker info |grep Cgroup

應該返回如下內容

[root@node1~]# docker info |grep Cgroup
Cgroup Driver: systemd
#docker驅動程式為 systemd

第九步:用kubeadm來初始化叢集(僅master節點執行)

注意:這個命令僅在master節點執行

什麼是kubeadm?

我們來看看官網的介紹

Kubeadm是一個工具,它提供kubeadm init和kubeadm join作為建立Kubernetes叢集的最佳實踐“快捷路徑”。

kubeadm執行必要的操作來啟動和執行最小可行叢集。按照設計,它只關心引導,而不關心配置機器。同樣,安裝各種漂亮的外掛(比如Kubernetes Dashboard、監控解決方案和特定於雲的外掛)也不在討論範圍之內。

相反,我們期望在kubeadm的基礎上構建更高階、更定製化的工具,理想情況下,使用kubeadm作為所有部署的基礎將使建立符合規範的叢集變得更容易。

kubeadm 讓k8s使用容器化的方案執行。

1)初始化叢集控制檯, 失敗了可以用kubeadm reset重置

注意:只在主節點執行
kubeadm init --kubernetes-version=1.23.4 \
--apiserver-advertise-address=10.211.55.200 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
  
  • 執行了這個命令以後,會幫我們建立叢集的控制檯

  • --image-repository registry.aliyuncs.com/google_containers 指定映象源,由於kubeadm 預設從官網k8s.grc.io下載所需映象,國內無法訪問,因此需要通過--image-repository指定阿里雲映象倉庫地址

  • --kubernetes-version:版本資訊 kubectl version 查詢

  • 定義POD的網段為: 10.244.0.0/16

  • apiserver地址就是master本機IP地址

  • --service-cidr=10.96.0.0/12 : 這個引數後的IP地址直接就套用10.96.0.0/12 ,以後安裝時也套用即可,不要更改

    --pod-network-cidr=10.244.0.0/16 : k8s內部的pod節點之間網路可以使用的IP段,不能和service-cidr寫一樣,如果不知道怎麼配,就先用這個10.244.0.0/16

初始化失敗的可以重置,使用命令

kubeadm reset

重置以後會有這樣一段提示

The reset process does not clean your kubeconfig files and you must remove them manually.
Please, check the contents of the $HOME/.kube/config file.

意思是kubeadm reset 執行後不會刪除$HOME/.kube檔案,需要手動執行rm -rf $HOME/.kube

然後重新初始化。

初始化的過程中異常記錄

異常1:

image

It seems like the kubelet isn't running or healthy.

首先可以用命令檢查kubelet的狀態

systemctl status kubelet

狀態返回異常

image

然後看日誌,看看日誌包的什麼錯?

journalctl -xefu kubelet
image

日誌說的很清楚,沒有找到/var/lib/kubelet/config.yaml檔案

這個問題最後我解除安裝了kubelet,然後重新裝了一遍就好了。

最後,看到下面的內容,就表示安裝成功了

image

複製出來最後兩行, 並進行儲存

kubeadm join 10.211.55.200:6443 --token c8ysgy.uvo10ecrlqktmvft \
	--discovery-token-ca-cert-hash sha256:1ef77481c6c0efc18455e611d84567c3bb236da39cf98c2d0393c5454c4ba213

如果當時忘了複製,也沒有關係, 使用命令重新獲取

重新獲取token的命令:

kubeadm token create --print-join-command

第十步:複製授權檔案(僅master節點執行)

注意:這個授權檔案要去在root許可權下執行

複製授權檔案,以便kubectl有許可權訪問叢集
su - root
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

第十一步:將工作節點加入到叢集(僅在node節點執行)

將初始化主節點時生產的程式碼在node節點執行一下即可。

注意:要刪掉第一個行後面的“\”

kubeadm join 10.211.55.200:6443 --token c8ysgy.uvo10ecrlqktmvft --discovery-token-ca-cert-hash sha256:1ef77481c6c0efc18455e611d84567c3bb236da39cf98c2d0393c5454c4ba213

在兩個node節點都執行一遍

異常問題記錄

異常1:

/proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1

這時我們手動設定這個為1

echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

當多次調整都不成功的時候,可以重新獲取一下token

kubeadm token create --print-join-command

看到如下結果就成功了:

image

接下來可以使用kubectl來檢視子節點

kubectl get node
image

我們看到有一個master節點,兩個node節點。他們的狀態都是NotReady ;master節點是一個控制平臺,並且是主節點。

第十二步:安裝網路外掛(在master上安裝)

為什麼上面節點都是NotReady呢?因為我們還需要安裝一個網路外掛,他們才能工作。

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 

安裝成功的圖如下:

image

然後再檢視節點狀態

kubectl get node
image

現在就都是ready狀態了。

相關文章