本文基於Mac平臺和Parallels軟體,在其中建立三個Ubuntu系統,搭建了一個3個節點(1個master和2個Node)的K8s叢集。下面的步驟沒有特殊說明,都是需要在所有節點上分別執行的。也可以在一個虛擬機器器上執行完之後,複製當前虛擬機器器作為其他節點。
基於Parallels虛擬機器器軟體,在其中安裝三個ubuntu系統,後續用於建立K8s叢集的master節點和兩個Node節點,三個節點均採用靜態ip,具體設定如下:
Master節點:192.168.31.200 master
Node1節點:192.168.31.201 node1
Node2節點:192.168.31.202 node2
需要在三個節點上分別設定,下面以master為例:
修改虛擬機器器網路為橋接模式:
在Master節點執行
sudo hostnamectl set-hostname master
其他節點分別執行
sudo hostnamectl set-hostname node1
sudo hostnamectl set-hostname node2
方便節點之間相互存取,在每個節點的/etc/hosts
上新增如下設定:
192.168.31.200 master
192.168.31.201 node1
192.168.31.202 node2
設定好之後,試下ping master、node1看能否正常存取。
安裝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
。
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
Docker,Kubernetes 等工具來執行一個容器時會呼叫元件(CRI)比如 containerd,CRI-O來來完成容器的建立、執行、銷燬等實際工作。Docker 使用的是 containerd 作為其執行時;Kubernetes 支援 containerd,CRI-O等,這些元件都遵循了 OCI 規範,並通過 runc 來實現與作業系統核心互動來完成容器的建立和執行。
他們之間的相互關係如下:
具體安裝步驟如下:
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates
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"
sudo apt update
sudo apt install -y containerd.io
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
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"
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
apt-mark 用於將軟體包標記/取消標記為自動安裝。 hold 選項用於將軟體包標記為保留,以防止軟體包被自動安裝、升級或刪除。這裡主要是為了防止kubelet等元件自動升級。
這步需要在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
輸入類似如下
在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
一般可以安裝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叢集搭建完畢, 下面可以進行一些基本測試。
這裡部署了一個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節點部署成功。
參考: