Ubuntu 22.04 搭建K8s叢集

2022-12-10 06:00:39

本文基於Mac平臺和Parallels軟體,在其中建立三個Ubuntu系統,搭建了一個3個節點(1個master和2個Node)的K8s叢集。下面的步驟沒有特殊說明,都是需要在所有節點上分別執行的。也可以在一個虛擬機器器上執行完之後,複製當前虛擬機器器作為其他節點。

1. 虛擬機器器基礎設定

基於Parallels虛擬機器器軟體,在其中安裝三個ubuntu系統,後續用於建立K8s叢集的master節點和兩個Node節點,三個節點均採用靜態ip,具體設定如下:

  • Master節點:192.168.31.200 master

  • Node1節點:192.168.31.201 node1

  • Node2節點:192.168.31.202 node2

設定靜態ip

需要在三個節點上分別設定,下面以master為例:

修改虛擬機器器網路為橋接模式:

設定主機名

在Master節點執行

sudo hostnamectl set-hostname master

其他節點分別執行

sudo hostnamectl set-hostname node1
sudo hostnamectl set-hostname node2

設定hosts

方便節點之間相互存取,在每個節點的/etc/hosts上新增如下設定:

192.168.31.200 master
192.168.31.201 node1
192.168.31.202 node2

設定好之後,試下ping master、node1看能否正常存取。

安裝ssh

安裝ssh,方便後續連線到虛擬機器器執行cmd。

sudo apt update

sudo apt install openssh-server

sudo systemctl status ssh

# 如果遇到防火牆的問題,可以嘗試下面的command來允許ssh。

sudo ufw allow ssh

後續為了方便在多個terminal同時輸入command,可以使用iterm同時開啟三個視窗,然後輸入cmd + shift + I進入多個輸入的模式,如果需要退出,可以輸入⌘Command + ⇧Shift + ⌥Option + I

2. Ubuntu系統設定

禁用swap

sudo swapoff -a
sudo sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab

這步之後,最好重啟ubuntu系統保證修改生效。

修改核心引數

載入如下核心模組,

sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

相關資料參考:

設定下面的網路引數:

sudo tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

執行下面的command使改動生效:

sudo sysctl --system

3. 安裝containerd

Docker,Kubernetes 等工具來執行一個容器時會呼叫元件(CRI)比如 containerd,CRI-O來來完成容器的建立、執行、銷燬等實際工作。Docker 使用的是 containerd 作為其執行時;Kubernetes 支援 containerd,CRI-O等,這些元件都遵循了 OCI 規範,並通過 runc 來實現與作業系統核心互動來完成容器的建立和執行。

他們之間的相互關係如下:

具體安裝步驟如下:

  • 安裝dependencies:
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates
  • 新增docker repo:
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  • 安裝containerd
sudo apt update
sudo apt install -y containerd.io
  • 設定containerd使用systemd作為cgroup
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
  • 重啟並設定開機自啟
sudo systemctl restart containerd
sudo systemctl enable containerd

4. 安裝Kubernetes元件

新增apt repo

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"

安裝Kubectl, kubeadm & kubelet

sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

apt-mark 用於將軟體包標記/取消標記為自動安裝。 hold 選項用於將軟體包標記為保留,以防止軟體包被自動安裝、升級或刪除。這裡主要是為了防止kubelet等元件自動升級。

5. 初始化Master節點

這步需要在Master節點進行設定,執行如下的節點初始化整個k8s叢集。

sudo kubeadm init --control-plane-endpoint=192.168.31.200

當看到如下的輸出時,說明系統master節點初始化完成。

接著按照提示資訊,進行後續的初始化工作:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

完成上面的工作之後,可以嘗試執行下面的command來檢視當前叢集的狀態:

kubectl cluster-info
kubectl get nodes

輸入類似如下

6. 加入Node節點

在master節點的初始化輸出的最下面,會列出node節點加入的command,直接copy然後到每個node節點執行即可。下面是個例子,得換成實際的command,

sudo kubeadm join 192.168.31.200:6443 --token mjy0xx.95lsse7r7fw5sb00 
--discovery-token-ca-cert-hash sha256:73b92db9baf19a3e14d679e6d44b5c7a804902d6ffa3d170858d2ccfd5e0c93f

加入成功之後,可以檢視當前叢集的node狀態,此時由於沒有安裝網路相關外掛,所有節點出於NotReady的狀態。下一步會進行安裝。

kubectl get nodes

7. 設定叢集網路

一般可以安裝Calico、Flannel和Weave-net等外掛,下面以Calico為例進行操作。

curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O
kubectl apply -f calico.yaml

輸出結果大概如下:

此時可以檢視系統namespace下的所有基礎元件的執行情況,

kubectl get pods -n kube-system

接下來檢查節點狀態:

kubectl get nodes

至此,整個k8s叢集搭建完畢, 下面可以進行一些基本測試。

8. 測試K8s叢集

這裡部署了一個nginx的app來進行測試,

kubectl create deployment nginx-app --image=nginx --replicas=2

檢視nginx的狀態:

kubectl get deployment nginx-app

將deployment暴露出去,採用NodePort的方式(這種方式會在每個節點上開放同一個埠,外部可以通過節點ip+port的方式進行存取)

kubectl expose deployment nginx-app --type=NodePort --port=80

可以檢查service的狀態,

kubectl get svc nginx-app
kubectl describe svc nginx-app

下面是測試結果:

說明Nginx執行正常,整個k8s節點部署成功。


參考: