使用 kind 部署單機版 kubernetes 集群
- 2019 年 12 月 20 日
- 筆記
kubernetes 從一發布開始其學習門檻就比較高,首先就是部署難,用戶要想學習 kubernetes 必須要過部署這一關,社區也推出了多個部署工具幫助簡化集群的部署,社區中推出的部署工具主要目標有兩大類,部署測試環境與生產環境,本節主要講述測試環境的部署,目前社區已經有多套部署方案了:
- https://github.com/bsycorp/kind
- https://github.com/ubuntu/microk8s
- https://github.com/kinvolk/kube-spawn
- https://github.com/kubernetes/minikube
- https://github.com/danderson/virtuakube
- https://github.com/kubernetes-sigs/kubeadm-dind-cluster
而本文主要講述使用 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 步:
- 安裝基礎鏡像 kindest/node:v1.15.4,這個鏡像裡面包含了所需要的二進位文件、配置文件以及 k8s 左右組件鏡像的 tar 包
- 準備 node,檢查環境、啟動鏡像等工作
- 生成 kubeadm 的配置,然後使用 kubeadm 安裝,和直接使用 kubeadm 的步驟類似
- 啟動服務
- 部署 CNI 插件,kind 默認使用 weave。
- 創建 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": [ ...