本文演示如何搭建一個(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] 部分要予以解決。

(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 查看一下:

(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)建成功。


