最近在學習 kubernetest
可是 Google 上有很是多的教程關於如何部署 kubernetes
。node
本來是想在本身買的 JD
和 HUAWEI
的 ECS
上面部署的,可是折騰了好久無果。無奈仍是選用同一個雲服務商提供的 ECS,在有 VPC
的條件下部署會更方便。linux
因爲只是學習,筆者就不部署高可用的 k8s
集羣了,因此準備一臺 Master
和 Node
節點。 git
因爲 Master
至少須要 2 個 CPU 核心。這裏選擇了 Vultr
上 2 核 4G 內存
配置的 ECS
。github
Node
節點配置固然是內存越大越好,固然只是處於學習的目的,這裏就選擇與 Master
相同的配置。 web
國外的雲服務廠商通常是沒有帶寬限制的,通常是按照流量計算的,這個配置有 3T
的流量是確定夠的。 docker
而後他的收費模式是按小時計算的這個配置 0.03 $ / h
至關於 0.21 ¥ / h
,也就是每小時兩毛錢!就算你用一天也就四塊錢。 api
筆者打算在學習 k8s
的時候在部署兩個實例,不用了直接銷燬,豈不美哉。 安全
新用戶的話還能免費到帳 100 $
,這裏是邀請的鏈接 Vultr Give $100,要是以爲還不錯的話能夠試試,筆者是真的以爲他們的服務還不錯,因此給他們打個廣告。 bash
這裏選擇兩個 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$
能夠用好久了。
部署完成兩個實例後,就能夠在 Instances
列表找到他們。 (考慮到沒有使用過雲服務的讀者,這裏筆者講詳細一點。)
在點進這個實例能夠在 Overview
找到他的登陸帳號密碼,默認用戶是 root
。
而後在 Settings
能夠看到這兩個實例的內網 IP
。
這裏筆者的兩個實例的內網以下:
實例 | 核心數 | 內存 | 內網 IP |
---|---|---|---|
Master | 2 | 4G | 10.24.96.3 |
Node | 2 | 4G | 10.24.96.4 |
接下來就正式開始了,不過 ssh
進入系統後還須要作一些準備工做。
首先避免沒必要要的麻煩,先關閉 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複製代碼
筆者已經將上述步驟作成了腳本,能夠查看 gist.github.com/elfgzp/0248…。 爲了快速進入下一步能夠執行如下命令直接跳過準備操做。
curl https://gist.githubusercontent.com/elfgzp/02485648297823060a7d8ddbafebf140/raw/781c2cd7e6dba8f099e2b6b1aba9bb91d9f60fe2/vultr_k8s_prepare.sh | sh複製代碼
接下來的步驟能夠徹底參考官方文檔來了,官方文檔連接。
# 配置 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複製代碼
上述操做的腳本,gist.github.com/elfgzp/0248…。
curl https://gist.githubusercontent.com/elfgzp/02485648297823060a7d8ddbafebf140/raw/#/vultr_k8s_prepare.sh | sh複製代碼
咱們首先要在 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版)
本文由博客一文多發平臺 OpenWrite 發佈!