K8s - Kubernetes集群的安裝部署教程(CentOS系統(tǒng))

本文演示如何搭建一個(gè)三節(jié)點(diǎn)的 Kubernetes Cluster 集群(一個(gè) master 節(jié)點(diǎn)和兩個(gè) node 節(jié)點(diǎn)),并且這三臺(tái)服務(wù)器使用的都是 CentOS 7 系統(tǒng)。

一、準(zhǔn)備工作(三個(gè)節(jié)點(diǎn)都需要設(shè)置)

1,安裝 Docker

所有的節(jié)點(diǎn)都需要安裝 Docker,具體步驟可以參考我之前寫(xiě)的文章:

2,安裝 kubelet、kubeadm 和 kubectl

(1)我們需要在所有節(jié)點(diǎn)上安裝 kubelet、kubeadm 和 kubectl,它們作用分別如下:

  • kubeadm:用來(lái)初始化集群(Cluster)
  • kubelet:運(yùn)行在集群中的所有節(jié)點(diǎn)上,負(fù)責(zé)啟動(dòng) pod 和 容器。
  • kubectl:這個(gè)是 Kubernetes 命令行工具。通過(guò) kubectl 可以部署和管理應(yīng)用,查看各種資源,創(chuàng)建、刪除和更新各種組件。

(2)依次執(zhí)行下面命令進(jìn)行安裝這三個(gè)工具(為避免出現(xiàn)“網(wǎng)絡(luò)不可達(dá)”錯(cuò)誤,這里將谷歌的鏡像換成國(guó)內(nèi)鏡像):

cat <<EOF > /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes

baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64

enabled=1

gpgcheck=0

repo_gpgcheck=0

gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg[http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg](http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg)

exclude=kube*

EOF

# 將 SELinux 設(shè)置為 permissive 模式(將其禁用)

setenforce 0

sed -i ``'s/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

systemctl enable kubelet && systemctl start kubelet

3,修改 sysctl 配置

對(duì)于 RHEL/CentOS 7 系統(tǒng),可以會(huì)由于 iptables 被繞過(guò)導(dǎo)致網(wǎng)絡(luò)請(qǐng)求被錯(cuò)誤的路由。所以還需執(zhí)行如下命令保證 sysctl 配置中 net.bridge.bridge-nf-call-iptables 被設(shè)為1。

(1)使用 vi 命令編輯相關(guān)文件:
vi /etc/sysctl.conf

(2)在文件中添加如下內(nèi)容后,保存退出。

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

(3)最后執(zhí)行如下命令即可:

sysctl --system

4,關(guān)閉 swap

(1)首先執(zhí)行如下命令將其關(guān)閉:

swapoff -a

(2)接著編輯 /etc/fstab 文件。
vi /etc/fstab
(3)將 /dev/mapper/centos-swap swap swap default 0 0 這一行前面加個(gè) # 號(hào)將其注釋掉。

(4)編輯完畢后保存退出。這樣機(jī)器重啟后 swap 便不會(huì)又自動(dòng)打開(kāi)了。

二、Master 節(jié)點(diǎn)的安裝配置

1,初始化 Master

(1)我們?cè)?Master 上執(zhí)行如下命令進(jìn)行初始化:

注意:--pod-network-cidr=10.244.0.0/16 是 k8s 的網(wǎng)絡(luò)插件所需要用到的配置信息,用來(lái)給 node 分配子網(wǎng)段。然后我們這邊用到的網(wǎng)絡(luò)插件是 flannel,就是這么配。
kubeadm init --pod-network-cidr=10.244.0.0/16
(2)初始化的時(shí)候 kubeadm 會(huì)做一系列的校驗(yàn),以檢測(cè)你的服務(wù)器是否符合 kubernetes 的安裝條件,檢測(cè)結(jié)果分為 [WARNING] 和 [ERROR] 兩種。其中 [ERROR] 部分要予以解決。

image.png

(3)比如上圖我這里檢測(cè)到三個(gè) error:

  • Master 節(jié)點(diǎn)需要至少兩核 CPU:由于我用的是虛擬機(jī),關(guān)機(jī)后更改下虛擬機(jī)配置即可。
  • bridge-nf-call-iptables 這個(gè)參數(shù),需要設(shè)置為 1:如果我們前面做了準(zhǔn)備工作里的第三步,就不會(huì)有這個(gè)問(wèn)題了。
  • swap 需要關(guān)閉:執(zhí)行 swapoff -a 將其關(guān)閉即可。

(4)所有 error 解決后,再執(zhí)行最開(kāi)始的 init 命令后 kubeadm 就開(kāi)始安裝了。但通常這時(shí)還是會(huì)報(bào)錯(cuò),這是因?yàn)閲?guó)內(nèi) gcr.io無(wú)法訪問(wèn)(谷歌自己的容器鏡像倉(cāng)庫(kù)),造成鏡像下載不下來(lái)。

(5)我們可以通過(guò)國(guó)內(nèi)廠商提供的 kubernetes 的鏡像服務(wù)來(lái)下載,比如第一個(gè) k8s.gcr.io/kube-apiserver:v1.14.1 鏡像,可以執(zhí)行如下命令從阿里云下載:

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.14.1

(6)鏡像下載下來(lái)以后再通過(guò) docker tag 命令將其改成kudeadm安裝時(shí)候需要的鏡像名稱。
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.14.1 k8s.gcr.io/kube-apiserver:v1.14.1
(7)其它缺失的鏡像也依照上面步驟進(jìn)行操作。
(8)鏡像全部下載完畢后,再執(zhí)行最開(kāi)始的 init 命令后 kubeadm 就能成功安裝了。最后一行,kubeadm 會(huì)提示我們,其他節(jié)點(diǎn)需要加入集群的話,只需要執(zhí)行這條命令就行了,同時(shí)里面包含了加入集群所需要的 token(這個(gè)要記下來(lái))。

2,配置 kubectl

kubectl 是管理 Kubernetes 集群的命令行工具,前面我們已經(jīng)在所有的節(jié)點(diǎn)安裝了 kubectl。Master 初始化安裝完后需要做一些配置工作,然后 kubectl 就能使用了。
(1)具體操作就依照前面 kubeadm init 輸出的第一個(gè)紅框內(nèi)容。這里推薦使用使用普通用戶執(zhí)行 kubectl(root 會(huì)有一些問(wèn)題),首先我們新建個(gè)普通用戶 hangge,具體方法可以參考我之前寫(xiě)的文章:

(2)切換成 hangge 用戶
su - hangge
(3)依次執(zhí)行如下命令(即前面 kubeadm init 輸出的第一個(gè)紅框內(nèi)容),為 hangge 用戶配置 kubectl:
mkdir -p ``$HOME``/.kube

sudo cp -i /etc/kubernetes/admin.conf ``$HOME``/.kube/config

sudo ``chown $(id -u):$(id -g) ``$HOME``/.kube/config
(4)為了使用更加便捷,啟用 kubectl 命令的自動(dòng)補(bǔ)全功能。

echo "source <(kubectl completion bash)" >> ~/.bashrc

3,安裝 Pod 網(wǎng)絡(luò)

要讓 Kubernetes 集群能夠工作,必須安裝 Pod 網(wǎng)絡(luò),否則 Pod 之間無(wú)法通信。(即前面 kubeadm init 輸出的第二個(gè)紅框內(nèi)容)

Kubernetes 支持多種網(wǎng)絡(luò)方案,這里我們使用 flannel。執(zhí)行如下命令即可部署 flannel:

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

4,開(kāi)放端口

分別執(zhí)行下面兩條命令配置 firewall 防火墻策略,開(kāi)放相關(guān)端口:
firewall-cmd --permanent --add-port=6443/tcp

firewall-cmd --permanent --add-port=2379/tcp

firewall-cmd --permanent --add-port=2380/tcp

firewall-cmd --permanent --add-port=10250/tcp

firewall-cmd --permanent --add-port=10251/tcp

firewall-cmd --permanent --add-port=10252/tcp

firewall-cmd --reload

三、Node 節(jié)點(diǎn)的安裝配置

1,添加節(jié)點(diǎn)

(1)在兩個(gè) node 節(jié)點(diǎn)上分別執(zhí)行如下命令(即前面 kubeadm init 輸出的最后一個(gè)紅框內(nèi)容),將其注冊(cè)到 Cluster 中:

kubeadm join 192.168.60.128:6443 --token w5ndme.t66qlcrcw6l2j1k6 --discovery-token-ca-cert-hash sha256:890270a05467595010abc74718a53d95b13f0ba337a350ed4c52b1edcd47c2e8

(2)顯示如下內(nèi)容則說(shuō)明節(jié)點(diǎn)添加成功:

2,安裝鏡像

(1)在每一個(gè) node 節(jié)點(diǎn)上我們還需要下載 quay.io/coreos/flannel:v0.11.0-amd64、k8s.gcr.io/pause 和 k8s.gcr.io/kube-proxy 這三個(gè)鏡像,其中后面兩個(gè)鏡像具體版本可以執(zhí)行kubeadm config images list 查看一下:

image.png

(2)由于網(wǎng)絡(luò)問(wèn)題,后面兩個(gè)鏡像可能沒(méi)法自動(dòng)下載下來(lái)(第一個(gè)可以直接下載)。我們可以通過(guò)國(guó)內(nèi)廠商提供的 kubernetes 的鏡像服務(wù)來(lái)下載,再通過(guò) docker tag 命令將其改成kudeadm 需要的鏡像名稱。

docker pull quay.io/coreos/flannel:v0.11.0-amd64

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.14.1

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.14.1 k8s.gcr.io/kube-proxy:v1.14.1

3,開(kāi)放端口

10250 端口是一定要開(kāi)放的,如果控制節(jié)點(diǎn)也要運(yùn)行容器,也需要開(kāi)啟對(duì)應(yīng)的端口(30000-32767)

firewall-cmd --permanent --add-port=10250/tcp

firewall-cmd --reload

四、查看節(jié)點(diǎn)狀態(tài)

(1)在 master 節(jié)點(diǎn)上執(zhí)行 kubectl get nodes 查看節(jié)點(diǎn)狀態(tài):

(2)目前 node 節(jié)點(diǎn)還處于 NotReady 狀態(tài),這是因?yàn)槊總€(gè)節(jié)點(diǎn)都需要啟動(dòng)若干組件,這些組件都是在 Pod 中運(yùn)行,需要首先從 Google 下載鏡像。

(3)我們可以通過(guò)如下命令查看 Pod 狀態(tài)。CrashLoopBackOff、ContainerCreating、Init:0/1 等都表明 Pod 沒(méi)有就緒,只有 Running 才是就緒狀態(tài)。

kubectl get pod --all-namespaces

(4)我們也可以通過(guò) kubectl describe pod <Pod Name> 查看 Pod 的具體情況,比如我們查看 kube-proxy-96bz6 這個(gè) Pod 目前為何還沒(méi)就緒。

kubectl describe pod kube-proxy-96bz6 --``namespace``=kube-system

(5)結(jié)果如下,是由于下載 image 時(shí)失敗。這個(gè)可能是網(wǎng)絡(luò)問(wèn)題,我們可以繼續(xù)等待,因?yàn)?Kubernetes 會(huì)自動(dòng)重試。當(dāng)然我們也可以自己手動(dòng)執(zhí)行 docker pull 去下載這個(gè)鏡像。

注意:不一定都是 Master 節(jié)點(diǎn)下載鏡像失敗,還有可能是 node 節(jié)點(diǎn)上下載鏡像失敗,具體是哪里可以看前面部分信息。比如這里的 k8s.gcr.io/pause:3.1 就是 node 節(jié)點(diǎn)上沒(méi)下載下來(lái)。

(6)當(dāng)所有的 Pod 都處于 Running 狀態(tài)后,可以發(fā)現(xiàn)所有的節(jié)點(diǎn)也就準(zhǔn)備好了。至此 Kubernetes集群創(chuàng)建成功。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容