在 Vultr 上部署 kubernetest 集群
原文地址 https://elfgzp.cn/2020/04/11/k8s-%E5%AD%A6%E4%B9%A0%E6%97%A5%E8%AE%B0-kubeadm-%E9%83%A8%E7%BD%B2-kubernetes-%E9%9B%86%E7%BE%A4.html
最近在學習 kubernetest 但是 Google 上有非常多的教程關于如何部署 kubernetes,
原本是想在自己買的 JD 和 HUAWEI 的 ECS 上面部署的,但是折騰了很久無果,無奈還是選用同一個云服務商提供的 ECS,在有 VPC 的條件下部署會更方便,
ECS 配置選擇
由于只是學習,筆者就不部署高可用的 k8s 集群了,所以準備一臺 Master 和 Node 節點,
由于 Master 至少需要 2 個 CPU 核心,這里選擇了 Vultr 上 2 核 4G 記憶體 配置的 ECS,

Node 節點配置當然是記憶體越大越好,當然只是處于學習的目的,這里就選擇與 Master 相同的配置,
國外的云服務廠商一般是沒有帶寬限制的,一般是按照流量計算的,這個配置有 3T 的流量是肯定夠的,
然后他的收費模式是按小時計算的這個配置 0.03 $ / h 相當于 0.21 ¥ / h,也就是每小時兩毛錢!就算你用一天也就四塊錢,
筆者打算在學習 k8s 的時候在部署兩個實體,不用了直接銷毀,豈不美哉,
新用戶的話還能免費到賬 100 $ ,這里是邀請的連接 Vultr Give $100,要是覺得還不錯的話可以試試,筆者是真的覺得他們的服務還不錯,所以給他們打個廣告,
這里選擇兩個 CentOS 7 Without SELinux 的實體,
SELinux 是 Linux 下的一個安全相關的軟體,為了方便學習和部署,我們直接關閉它,所以選擇 Without SELinux 就準備開始部署了,
注意在 Additional Features 處勾選 Enable Private Networking,讓 Vultr 為你的服務器分配內網 IP,
設定好兩個節點的 HostName 防止待會節點名稱沖突,

在 Deploy Now 之前將 Servers Qty 增加為 2 ,這樣就不用反復打開部署頁面了,直接部署兩個實體,
別被這 $20.00 /mo 嚇到了,這是每月 $20,我們只需要用完了及時銷毀就好,而且新用戶贈送的 100$ 可以用很久了,
ECS 環境配置
部署完成兩個實體后,就可以在 Instances 串列找到他們, (考慮到沒有使用過云服務的讀者,這里筆者講詳細一點,)

在點進這個實體可以在 Overview 找到他的登錄賬號密碼,默認用戶是 root,
然后在 Settings 可以看到這兩個實體的內網 IP,
這里筆者的兩個實體的內網如下:
| 實體 | 核心數 | 記憶體 | 內網 IP |
|---|---|---|---|
| Master | 2 | 4G | 10.24.96.3 |
| Node | 2 | 4G | 10.24.96.4 |
接下來就正式開始了,不過 ssh 進入系統后還需要做一些準備作業,
K8s 部署準備作業
首先避免不必要的麻煩,先關閉 CentOS 7 的防火墻,因為本身云服務廠商會有安全組,我們也可以通過配置安全組來實作網路安全防護,
systemctl disable firewalld && systemctl stop firewalld
若是前面在部署實體的時候沒有選擇 Without SELinux 這里則需要讓容器可以訪問主機檔案,需要輸入以下命令,
# 將 SELinux 設定為 permissive 模式(相當于將其禁用)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
我們還需要關閉 swap,至于為什么感興趣可以去搜一下,
swapoff -a
確保在 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 被設定為 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 來完成,要顯示加載它,請呼叫 modprobe br_netfilter,
modprobe br_netfilter
lsmod | grep br_netfilter
安裝 docker:
yum install -y docker
systemctl enable docker && systemctl start docker
筆者已經將上述步驟做成了腳本,可以查看 https://gist.github.com/elfgzp/02485648297823060a7d8ddbafebf140#file-vultr_k8s_prepare-sh,
為了快速進入下一步可以執行以下命令直接跳過準備操作,
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 的訪問問題,但是如果是國內的主機需要將 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 創建 k8s 集群
創建 k8s Master 節點
我們首先要在 Master 的實體上執行 kubeadm,但是我們先使用 kubeadm config print init-defaults 來看看它的默認初始化檔案,
kubeadm config print init-defaults
當然你也可以生成一個組態檔后,指定組態檔進行初始化:
kubeadm config print init-defaults > kubeadm.yaml
# 修改 kubeadm.yml
kubeadm init --config kubeadm.yaml
如果初始化失敗可以執行以下命令,進行重制:
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
接下來直接執行 kubeadm init 進行初始化,國內的主機可能需要修改 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
執行完成后,我們會得到以下輸出:
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 下,注意每次執行完成 kubeadm init 之后,組態檔都會變化,所以需要重新復制,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 用戶的話,可以直接利用環境變數指定組態檔:
echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' >> ~/.bashrc
. ~/.bashrc
接下來使用 kubectl get nodes 來查看節點的狀態:
NAME STATUS ROLES AGE VERSION
master1 NotReady master 6m52s v1.18.1
此時的狀態為 NotReady 當然這個狀態是對的,因為我們還沒有安裝網路插件,接下來安裝網路插件,這里是用的是 Weave 網路插件:
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
還有其他的網路插件可以參考官方檔案,Installing a Pod network add-on,
可以通過查看 Pods 狀態查看是否安裝成功:
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
如果發現 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 節點狀態就變為 Ready 了,
NAME STATUS ROLES AGE VERSION
master1 Ready master 6m52s v1.18.1
部署 Node 節點
部署 Node 節點同樣需要「準備階段」的作業,這里就不一一講解了,直接執行腳本:
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
我們需要執行 kubeadm 在 Master 節點初始化后輸出的 join 命令,如果不記得了,可以通過在 Master 執行以下命令重新獲得 join 命令,
kubeadm token create --print-join-command
kubeadm join {你的IP}:6443 --token m239ha.ot52q6goyq0pcadx --discovery-token-ca-cert-hash sha256:95283a2e81464ba5290bf4aeffc4376b6d708f506fcee278cd2a647f704ed55d
若加入時出現問題同樣可以使用 kubeadm rest 來重置,
kubeadm reset
當然 join 命令也是可以提供組態檔的,我們只需要在 Node 上執行以下命令就可以生成默認組態檔了,
kubeadm config print join-defaults > kubeadm-join.yaml
kubeadm join --config kubeadm-join.yaml
然后再次通過 kubectl 查看 nodes 狀態,如果希望在 Node 節點上執行的話,需要將 Master 上的 /etc/kubernetes/admin.conf 復制到 Node 節點上,
接下來我們驗證 Node 的狀態為 Ready 則加入成功:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready master 6m52s v1.18.1
node1 Ready <none> 29s v1.18.1
總結
以上就是在 Vultr 上使用 kubeadm 部署 k8s 集群的所有程序啦,當然也是踩了很多坑,特別是想在不同的云主機上部署,最侄訓是選擇使用同一個云服務商的 ECS,
參考檔案
Kubernetes權威指南:從Docker到Kubernetes實踐全接觸(第4版)
深入剖析Kubernetes
本文由博客一文多發平臺 OpenWrite 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/17558.html
標籤:其他
