第64篇 Kubernetes的簡單介紹

似梦亦非梦發表於2024-12-06

1.什麼是Kubernetes

Kubernetes是⼀個開源的容器編排引擎,可以⽤來管理容器化的應⽤,包括容器的⾃動化的部署、擴容、縮容、升級、回滾等等,它是Google在2014年開源的⼀個項⽬,它的前身是Google內部的Borg系統。

2.為什麼要使用Kubernetes

在Kubernetes出現之前,我們⼀般都是使⽤Docker來管理容器化的應⽤,但是Docker只是⼀個單機的容器管理⼯具,它只能管理單個節點上的容器,當我們的應⽤程式需要運⾏在多個節點上的時候,就需要使⽤⼀些其他的⼯具來管理這些節點,⽐如Docker Swarm、Mesos、Kubernetes等等,這些⼯具都是容器編排引擎,它們可以⽤來管理多個節點上的容器,但是它們之間也有⼀些區別,⽐如Docker Swarm是Docker官⽅提供的⼀個容器編排引擎,它的功能⽐較簡單,適合於⼀些⼩型的、簡單的場景,⽽Mesos和Kubernetes則是⽐較複雜的容器編排引擎,Mesos是Apache基⾦會的⼀個開源項⽬,⽽Kubernetes是Google在2014年開源的,⽬前已經成為了CNCF(Cloud Native Computing Foundation)的⼀個頂級項⽬,基本上已經成為了容器編排引擎的事實標準了。

3.使⽤minikube搭建kubernetes叢集環境

minikube是⼀個輕量級的kubernetes叢集環境,
可以⽤來在本地快速搭建⼀個單節點的kubernetes叢集,

3.1 安裝minikube

minikube的安裝:

# macOS
brew install minikube
# Windows
choco install minikube
# Linux
curl -LO
https://storage.googleapis.com/minikube/releases/latest/minikubelinux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

也可以到官⽹直接下載安裝包來安裝:https://minikube.sigs.k8s.io/docs/start/

3.2 啟動minikube

# 啟動minikube
minikube start

4.使⽤Multipass和k3s搭建kubernetes叢集環境

minikube只能⽤來在本地搭建⼀個單節點的kubernetes叢集環境,
下⾯介紹如何使⽤Multipass和k3s來搭建⼀個多節點的kubernetes叢集環境,

4.1 Multipass介紹

Multipass是⼀個輕量級的虛擬機器管理⼯具,
可以⽤來在本地快速建立和管理虛擬機器,
相⽐於VirtualBox或者VMware這樣的虛擬機器管理⼯具,
Multipass更加輕量快速,
⽽且它還提供了⼀些命令⾏⼯具來⽅便我們管理虛擬機器。
官⽅⽹址: https://Multipass.run/

4.1.1 安裝Multipass

# macOS
brew install multipass
# Windows
choco install multipass
# Linux
sudo snap install multipass

4.1.2 Multipass常⽤命令

關於Multipass的⼀些常⽤命令我們可以透過 multipass help 來檢視,
這⾥⼤家只需要記住⼏個常⽤的命令就可以了,

# 檢視幫助
multipass help
multipass help <command>
# 建立⼀個名字叫做k3s的虛擬機器
multipass launch --name k3s
# 在虛擬機器中執⾏命令
multipass exec k3s -- ls -l
# 進⼊虛擬機器並執⾏shell
multipass shell k3s
# 檢視虛擬機器的資訊
multipass info k3s
# 停⽌虛擬機器
multipass stop k3s
# 啟動虛擬機器
multipass start k3s
# 刪除虛擬機器
multipass delete k3s
# 清理虛擬機器
multipass purge
# 檢視虛擬機器列表
multipass list
# 掛載⽬錄(將本地的~/kubernetes/master⽬錄掛載到虛擬機器中的~/master⽬錄)
multipass mount ~/kubernetes/master master:~/master

Multipass有個問題,每次M1芯⽚的Mac升級之後Multipass的虛擬機器都會被刪除,不知道⼤家有沒有遇到類似的問題。

# 映象位置
/var/root/Library/Application Support/multipassd/qemu/vault/instances
# 配置⽂件
/var/root/Library/Application Support/multipassd/qemu/multipassd-vminstances.json

4.2 k3s介紹

k3s 是⼀個輕量級的Kubernetes發⾏版,它是 Rancher Labs 推出的⼀個開源項⽬,
旨在簡化Kubernetes的安裝和維護,同時它還是CNCF認證的Kubernetes發⾏版。

4.2.1 建立和配置master節點

⾸先我們需要使⽤multipass建立⼀個名字叫做k3s的虛擬機器,

multipass launch --name k3s --cpus 2 --memory 8G --disk 10G

虛擬機器建立完成之後,可以配置SSH金鑰登入,不過這⼀步並不是必須的,
即使不配置也可以透過 multipass exec 或者 multipass shell 命令來進⼊虛擬機器,然後我們需要在master節點上安裝k3s,

使⽤k3s搭建kubernetes叢集⾮常簡單,只需要執⾏⼀條命令就可以在當前節點上安裝k3s,開啟剛剛建立的k3s虛擬機器,執⾏下⾯的命令就可以安裝⼀個k3s的master節點,

# 安裝k3s的master節點
curl -sfL https://get.k3s.io | sh -

國內⽤戶可以換成下⾯的命令,使⽤ranher的映象源來安裝:

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | 
INSTALL_K3S_MIRROR=cn sh -

安裝完成之後,可以透過 kubectl 命令來檢視叢集的狀態,

sudo kubectl get nodes

4.2.2 建立和配置worker節點

接下來需要在這個master節點上獲取⼀個token,⽤來作為建立worker節點時的⼀個認證憑證,
它儲存在 /var/lib/rancher/k3s/server/node-token 這個⽂件⾥⾯,我們可以使⽤ sudo cat 命令來檢視⼀下這個⽂件中的內容,

sudo cat /var/lib/rancher/k3s/server/node-token

將TOKEN儲存到⼀個環境變數中

TOKEN=$(multipass exec k3s sudo cat /var/lib/rancher/k3s/server/nodetoken)

儲存master節點的IP地址

MASTER_IP=$(multipass info k3s | grep IPv4 | awk '{print $2}')

確認:

echo $MASTER_IP

使⽤剛剛的 TOKEN 和 MASTER_IP 來建立兩個worker節點並把它們加⼊到叢集中

# 建立兩個worker節點的虛擬機器
multipass launch --name worker1 --cpus 2 --memory 8G --disk 10G
multipass launch --name worker2 --cpus 2 --memory 8G --disk 10G
# 在worker節點虛擬機器上安裝k3s
for f in 1 2; do
 multipass exec worker$f -- bash -c "curl -sfL https://ranchermirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn 
K3S_URL=\"https://$MASTER_IP:6443\" K3S_TOKEN=\"$TOKEN\" sh -"
done

這樣就完成了⼀個多節點的kubernetes叢集的搭建。

5.線上實驗環境

Killercoda
Play-With-K8s

6.kubectl常⽤命令

6.1 基礎使用

# 檢視幫助
kubectl --help
# 檢視API版本
kubectl api-versions
# 檢視叢集資訊
kubectl cluster-info

6.2 資源的建立和執行

# 建立並運⾏⼀個指定的映象
kubectl run NAME --image=image [params...]
# e.g. 建立並運⾏⼀個名字為nginx的Pod
kubectl run nginx --image=nginx
# 根據YAML配置⽂件或者標準輸⼊建立資源
kubectl create RESOURCE
# e.g.
# 根據nginx.yaml配置⽂件建立資源
kubectl create -f nginx.yaml
# 根據URL建立資源
kubectl create -f https://k8s.io/examples/application/deployment.yaml
# 根據⽬錄下的所有配置⽂件建立資源
kubectl create -f ./dir
# 透過⽂件名或標準輸⼊配置資源
kubectl apply -f (-k DIRECTORY | -f FILENAME | stdin)
# e.g.
# 根據nginx.yaml配置⽂件建立資源
kubectl apply -f nginx.yaml

6.3 檢視資源資訊

# 檢視叢集中某⼀型別的資源
kubectl get RESOURCE
# 其中,RESOURCE可以是以下型別:
kubectl get pods / po # 檢視Pod
kubectl get svc # 檢視Service
kubectl get deploy # 檢視Deployment
kubectl get rs # 檢視ReplicaSet
kubectl get cm # 檢視ConfigMap
kubectl get secret # 檢視Secret
kubectl get ing # 檢視Ingress
kubectl get pv # 檢視PersistentVolume
kubectl get pvc # 檢視PersistentVolumeClaim
kubectl get ns # 檢視Namespace
kubectl get node # 檢視Node
kubectl get all # 檢視所有資源
# 後⾯還可以加上 -o wide 引數來檢視更多資訊
kubectl get pods -o wide
# 檢視某⼀型別資源的詳細資訊
kubectl describe RESOURCE NAME
# e.g. 檢視名字為nginx的Pod的詳細資訊
kubectl describe pod nginx

6.4 資源的修改、刪除和清理

# 更新某個資源的標籤
kubectl label RESOURCE NAME KEY_1=VALUE_1 ... KEY_N=VALUE_N
# e.g. 更新名字為nginx的Pod的標籤
kubectl label pod nginx app=nginx
# 刪除某個資源
kubectl delete RESOURCE NAME
# e.g. 刪除名字為nginx的Pod
kubectl delete pod nginx
# 刪除某個資源的所有例項
kubectl delete RESOURCE --all
# e.g. 刪除所有Pod
kubectl delete pod --all
# 根據YAML配置⽂件刪除資源
kubectl delete -f FILENAME
# e.g. 根據nginx.yaml配置⽂件刪除資源
kubectl delete -f nginx.yaml
# 設定某個資源的副本數
kubectl scale --replicas=COUNT RESOURCE NAME
# e.g. 設定名字為nginx的Deployment的副本數為3
kubectl scale --replicas=3 deployment/nginx
# 根據配置⽂件或者標準輸⼊替換某個資源
kubectl replace -f FILENAME
# e.g. 根據nginx.yaml配置⽂件替換名字為nginx的Deployment
kubectl replace -f nginx.yaml

6.5 除錯和互動

# 進⼊某個Pod的容器中
kubectl exec [-it] POD [-c CONTAINER] -- COMMAND [args...]
# e.g. 進⼊名字為nginx的Pod的容器中,並執⾏/bin/bash命令
kubectl exec -it nginx -- /bin/bash
# 檢視某個Pod的⽇志
kubectl logs [-f] [-p] [-c CONTAINER] POD [-n NAMESPACE]
# e.g. 檢視名字為nginx的Pod的⽇志
kubectl logs nginx
# 將某個Pod的端⼝轉發到本地
kubectl port-forward POD [LOCAL_PORT:]REMOTE_PORT [...
[LOCAL_PORT_N:]REMOTE_PORT_N]
# e.g. 將名字為nginx的Pod的80端⼝轉發到本地的8080端⼝
kubectl port-forward nginx 8080:80
# 連線到現有的某個Pod(將某個Pod的標準輸⼊輸出轉發到本地)
kubectl attach POD -c CONTAINER
# e.g. 將名字為nginx的Pod的標準輸⼊輸出轉發到本地
kubectl attach nginx
# 運⾏某個Pod的命令
kubectl run NAME --image=image -- COMMAND [args...]
# e.g. 運⾏名字為nginx的Pod
kubectl run nginx --image=nginx -- /bin/bash

7.Portainer的安裝和使⽤

Portainer 是⼀個輕量級的容器管理⼯具,
可以⽤來管理Docker和Kubernetes,
它提供了⼀個Web界⾯來⽅便我們管理容器,
官⽅⽹址: https://www.portainer.io/

7.1 安裝Portainer

# 建立⼀個名字叫做portainer的虛擬機器
multipass launch --name portainer --cpus 2 --memory 8G --disk 10G

當然也可以直接安裝在我們剛剛建立的master節點上,

# 在master節點上安裝portainer,並將其暴露在NodePort 30777上
kubectl apply -n portainer -f https://downloads.portainer.io/ce2-
19/portainer.yaml

或者使⽤Helm安裝

# 使⽤Helm安裝Portainer
helm upgrade --install --create-namespace -n portainer portainer 
portainer/portainer --set tls.force=true

然後直接訪問 https://localhost:30779/ 或者 http://localhost:30777/ 就可以了,

8.Helm的安裝和使⽤

Helm 是⼀個Kubernetes的包管理⼯具,
可以⽤來管理Kubernetes的應⽤,
它提供了⼀個命令⾏⼯具來⽅便我們管理Kubernetes的應⽤,
官⽅⽹址: https://helm.sh/

8.1 安裝Helm

使⽤包管理器安裝:

# macOS
brew install helm
# Windows
choco install kubernetes-helm
# 或者
scoop install helm
# Linux(Debian/Ubuntu)
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee
/usr/share/keyrings/helm.gpg > /dev/null
sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signedby=/usr/share/keyrings/helm.gpg] 
https://baltocdn.com/helm/stable/debian/ all main" | sudo tee
/etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm
# Linux(CentOS/Fedora)
sudo dnf install helm
# Linux(Snap)
sudo snap install helm --classic
# Linux(FreeBSD)
pkg install helm

使⽤指令碼安裝

$ curl -fsSL -o get_helm.sh 
https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh

或者

curl https://raw.githubusercontent.com/helm/helm/main/scripts/gethelm-3 | bash