天天看點

k8s之基于kubeadm搭建k8s叢集

寫在前面

你可能知道搭建k8s叢集的kind,minikube工具,但是他們都太簡單了,不能滿足生産級的要求,想要真正的部署生産級别的k8s叢集,我們還需要另外一個叢集管理工具kubeadm ,本文就一起看下如何使用該工具來搭建k8s叢集。

k8s之基于kubeadm搭建k8s叢集

1:部署架構圖

k8s之基于kubeadm搭建k8s叢集

節點說明:

Console,用來安裝kubectl工具,1核1G記憶體,操作k8s叢集,該機器隻是邏輯上的,如果隻是為了學習,可以直接在master node操作,真實的生産環境還是要有一個Console的
Master:Master Node,2核4G記憶體,如果資源充足也可以再多給些
Worker:Worker Node,1核1G記憶體,如果資源充足也可以再多給些
           

另外Flannel是叢集内部使用的網絡插件 ,用來建構内部的私有網絡。Docker Registry是Docker注冊中心,這個無需多說。

再看下我本地的環境:

Console:直接使用Master Node
Master:2核4G 192.168.64.131 Ubuntu 11.3.0
Worker:1核1G 192.168.64.132 Ubuntu 11.3.0
           

2:準備工作

以下操作如無特别說明均是在Master和Worker都要做。

2.1:修改主機名

k8s會通過主機名來識别節點,是以不可重複,如下我的修改結果:

Mastre:
    [email protected]:~/k8s$ cat /etc/hostname 
    mongodaddy
Worker:
    dongy[email protected]:~/k8s/images$ cat /etc/hostname 
    mongomummy
           

2.2:修改docker配置

[email protected]:~/k8s$ cat /etc/docker/daemon.json
{
  "registry-mirrors": ["https://8csof3cn.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
     "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
           

其中

"exec-opts": ["native.cgroupdriver=systemd"]

修改cgroup比較重要,不過你可以直接複制我的,畢竟我也是直接複制别人的。

2.3:修改iptables

因為k8s需要建構自己的網絡系統,為了能夠讓其轉發網絡流量,是以需要做此修改,如下:

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
EOF

sudo sysctl --system
           

2.4:關閉swap

該操作的目的是,避免記憶體操作可能發生的IO,提升k8s性能,如下:

sudo swapoff -a && sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab
           

到這裡,為了讓配置生效,我們最好重新開機下系統。

2.5:安裝kubeadm

如下:

sudo apt install -y apt-transport-https ca-certificates curl

curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

sudo apt update

sudo apt install -y kubeadm=1.23.3-00 kubelet=1.23.3-00 kubectl=1.23.3-00

kubeadm version
kubectl version --client
           
k8s之基于kubeadm搭建k8s叢集

最後執行如下指令,避免版本意外更新:

sudo apt-mark hold kubeadm kubelet kubectl
           

3:正式安裝

3.1:下載下傳kubeletes元件鏡像

為了加快下載下傳的速度,我們可以提前從minikube中擷取需要的鏡像,然後docker load到本地,如下檢視需要的鏡像:

kubeadm config images list --kubernetes-version v1.23.3

k8s.gcr.io/kube-apiserver:v1.23.3
k8s.gcr.io/kube-controller-manager:v1.23.3
k8s.gcr.io/kube-scheduler:v1.23.3
k8s.gcr.io/kube-proxy:v1.23.3
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.1-0
k8s.gcr.io/coredns/coredns:v1.8.6
           

然後我們就可以從minikube的虛拟主機中将鏡像通過

docker save

,生成鏡像tar如

docker save dongsir2018/test-push-dockerhub:0.1 -o /home/dongyunqi/push.tar

,然後通過

minikube cp

,如

minikube cp minikube:/home/docker/etcd.tar /home/dongyunqi/k8s/allimages/etcd.tar

拷貝到主控端,最後通過

docker load -i

,如

docker load -i pause.tar

加載鏡像,參考下圖:

k8s之基于kubeadm搭建k8s叢集

如果你覺得麻煩也可以,也可以從以下位址下載下傳:

coredns , pause , kube-scheduler , kube-proxy , kube-controller-manager , kube-apiserver , etcd 。

3.2:Master節點操作

使用

kubeadm init

建立k8s叢集:

sudo kubeadm init \
    --pod-network-cidr=10.10.0.0/16 \
    --apiserver-advertise-address=你的master IP位址 \
    --kubernetes-version=v1.23.3
           

安裝成功後會有如下輸出:

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
           

目的是将kubetcl的配置檔案替換為k8s的版本,直接執行上述指令即可。另外

kubeadm join

提示資訊要儲存好,後續Worker加入叢集的時候會用到,可能如下:

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.64.131:6443 --token whzch5.wkwijvkqo5xgyswm \
	--discovery-token-ca-cert-hash sha256:b51aed32be23df09e5afe6fe1f6c2033ded3b246339a4c599837f3857c1173dc
           

執行完成後我們就可以檢視叢集的節點了,如下:

[email protected]:~/k8s$ kubectl get node
NAME         STATUS   ROLES                  AGE    VERSION
mongodaddy   NotReady    control-plane,master   16h    v1.23.3
           

可以看到此時隻有一個主機名為

mongodaddy

的節點,也就是我們的Master節點,Status是

NotReady

,這是因為目前k8s的網絡環境沒有建立完成,需要安裝網絡插件,來讓k8s的網絡恢複正常,這裡使用Flannel,首先我們需要Flannel的yaml,可以從這裡 或者是這裡 下載下傳,但是注意如下

net-conf.json

部分内容

net-conf.json: |
    {
      "Network": "10.10.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
           

中的Network一定要和上面執行kubeadm init設定的

--pod-network-cidr

一緻,因為都是k8s叢集中的網絡位址。然後執行

kubectl apply -f kube-flannel.yml

,稍等一會再執行

kubectl get node

Master Node就恢複正常了,如下:

[email protected]:~/k8s$ kubectl get node
NAME         STATUS   ROLES                  AGE    VERSION
mongodaddy   Ready    control-plane,master   16h    v1.23.3
           

此時我們的k8s叢集就建立成功了,隻不過master node還是光杆司令。

3.3:Worker節點操作

隻需要執行join指令就可以了,如下:

[email protected]:~/k8s/images$ sudo kubeadm join 192.168.64.131:6443 --token whzch5.wkwijvkqo5xgyswm \
> --discovery-token-ca-cert-hash sha256:b51aed32be23df09e5afe6fe1f6c2033ded3b246339a4c599837f3857c1173dc
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
W0109 11:35:48.242996   55928 utils.go:69] The recommended value for "resolvConf" in "KubeletConfiguration" is: /run/systemd/resolve/resolv.conf; the provided value is: /run/systemd/resolve/resolv.conf
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
           

然後到

Master Node

檢視結果:

[email protected]:~/k8s$ kubectl get node
NAME         STATUS   ROLES                  AGE    VERSION
mongodaddy   Ready    control-plane,master   16h    v1.23.3
mongomummy   Ready    <none>                 145m   v1.23.3
           

到這裡,操作就全部完成了。

寫在後面

參考文章清單:

繼續閱讀