y0ngb1n

Aben Blog

欢迎来到我的技术小黑屋ヾ(◍°∇°◍)ノ゙
github

使用 Docker 快速搭建單機版的 Kubernetes 集群

隨著容器化、微服務、服務網格、服務編排、DevOps 等雲原生技術的流行,我們也要跟上時代的步伐,那麼我們需要怎麼上車呢?此時就需要一個易於在本地運行且 Kubernetes 的工具,可在你的筆記本電腦上的虛擬機內輕鬆創建單機版 Kubernetes 集群,便於我們使用 Kubernetes 進行日常開發與學習。那麼接下來讓我們輕鬆地搭建一個更貼近真實的 K8s 環境。

工具推薦#

對於本地實驗,還可以使用各種 Kubernetes 實現以運行 Kubernetes 群集,如

使用上面任一工具的目標都能快速運行一個本地學習的 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 提供了多種安裝方式,支持以下方式:

這裡將在 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 驗證這一點,而不是直接映射在宿主機上

K8s 故障排查指南#

a-visual-guide-on-troubleshooting-kubernetes-deployments

參考鏈接#

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。