2023/09/16

搭建 Kubernetes Cluster Master Nodes & Worker Nodes

 Kubernetes是一個開源的容器管理平台,它被廣泛用於應用程式的部署、自動化運維和擴展。它由Google於2014年釋出,並且現在是由Cloud Native Computing Foundation(CNCF)支持和維護的一個項目。Kubernetes通常簡稱為K8s。


Kubernetes的重要性:


容器化應用程式: Kubernetes最初是為了解決容器化應用程式的部署和管理而設計的。它支持多種容器技術,最常見的是Docker。容器提供了獨立的運行環境,可以確保應用程式在不同環境中一致運行。


自動化和自我修復: Kubernetes提供了豐富的自動化功能,可以自動部署、擴展、升級和維護應用程式。它能夠檢測並恢復應用程式或節點的故障,從而實現高可用性。


擴展性: Kubernetes的架構非常靈活,可以在物理機器、虛擬機器和各種雲平台上運行。它可以輕鬆地擴展以應對不斷增長的工作負載。


服務發現和負載均衡: Kubernetes提供了服務發現和負載均衡的功能,使應用程式能夠輕鬆地找到和通信彼此。這對於微服務架構非常重要。


配置管理: Kubernetes可以幫助管理應用程式的配置,並支持不同環境之間的配置差異。這有助於確保應用程式在不同環境中的一致性。


Kubernetes的基本概念:


Pods(容器集): Pod是Kubernetes的最小部署單位,可以包含一個或多個容器。這些容器共享相同的網絡和存儲資源。


ReplicaSets和Deployments(複本集和部署): ReplicaSets和Deployments用於定義和管理應用程式的副本數量,以實現高可用性和擴展。


Services(服務): 服務定義了一個固定的入口點,使應用程式能夠通過名稱來訪問其他應用程式。


ConfigMaps和Secrets(配置映射和機密): ConfigMaps用於管理配置數據,而Secrets用於安全地管理敏感信息,如密碼和API金鑰。


Volumes(存儲卷): 存儲卷用於提供持久性存儲,以便容器之間共享數據。


Namespace(命名空間): 命名空間用於將集群劃分為多個虛擬區域,以隔離和組織不同應用程式或團隊的資源。


Configurations(配置): 配置文件用於定義和管理Kubernetes資源的配置,如Pods、Services和Ingress。


Ingress(入口): Ingress控制器用於管理集群外部流量的路由,允許多個應用程式共享同一個IP地址。


StatefulSets(有狀態集): 用於管理有狀態應用程式,如數據庫,以確保持久性和有序的操作。

目前公司有幾台實體伺服器,都是使用ESXi,順便複習之前架設k8s的種種踩坑之路

基本上Master Node應該為2n的數量
Worker Node應該為2n+1或3n的數量

本次實驗只架設1 Master Node以及2 Work Node
配置如下:
  1. 192.168.1.1 master.test
  2. 192.168.1.2 node1.test
  3. 192.168.1.3 node2.test

Master Node要下的命令:
# 配置 Local DNS
echo "192.168.1.1 master.test master" | sudo tee -a /etc/hosts
echo "192.168.1.2 node1.test node1" | sudo tee -a /etc/hosts
echo "192.168.1.3 node2.test node2" | sudo tee -a /etc/hosts


# 關閉SWAP
sudo sed -i '/\/swap.img/s/^\(.*\)$/#\1/g' /etc/fstab

# 配置Container網路及IPv4轉發
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

# 儲存並應用配置
sudo sysctl --system
# 重開機避免SWAP未關閉
sudo reboot

# 安裝依賴套件
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
# 安裝Containerd
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 enable --now containerd


curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/kubernetes-xenial.gpg
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
sudo apt update
#
# kubelet:Kubernetes 節點上運行的代理程序
# kubeadm:用於集群的啟動和管理工具
# kubectl:Kubernetes 命令行工具
#
sudo apt install -y kubelet kubeadm kubectl
# 避免下方套件被升級
sudo apt-mark hold kubelet kubeadm kubectl


# 初始化Kubernets Admin
# 接著下方會出現可以讓Worker Node Join的配置記得複製起來
sudo kubeadm init --control-plane-endpoint=master.test

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

#
# 應用在Master Node上
# Calico 是一個流行的容器網絡解決方案,用於提供容器之間的網絡通信、網絡策略和路由。
# 當您在 Kubernetes 集群上部署 Calico 時,通常只需要在 Master Node 上運行一次安裝命令,
# 然後 Calico 會自動在整個集群中的所有節點上安裝相關的組件。
#
sudo kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml


Node1 / Node2 要下的命令:
# 配置 Local DNS
echo "192.168.1.1 master.test master" | sudo tee -a /etc/hosts
echo "192.168.1.2 node1.test node1" | sudo tee -a /etc/hosts
echo "192.168.1.3 node2.test node2" | sudo tee -a /etc/hosts


# 關閉SWAP
sudo sed -i '/\/swap.img/s/^\(.*\)$/#\1/g' /etc/fstab

# 配置Container網路及IPv4轉發
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

# 儲存並應用配置
sudo sysctl --system
# 重開機避免SWAP未關閉
sudo reboot

# 安裝依賴套件
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
# 安裝Containerd
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 enable --now containerd


curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/kubernetes-xenial.gpg
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
sudo apt update
#
# kubelet:Kubernetes 節點上運行的代理程序
# kubeadm:用於集群的啟動和管理工具
# kubectl:Kubernetes 命令行工具
#
sudo apt install -y kubelet kubeadm kubectl
# 避免下方套件被升級
sudo apt-mark hold kubelet kubeadm kubectl


# 將Worker Node加入到Master Node行程Cluster
sudo kubeadm join master.test:6443 --token your-token --discovery-token-ca-cert-hash your-cert-hash



可以透過下方命令來建立Nginx App

# 建立兩個Image來自Nginx的replicas容器部署
kubectl create deployment nginx-app --image=nginx --replicas=2

通過 Kubernetes 中的 kubectl 命令將名為 "nginx-app" 的部署(Deployment)公開

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

kubectl expose deployment nginx-app:這部分表示要使用 kubectl 命令來創建一個新的 Kubernetes 服務,並將它與 "nginx-app" 部署關聯起來。

--type=NodePort:這個選項指定了服務的類型。在這個情況下,我們使用了 NodePort 類型的服務。NodePort 服務會在每個節點上的某個特定端口上打開一個端口,以允許外部流量進入集群。

--port=80:這個選項指定了服務所監聽的端口號。在這個例子中,我們將服務設置為在端口 80 上監聽流量。

取得已部署服務容器
kubectl get deployment

用於檢索名為 "nginx-app" 的 Kubernetes 服務(Service)的詳細信息

kubectl get svc nginx-app


  • 服務的名稱(Name)
  • 服務的類型(Type),例如 ClusterIP、NodePort、或 LoadBalancer
  • 服務的集群IP地址(Cluster IP Address)
  • 服務的NodePort(NodePort服務類型的情況下)
  • 服務所使用的端口(Port)
  • 被暴露的應用程序的端口(Target Port)
  • 服務所關聯的部署(Deployment)
取得結果
curl http://ip:port



# 刪除Nginx的NodePort服務
kubectl delete service nginx-app
# 刪除Nginx的容器部署
kubectl delete deployment nginx-app