使用 kind 部署單機版 kubernetes 集群

  • 2019 年 12 月 20 日
  • 筆記

kubernetes 從一發布開始其學習門檻就比較高,首先就是部署難,用戶要想學習 kubernetes 必須要過部署這一關,社區也推出了多個部署工具幫助簡化集群的部署,社區中推出的部署工具主要目標有兩大類,部署測試環境與生產環境,本節主要講述測試環境的部署,目前社區已經有多套部署方案了:

而本文主要講述使用 kind(Kubernetes In Docker)部署 k8s 集群,因為 kind 使用起來實在太簡單了,特別適用於在本機部署測試環境。

kind 的原理就是將 k8s 所需要的所有組件,全部部署在一個 docker 容器中,只需要一個鏡像即可部署一套 k8s 環境,其底層是使用 kubeadm 進行部署,CRI 使用 Containerd,CNI 使用 weave。下面就來看看如何使用 kind 部署一套 kubernetes 環境,在使用 kind 前你需要確保目標機器已經安裝了 docker 服務。

一、使用 kind 部署 k8s 集群

以下安裝環境為 mac os。

安裝 kind :

$ wget https://github.com/kubernetes-sigs/kind/releases/download/v0.5.1/kind-darwin-amd64  $ chmod +x kind-darwin-amd64  $ mv kind-darwin-amd64 /usr/local/bin/kind

使用 kind 部署 kubernetes 集群:

// 默認的 cluster name 為 kind,可以使用 --name 指定  $ kind create cluster  Creating cluster "kind" ...   ✓ Ensuring node image (kindest/node:v1.15.3) ?   ✓ Preparing nodes ?   ✓ Creating kubeadm config ?   ✓ Starting control-plane ?️   ✓ Installing CNI ?   ✓ Installing StorageClass ?  Cluster creation complete. You can now use the cluster with:

使用 kind create cluster 安裝,是沒有指定任何配置文件的安裝方式。從安裝列印出的輸出來看,分為 6 步:

  1. 安裝基礎鏡像 kindest/node:v1.15.4,這個鏡像裡面包含了所需要的二進位文件、配置文件以及 k8s 左右組件鏡像的 tar 包
  2. 準備 node,檢查環境、啟動鏡像等工作
  3. 生成 kubeadm 的配置,然後使用 kubeadm 安裝,和直接使用 kubeadm 的步驟類似
  4. 啟動服務
  5. 部署 CNI 插件,kind 默認使用 weave。
  6. 創建 StorageClass。
// 查看 kubeconfig path  $ kind get kubeconfig-path  /Users/feiyu/.kube/kind-config-kind    $ export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"

kind 還有多個子命令,此處不再一一詳解。

// 查看集群資訊,  $ kubectl cluster-info  Kubernetes master is running at https://127.0.0.1:55387  KubeDNS is running at https://127.0.0.1:55387/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy    To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.      // 查看本地的 kind 容器  $ docker ps  CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                                  NAMES  e26545538cc7        kindest/node:v1.15.3   "/usr/local/bin/entr…"   15 minutes ago      Up 15 minutes       55387/tcp, 127.0.0.1:55387->6443/tcp   kind-control-plane

可以看到,kind 容器暴露的 6443 埠映射在本機的一個隨機埠(55387)上。

// 查看 node 的詳細資訊,可以看到 cni 為 containerd  $ kubectl describe node kind-control-plane  ...   Container Runtime Version:  containerd://1.2.6-0ubuntu1   Kubelet Version:            v1.15.3   Kube-Proxy Version:         v1.15.3  PodCIDR:                     10.244.0.0/24  ExternalID:                  kind-control-plane  ...      # 進入 kind 容器查看 k8s 的配置,和單獨使用 kubeadm 時一致  $ docker exec -it e26545538cc  bash  root@kind-control-plane:~# ls /etc/kubernetes/  admin.conf  controller-manager.conf  kubelet.conf  manifests  pki  scheduler.conf  root@kind-control-plane:~# ls /etc/kubernetes/manifests/  etcd.yaml  kube-apiserver.yaml  kube-controller-manager.yaml  kube-scheduler.yaml      # 查看 cni 配置  root@kind-control-plane:/etc/kubernetes# cat /var/lib/kubelet/kubeadm-flags.env  KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=/run/containerd/containerd.sock --fail-swap-on=false --node-ip=172.17.0.2"      # 查看容器的狀態  root@kind-control-plane:~# crictl pods  POD ID              CREATED             STATE               NAME                                         NAMESPACE           ATTEMPT  fc8700af77ca2       About an hour ago   Ready               coredns-5c98db65d4-bjxl2                     kube-system         0  6378297d32811       About an hour ago   Ready               coredns-5c98db65d4-q2drh                     kube-system         0  124b42a35e0d1       About an hour ago   Ready               kube-proxy-99nc9                             kube-system         0  54b9511069534       About an hour ago   Ready               kindnet-xz8dp                                kube-system         0  61cb720ddece8       About an hour ago   Ready               etcd-kind-control-plane                      kube-system         0  4514b98de1a44       About an hour ago   Ready               kube-scheduler-kind-control-plane            kube-system         0  9a29dbebc8dd1       About an hour ago   Ready               kube-controller-manager-kind-control-plane   kube-system         0  ab028c5f5a3e5       About an hour ago   Ready               kube-apiserver-kind-control-plane            kube-system         0

刪除集群:

$ kind delete cluster

kind 也支援創建多 master 以及多 work 節點的集群,需要自定義 yaml 配置:

# a cluster with 3 control-plane nodes and 3 workers  kind: Cluster  apiVersion: kind.sigs.k8s.io/v1alpha3  nodes:  - role: control-plane  - role: control-plane  - role: control-plane  - role: worker  - role: worker  - role: worker    // 創建集群指定 config  $ kind create cluster --config kind.yaml

kind 還支援自定義映射的埠號、支援使用自定義鏡像倉庫、支援啟用 Feature Gates 等多個功能,詳細的使用請參考官方文檔 quick-start

二、本地測試

既然 kind 不能用作生產環境,那怎麼在本地測試時使用呢?由於 k8s 的新版已經全面啟用了 TLS,不再支援非安全埠,訪問 APIServer 的介面都需要認證,但是本地測試不需要那麼麻煩,如下所示,為匿名用戶設置訪問許可權即可。

// 為匿名用戶關聯 RBAC 規則  $ kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous    // 請求相關的 API  $ curl -k https://127.0.0.1:55387/api/v1/nodes  {    "kind": "NodeList",    "apiVersion": "v1",    "metadata": {      "selfLink": "/api/v1/nodes",      "resourceVersion": "11844"    },    "items": [    ...