隨著容器化、微服務、服務網格、服務編排、DevOps 等雲原生技術的流行,我們也要跟上時代的步伐,那麼我們需要怎麼上車呢?此時就需要一個易於在本地執行且 Kubernetes 的工具,可在你的膝上型電腦上的虛擬機器內輕鬆建立單機版 Kubernetes 叢集,便於我們使用 Kubernetes 進行日常開發與學習。那麼接下讓我們輕鬆地搭建一個更貼近真實的 K8s 環境。
工具推薦
對於本地實驗,還可以使用各種 Kubernetes 實現以執行 Kubernetes 群集,如
- Kind (https://kind.sigs.k8s.io/)
- Minikube (https://minikube.sigs.k8s.io/docs/)
- MicroK8s (https://microk8s.io/)
- 線上體驗 K8s (https://labs.play-with-k8s.com/)
- Dockerized (https://github.com/y0ngb1n/dockerized) 推薦我的個人專案,歡迎 Star
使用上面任一工具的目標都能快速執行一個本地學習的 Kubernetes 群集,其中我個人最喜歡的是 Kind。
搭建 K8s 叢集
下面分別嘗試 Kind 與 Minikube 建立單機版 Kubernetes 叢集。
先安裝 kubectl
無論使用哪個工具,都需要先正確安裝 kubectl
Kubernetes 命令列工具,否則安裝完 Kind、Minikube 等環境後無法執行 kubectl
命令。
使用 Kind 建立 K8s 叢集
kind is a tool for running local Kubernetes clusters using Docker container “nodes”.
安裝 kind
Kind 提供了多種安裝方式,支援以下方式:
- On macOS via Homebrew
- On macOS via MacPorts
- On Windows via Chocolatey
- Installing From Release Binaries
- Installing From Source
這裡將在 Linux 環境下以 Installing From Release Binaries 方式進行安裝:
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64
chmod +x ./kind
# mv ./kind /some-dir-in-your-PATH/kind
建立 K8s 叢集
kind create cluster
# kind delete cluster
檢驗安裝環境
?️ ~ kind get clusters
kind
使用 Minikube 建立 K8s 叢集
安裝 minikube
選擇不同環境下的安裝方式,參考 https://minikube.sigs.k8s.io/docs/start/
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
國內網路環境,使用如下命令將自動使用阿里雲服務來支援 minikube
的環境配置,參考 https://developer.aliyun.com/article/221687
minikube start --image-mirror-country='cn'
# minikube delete
檢驗安裝環境
?️ ~ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
啟動 K8s 控制檯,參考 https://minikube.sigs.k8s.io/docs/handbook/dashboard/
minikube dashboard
# or
minikube dashboard --url
檢視 minikube
支援的擴充套件列表,參考 https://minikube.sigs.k8s.io/docs/handbook/deploying/
minikube addons list
檢驗 K8s 叢集
?️ ~ kubectl version
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.1", GitCommit:"5e58841cce77d4bc13713ad2b91fa0d961e69192", GitTreeState:"clean", BuildDate:"2021-05-12T14:18:45Z", GoVersion:"go1.16.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.3", GitCommit:"c92036820499fedefec0f847e2054d824aea6cd1", GitTreeState:"clean", BuildDate:"2021-10-27T18:35:25Z", GoVersion:"go1.16.9", Compiler:"gc", Platform:"linux/amd64"}
# 檢視當前指向的 k8s 環境,kind/minikube 安裝時會自動修改 kubectl 配置
?️ ~ kubectl config current-context
kind-kind
# 如本地有多個 k8s 環境,可手動切換
?️ ~ kubectl config use-context minikube
Switched to context "minikube".
# 檢查伺服器節點
?️ ~ kubectl get no
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane,master 36m v1.22.3
?️ ~ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
minikube Ready control-plane,master 15m v1.22.3 192.168.49.2 <none> Ubuntu 20.04.2 LTS 5.4.0-42-generic docker://20.10.8
# 檢視 k8s 叢集資訊
?️ ~ kubectl cluster-info
Kubernetes control plane is running at https://192.168.49.2:8443
CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
K8s 初體驗
快速嚐鮮
# 啟動單例項 nginx
?️ ~ kubectl create deployment nginx-depl --image=nginx
# 檢視執行的例項
?️ ~ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-depl-5c8bf76b5b-zw8ms 1/1 Running 0 70s
# 轉發一個本地 8080 埠到 Pod 80 埠
?️ ~ kubectl port-forward nginx-depl-5c8bf76b5b-zw8ms 8080:80
# 本地訪問
?️ ~ curl 127.0.0.1:8080
# 清除例項
?️ ~ kubectl delete deployment nginx-depl
小試牛刀
nginx-pod.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
nginx-svc.yml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
ports:
- name: http
port: 80
targetPort: 80
nodePort: 31080
selector:
app: nginx
type: NodePort
執行命令:
# 一鍵釋出,啟動例項
?️ ~ kubectl apply -f .
# 除錯 Pod
?️ ~ kubectl describe pod nginx
?️ ~ kubectl port-forward nginx 8080:80
# 除錯 Service
?️ ~ kubectl describe svc nginx-svc
?️ ~ kubectl port-forward service/nginx-svc 8080:80
# 清除例項
?️ ~ kubectl delete -f .
注意事項
- 需要先正確安裝
kubectl
- 通過 Port-Forward 可本機訪問 Pod,僅限本地除錯環境,如
curl 127.0.0.1:8080
- 通過 Service 反向代理時,需要使用 K8s 叢集的 IP 進行訪問,使用
kubectl get nodes -o wide
檢視 K8s 叢集的 IP - Service 是 K8s 提供反向代理的機制,負責反向路由+負載均衡
- NodePort 是 Service 的一種型別,可將 Service 暴露給外網
- NodePort 範圍
30000~32767
- Label 是 K8s 的種打標籤機制
- Selector 是 K8s 中的路由選擇定位機制
- 使用 Kind 或 Minikube 部署的 K8s 叢集,node 基於容器執行而不是宿主機,使用 Service 反向代理時,只在 node 節點容器中 kube-proxy 生效,使用
docker exec -it kind-control-plane bash
驗證這一點,而不是直接對映在宿主機上