在 Vultr 上部署 kubernetest 集群
最近在學(xué)習(xí) kubernetest
但是 Google 上有非常多的教程關(guān)于如何部署 kubernetes
居暖。
原本是想在自己買的 JD
和 HUAWEI
的 ECS
上面部署的三痰,但是折騰了很久無果。無奈還是選用同一個云服務(wù)商提供的 ECS车份,在有 VPC
的條件下部署會更方便亭螟。
ECS 配置選擇
由于只是學(xué)習(xí)边败,筆者就不部署高可用的 k8s
集群了,所以準(zhǔn)備一臺 Master
和 Node
節(jié)點漠畜。
由于 Master
至少需要 2 個 CPU 核心秀睛。這里選擇了 Vultr
上 2 核 4G 內(nèi)存
配置的 ECS
尔当。
Node
節(jié)點配置當(dāng)然是內(nèi)存越大越好,當(dāng)然只是處于學(xué)習(xí)的目的蹂安,這里就選擇與 Master
相同的配置椭迎。
國外的云服務(wù)廠商一般是沒有帶寬限制的,一般是按照流量計算的田盈,這個配置有 3T
的流量是肯定夠的畜号。
然后他的收費模式是按小時計算的這個配置 0.03 $ / h
相當(dāng)于 0.21 ¥ / h
,也就是每小時兩毛錢允瞧!就算你用一天也就四塊錢简软。
筆者打算在學(xué)習(xí) k8s
的時候在部署兩個實例,不用了直接銷毀述暂,豈不美哉替饿。
新用戶的話還能免費到賬 100 $
,這里是邀請的連接 Vultr Give $100贸典,要是覺得還不錯的話可以試試视卢,筆者是真的覺得他們的服務(wù)還不錯,所以給他們打個廣告廊驼。
這里選擇兩個 CentOS 7 Without SELinux
的實例据过。
SELinux
是 Linux
下的一個安全相關(guān)的軟件,為了方便學(xué)習(xí)和部署妒挎,我們直接關(guān)閉它绳锅,所以選擇 Without SELinux
就準(zhǔn)備開始部署了。
注意在 Additional Features
處勾選 Enable Private Networking
酝掩,讓 Vultr
為你的服務(wù)器分配內(nèi)網(wǎng) IP
鳞芙。
設(shè)置好兩個節(jié)點的 HostName
防止待會節(jié)點名稱沖突。
在 Deploy Now
之前將 Servers Qty
增加為 2
期虾,這樣就不用反復(fù)打開部署頁面了原朝,直接部署兩個實例。
別被這 $20.00 /mo
嚇到了镶苞,這是每月 $20
喳坠,我們只需要用完了及時銷毀就好,而且新用戶贈送的 100$
可以用很久了茂蚓。
ECS 環(huán)境配置
部署完成兩個實例后壕鹉,就可以在 Instances
列表找到他們剃幌。 (考慮到?jīng)]有使用過云服務(wù)的讀者,這里筆者講詳細一點晾浴。)
在點進這個實例可以在 Overview
找到他的登錄賬號密碼负乡,默認用戶是 root
。
然后在 Settings
可以看到這兩個實例的內(nèi)網(wǎng) IP
脊凰。
這里筆者的兩個實例的內(nèi)網(wǎng)如下:
實例 | 核心數(shù) | 內(nèi)存 | 內(nèi)網(wǎng) IP |
---|---|---|---|
Master | 2 | 4G | 10.24.96.3 |
Node | 2 | 4G | 10.24.96.4 |
接下來就正式開始了抖棘,不過 ssh
進入系統(tǒng)后還需要做一些準(zhǔn)備工作。
K8s 部署準(zhǔn)備工作
首先避免不必要的麻煩笙各,先關(guān)閉 CentOS 7
的防火墻钉答,因為本身云服務(wù)廠商會有安全組础芍,我們也可以通過配置安全組來實現(xiàn)網(wǎng)絡(luò)安全防護杈抢。
systemctl disable firewalld && systemctl stop firewalld
若是前面在部署實例的時候沒有選擇 Without SELinux
這里則需要讓容器可以訪問主機文件,需要輸入以下命令仑性。
# 將 SELinux 設(shè)置為 permissive 模式(相當(dāng)于將其禁用)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
我們還需要關(guān)閉 swap惶楼,至于為什么感興趣可以去搜一下。
swapoff -a
確保在 sysctl
配置中的 net.bridge.bridge-nf-call-iptables
被設(shè)置為 1诊杆。
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
確保已加載了 br_netfilter
模塊歼捐。這可以通過運行 lsmod | grep br_netfilter
來完成。要顯示加載它晨汹,請調(diào)用 modprobe br_netfilter
豹储。
modprobe br_netfilter
lsmod | grep br_netfilter
安裝 docker
:
yum install -y docker
systemctl enable docker && systemctl start docker
筆者已經(jīng)將上述步驟做成了腳本,可以查看 https://gist.github.com/elfgzp/02485648297823060a7d8ddbafebf140#file-vultr_k8s_prepare-sh淘这。
為了快速進入下一步可以執(zhí)行以下命令直接跳過準(zhǔn)備操作剥扣。
curl https://gist.githubusercontent.com/elfgzp/02485648297823060a7d8ddbafebf140/raw/781c2cd7e6dba8f099e2b6b1aba9bb91d9f60fe2/vultr_k8s_prepare.sh | sh
安裝 Kubeadm
接下來的步驟可以完全參考官方文檔來了,官方文檔鏈接铝穷。
# 配置 yum 源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
# 安裝 kubelet kubeadm kubectl
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# 啟動 kubelet
systemctl enable --now kubelet
由于 Vultr
是國外的云主機钠怯,所以我們根本不用考慮 Google
的訪問問題,但是如果是國內(nèi)的主機需要將 yum
源的 repo
修改為以下配置曙聂。
cat << EOF > /etc/yum.repos.d/kubernetes.repo
[kuebrnetes]
name=KubernetesRepository
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF
上述操作的腳本晦炊,https://gist.github.com/elfgzp/02485648297823060a7d8ddbafebf140#file-vultr_k8s_install_kubeadm-sh。
curl https://gist.githubusercontent.com/elfgzp/02485648297823060a7d8ddbafebf140/raw/#/vultr_k8s_prepare.sh | sh
使用 Kubeadm 創(chuàng)建 k8s 集群
創(chuàng)建 k8s Master 節(jié)點
我們首先要在 Master
的實例上執(zhí)行 kubeadm
宁脊。但是我們先使用 kubeadm config print init-defaults
來看看它的默認初始化文件断国。
kubeadm config print init-defaults
當(dāng)然你也可以生成一個配置文件后,指定配置文件進行初始化:
kubeadm config print init-defaults > kubeadm.yaml
# 修改 kubeadm.yml
kubeadm init --config kubeadm.yaml
如果初始化失敗可以執(zhí)行以下命令榆苞,進行重制:
kubeadm reset
rm -rf $HOME/.kube/config
rm -rf /var/lib/cni/
rm -rf /etc/kubernetes/
rm -rf /etc/cni/
ifconfig cni0 down
ip link delete cni0
接下來直接執(zhí)行 kubeadm init
進行初始化并思,國內(nèi)的主機可能需要修改 imageRepository
的配置,來修改 k8s
的鏡像倉庫语稠。
cat <<EOF > kubeadm.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
apiServer:
extraArgs:
runtime-config: "api/all=true"
kubernetesVersion: "v1.18.1"
imageRepository: registry.aliyuncs.com/google_containers
EOF
kubeadm init --config kubeadm.yaml
執(zhí)行完成后宋彼,我們會得到以下輸出:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join {你的IP}:6443 --token 3prn7r.iavgjxcmrlh3ust3 \
--discovery-token-ca-cert-hash sha256:95283a2e81464ba5290bf4aeffc4376b6d708f506fcee278cd2a647f704ed55d
按照他的提示弄砍,我們將 kubectl
的配置放到 $HOME/.kube/config
下,注意每次執(zhí)行完成 kubeadm init
之后输涕,配置文件都會變化音婶,所以需要重新復(fù)制。kubeadm
還會輸出 join 命令的配置信息莱坎,用于 Node
加入集群衣式。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
如果你們是使用 root
用戶的話,可以直接利用環(huán)境變量指定配置文件:
echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' >> ~/.bashrc
. ~/.bashrc
接下來使用 kubectl get nodes
來查看節(jié)點的狀態(tài):
NAME STATUS ROLES AGE VERSION
master1 NotReady master 6m52s v1.18.1
此時的狀態(tài)為 NotReady
當(dāng)然這個狀態(tài)是對的檐什,因為我們還沒有安裝網(wǎng)絡(luò)插件碴卧。接下來安裝網(wǎng)絡(luò)插件,這里是用的是 Weave
網(wǎng)絡(luò)插件:
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
還有其他的網(wǎng)絡(luò)插件可以參考官方文檔乃正,Installing a Pod network add-on住册。
可以通過查看 Pods
狀態(tài)查看是否安裝成功:
kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-66bff467f8-br94l 1/1 Running 0 14m
kube-system coredns-66bff467f8-pvsfn 1/1 Running 0 14m
kube-system kube-proxy-b2phr 1/1 Running 0 14m
kube-system weave-net-8wv4k 2/2 Running 0 2m2s
如果發(fā)現(xiàn) STATUS
不是 Running
可以通過,kubectl logs
和 kubectl describe
命令查看詳細的錯誤信息瓮具。
kubectl logs weave-net-8wv4k -n kube-system weave
kubectl logs weave-net-8wv4k -n kube-system weave-npc
kubectl describe pods weave-net-8wv4k -n kube-system
此時的 Master
節(jié)點狀態(tài)就變?yōu)?Ready
了荧飞。
NAME STATUS ROLES AGE VERSION
master1 Ready master 6m52s v1.18.1
部署 Node
節(jié)點
部署 Node
節(jié)點同樣需要「準(zhǔn)備階段」的工作,這里就不一一講解了名党,直接執(zhí)行腳本:
curl https://gist.githubusercontent.com/elfgzp/02485648297823060a7d8ddbafebf140/raw/781c2cd7e6dba8f099e2b6b1aba9bb91d9f60fe2/vultr_k8s_prepare.sh | sh
curl https://gist.githubusercontent.com/elfgzp/02485648297823060a7d8ddbafebf140/raw/781c2cd7e6dba8f099e2b6b1aba9bb91d9f60fe2/vultr_k8s_install_kubeadm.sh | sh
我們需要執(zhí)行 kubeadm
在 Master
節(jié)點初始化后輸出的 join
命令叹阔。如果不記得了,可以通過在 Master
執(zhí)行以下命令重新獲得 join
命令传睹。
kubeadm token create --print-join-command
kubeadm join {你的IP}:6443 --token m239ha.ot52q6goyq0pcadx --discovery-token-ca-cert-hash sha256:95283a2e81464ba5290bf4aeffc4376b6d708f506fcee278cd2a647f704ed55d
若加入時出現(xiàn)問題同樣可以使用 kubeadm rest
來重置耳幢。
kubeadm reset
當(dāng)然 join
命令也是可以提供配置文件的,我們只需要在 Node
上執(zhí)行以下命令就可以生成默認配置文件了欧啤。
kubeadm config print join-defaults > kubeadm-join.yaml
kubeadm join --config kubeadm-join.yaml
然后再次通過 kubectl
查看 nodes
狀態(tài)睛藻,如果希望在 Node
節(jié)點上執(zhí)行的話,需要將 Master
上的 /etc/kubernetes/admin.conf
復(fù)制到 Node
節(jié)點上堂油。
接下來我們驗證 Node
的狀態(tài)為 Ready
則加入成功:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready master 6m52s v1.18.1
node1 Ready <none> 29s v1.18.1
總結(jié)
以上就是在 Vultr
上使用 kubeadm
部署 k8s
集群的所有過程啦修档,當(dāng)然也是踩了很多坑。特別是想在不同的云主機上部署府框,最終還是選擇使用同一個云服務(wù)商的 ECS吱窝。
參考文檔
Kubernetes權(quán)威指南:從Docker到Kubernetes實踐全接觸(第4版)
本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布!