前言: 采坑
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的方法有兩種:臨時關閉和永久關閉。
臨時關閉防火牆
臨時關閉在重啟后會失效。
臨時關閉命令:
setenforce 0
查看是否關閉成功:
getenforce
臨時關閉報錯 setenforce: setenforce() failed ,問題是權限不夠,我們需要管理員權限才可以。要先獲取root權限
su - root setenforce 0
永久關閉防火牆
編輯配置文件 /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

這是啟動成功的狀態。
我在啟動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:

It seems like the kubelet isn't running or healthy.
首先可以用命令檢查kubelet的狀態
systemctl status kubelet
狀態返回異常

然后看日志,看看日志包的什么錯?
journalctl -xefu kubelet

日志說的很清楚,沒有找到/var/lib/kubelet/config.yaml文件
這個問題最后我卸載了kubelet,然后重新裝了一遍就好了。
最后,看到下面的內容,就表示安裝成功了
復制出來最后兩行, 並進行保存
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
看到如下結果就成功了:

接下來可以使用kubectl來查看子節點
kubectl get node

我們看到有一個master節點,兩個node節點。他們的狀態都是NotReady ;master節點是一個控制平台,並且是主節點。
第十二步:安裝網絡插件(在master上安裝)
為什么上面節點都是NotReady呢?因為我們還需要安裝一個網絡插件,他們才能工作。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
安裝成功的圖如下:

然后再查看節點狀態
kubectl get node

現在就都是ready狀態了。