「K8s 學習日記」Kubeadm 部署 kubernetes 集羣

在 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.htmlhtml

最近在學習 kubernetest 可是 Google 上有很是多的教程關於如何部署 kubernetesnode

本來是想在本身買的 JDHUAWEIECS 上面部署的,可是折騰了好久無果。無奈仍是選用同一個雲服務商提供的 ECS,在有 VPC 的條件下部署會更方便。linux

ECS 配置選擇

因爲只是學習,筆者就不部署高可用的 k8s 集羣了,因此準備一臺 MasterNode 節點。 git

因爲 Master 至少須要 2 個 CPU 核心。這裏選擇了 Vultr2 核 4G 內存 配置的 ECSgithub

2c4g

Node 節點配置固然是內存越大越好,固然只是處於學習的目的,這裏就選擇與 Master 相同的配置。 web

國外的雲服務廠商通常是沒有帶寬限制的,通常是按照流量計算的,這個配置有 3T 的流量是確定夠的。 docker

而後他的收費模式是按小時計算的這個配置 0.03 $ / h 至關於 0.21 ¥ / h,也就是每小時兩毛錢!就算你用一天也就四塊錢。 api

筆者打算在學習 k8s 的時候在部署兩個實例,不用了直接銷燬,豈不美哉。 安全

新用戶的話還能免費到帳 100 $ ,這裏是邀請的鏈接 Vultr Give $100,要是以爲還不錯的話能夠試試,筆者是真的以爲他們的服務還不錯,因此給他們打個廣告。 bash

這裏選擇兩個 CentOS 7 Without SELinux 的實例。

SELinuxLinux 下的一個安全相關的軟件,爲了方便學習和部署,咱們直接關閉它,因此選擇 Without SELinux 就準備開始部署了。

注意在 Additional Features 處勾選 Enable Private Networking,讓 Vultr 爲你的服務器分配內網 IP

設置好兩個節點的 HostName 防止待會節點名稱衝突。

hostname

Deploy Now 以前將 Servers Qty 增長爲 2 ,這樣就不用反覆打開部署頁面了,直接部署兩個實例。

別被這 $20.00 /mo 嚇到了,這是每個月 $20,咱們只須要用完了及時銷燬就好,並且新用戶贈送的 100$ 能夠用好久了。

ECS 環境配置

部署完成兩個實例後,就能夠在 Instances 列表找到他們。 (考慮到沒有使用過雲服務的讀者,這裏筆者講詳細一點。)

ins2

在點進這個實例能夠在 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複製代碼

筆者已經將上述步驟作成了腳本,能夠查看 gist.github.com/elfgzp/0248…。 爲了快速進入下一步能夠執行如下命令直接跳過準備操做。

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複製代碼

上述操做的腳本,gist.github.com/elfgzp/0248…

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 logskubectl 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複製代碼

咱們須要執行 kubeadmMaster 節點初始化後輸出的 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 發佈!

相關文章
相關標籤/搜索