docker 如何加入kubernetes_使用 Kind 在 5 分钟内快速部署一个 Kubernetes 高可用集群...
什么是 Kind
Kind(Kubernetes in Docker) 是一個Kubernetes孵化項目,Kind是一套開箱即用的Kubernetes環境搭建方案。顧名思義,就是將Kubernetes所需要的所有組件,全部部署在一個Docker容器中,可以很方便的搭建Kubernetes集群。
Kind已經廣泛的應用于Kubernetes上游及相關項目的CI環境中,官方文檔中也把Kind作為一種本地集群搭建的工具推薦給大家。
項目地址:https://github.com/kubernetes-sigs/kind
Kind 可以做什么?
快速創建一個或多個 Kubernetes集群
支持部署高可用的 Kubernetes集群
支持從源碼構建并部署一個 Kubernetes集群
可以快速低成本體驗一個最新的 Kubernetes集群,并支持Kubernetes的絕大部分功能
支持本地離線運行一個多節點集群
Kind 有哪些優勢?
最小的安裝依賴,僅需要安裝 Docker即可
使用方法簡單,只需 Kind Cli工具即可快速創建集群
使用容器來模似 Kubernetes節點
內部使用 Kubeadm的官方主流部署工具
通過了 CNCF官方的K8S Conformance測試
Kind 是如何工作的?
Kind使用容器來模擬每一個Kubernetes節點,并在容器里面運行Systemd。 容器里的Systemd托管了Kubelet和Containerd,然后容器內部的Kubelet把其它Kubernetes組件:Kube-Apiserver、Etcd、CNI等等組件運行起來。
Kind內部使用了Kubeadm這個工具來做集群的部署,包括高可用集群也是借助Kubeadm提供的特性來完成的。在高用集群下還會額外部署了一個Nginx來提供負載均衡VIP。
安裝 Kind
安裝 Kind 依賴組件
Kind把部署Kubernetes環境的依賴降低到了最小,僅需要機器安裝Docker即可。
安裝 Docker
這里以 Linux系統為例:
$ curl -sSL https://get.daocloud.io/docker | sh更多平臺的安裝方法可參考官方文檔:https://docs.docker.com/install/
安裝 Kubectl
如果你需要通過命令行管理集群,則需要安裝 Kubectl。
這里以 Linux系統為例:
$ curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.15.0/bin/linux/amd64/kubectl$ chmod +x ./kubectl$ sudo mv ./kubectl /usr/local/bin/kubectl更多平臺的安裝方法可參考官方文檔:https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl
安裝 Kind
Kind使用Golang進行開發,原生支持良好的跨平臺特性,通常只需要直接下載構建好的二進制文件就可使用。
通過二進制安裝
Linux
Windows
更多平臺的安裝方法可參考官方文檔:https://kind.sigs.k8s.io/docs/user/quick-start/
通過源碼安裝
如果本地環境已經配置好 Golang (1.11+) 的開發環境,你也可以直接通過源碼進行安裝。
$ go get sigs.k8s.io/kind@v0.5.1運行完上述命令后,會將 Kind的可執行文件放到$GOPATH/bin目錄內。為了方便使用,你需要將此目錄加入到$PATH中。
使用 Kind
安裝完成之后,我們可以來看看 Kind支持哪些命令行操作。
$ kindkind creates and manages local Kubernetes clusters using Docker container 'nodes'Usage: kind [command]Available Commands: build Build one of [base-image, node-image] create Creates one of [cluster] delete Deletes one of [cluster] export exports one of [logs] get Gets one of [clusters, nodes, kubeconfig-path] help Help about any command load Loads images into nodes version prints the kind CLI versionFlags: -h, --help help for kind --loglevel string logrus log level [panic, fatal, error, warning, info, debug] (default "warning") --version version for kindUse "kind [command] --help" for more information about a command.簡單說下幾個比較常用選項的含義:
build:用來從Kubernetes源代碼構建一個新的鏡像。
create:創建一個Kubernetes集群。
delete:刪除一個Kubernetes集群。
get:可用來查看當前集群、節點信息以及Kubectl配置文件的地址。
load:從宿主機向Kubernetes節點內導入鏡像。
使用 Kind 創建 Kubernetes 集群
搭建一個單節點集群
搭建單節點集群是 Kind最基礎的功能,當然使用起來也很簡單,僅需一條指令即可完成。
$ kind create cluster --name my-clusterCreating cluster "my-cluster" ... ? Ensuring node image (kindest/node:v1.15.3) ? Preparing nodes ? Creating kubeadm config ? Starting control-plane ?Cluster creation complete. You can now use the cluster with:export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster")"kubectl cluster-info以上命令中 --name是可選參數。如果不指定,默認創建出來的集群名字為kind。
使用默認安裝的方式時,我們沒有指定任何配置文件。從安裝過程的輸出來看,一共分為 4 步:
檢查本地環境是否存在一個基礎的安裝鏡像,默認是 kindest/node:v1.15.3,該鏡像里面包含了所有需要安裝的東西,包括:kubectl、kubeadm、kubelet的二進制文件,以及安裝對應版本Kubernetes所需要的鏡像。
準備 Kubernetes節點,主要就是啟動容器、解壓鏡像這類的操作。
建立對應的 kubeadm的配置,完成之后就通過kubeadm進行安裝。安裝完成后還會做一些清理操作,比如:刪掉主節點上的污點,否則對于沒有容忍的Pod無法完成部署。
上面所有操作都完成后,就成功啟動了一個 Kubernetes集群并輸出一些操作集群的提示信息。
默認情況下,Kind會先下載kindest/node:v1.15.3鏡像。如果你想指定不同版本,可以使用--image參數,類似這樣:kind create cluster --image kindest/node:v1.15.3
kindest/node這個鏡像目前托管于 Docker Hub 上,下載時可能會較慢。同樣的問題Kind進行集群的創建也是存在的,Kind實際使用Kubeadm進行集群的創建。對Kubeadm有所了解的同學都知道它默認使用的鏡像在國內是不能訪問的,所以一樣需要自行解決網絡問題。
如果你存在上面說的網絡問題,最好配置一個國內的加速器或者鏡像源。如果你還不知道如何配置加速器和鏡像源可以參考:「Docker / Kubernetes 鏡像源不可用,教你幾招搞定它!」和 「 Docker 下使用 DaoCloud / 阿里云鏡像加速」兩篇文章。
接下來,我們根據上面命令執行完后,輸出的提示信息進行操作來驗證一下集群是否部署成功。
# 獲取指定集群的配置文件所在的路徑$ export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster")"$ kubectl cluster-infoKubernetes master is running at https://localhost:34458KubeDNS is running at https://localhost:34458/api/v1/namespaces/kube-system/services/kube-dns:dns/proxyTo further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.$ kubectl get nodesNAME STATUS ROLES AGE VERSIONmy-cluster-control-plane Ready master 2m v1.15.3$ kubectl get po -n kube-systemNAME READY STATUS RESTARTS AGEcoredns-86c58d9df4-6g66f 1/1 Running 0 21mcoredns-86c58d9df4-pqcc4 1/1 Running 0 21metcd-my-cluster-control-plane 1/1 Running 0 20mkube-apiserver-my-cluster-control-plane 1/1 Running 0 20mkube-controller-manager-my-cluster-control-plane 1/1 Running 0 20mkube-proxy-cjgnt 1/1 Running 0 21mkube-scheduler-my-cluster-control-plane 1/1 Running 0 21mweave-net-ls2v8 2/2 Running 1 21m從上面的輸出結果,可以看到單節點的 Kubernetes已經搭建成功。單節點集群默認方式啟動的節點類型是control-plane,該節點包含了所有的組件。這些組件分別是:2*Coredns、Etcd、Api-Server、Controller-Manager、Kube-Proxy、Sheduler和網絡插件Weave,目前默認使用的網絡插件也是Weave。
創建多節點的集群
默認安裝的集群只部署了一個控制節點,如果需要部署多節點集群,我們可以通過配置文件的方式來創建多個容器。這樣就可以達到模擬多個節點目的,并以這些節點來構建一個多節點的 Kubernetes集群。
創建多節點 Kubernetes 集群配置文件
Kind在創建集群的時候,支持通過--config參數傳遞配置文件給Kind,配置文件可修改的內容主要有 role 和 節點使用的鏡像。
$ vim my-cluster-multi-node.yaml# 一共兩個節點,一個主節點,一個從節點。kind: ClusterapiVersion: kind.sigs.k8s.io/v1alpha3nodes:- role: control-plane- role: worker創建多節點 Kubernetes 集群
配置文件創建完成后,就可以使用下面的命令來完成多節點 Kubernetes集群搭建。
$ kind create cluster --config my-cluster-multi-node.yaml --name my-cluster-multi-nodeCreating cluster "my-cluster-multi-node" ... ? Ensuring node image (kindest/node:v1.15.3) ? Preparing nodes ? Creating kubeadm config ? Starting control-plane ? ? Joining worker nodes Cluster creation complete. You can now use the cluster with:export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster-multi-node")"kubectl cluster-info和上面創建的單節點集群一樣,我們同樣根據上面命令執行完后,輸出的提示信息進行操作來驗證一下集群是否部署成功。
$ kubectl get nodesNAME STATUS ROLES AGE VERSIONmy-cluster-multi-node-control-plane Ready master 3m20s v1.15.3my-cluster-multi-node-worker Ready 3m8s v1.15.3$ kubectl get po -n kube-systemNAME READY STATUS RESTARTS AGEcoredns-86c58d9df4-cnqhc 1/1 Running 0 5m29scoredns-86c58d9df4-hn9mv 1/1 Running 0 5m29setcd-my-cluster-multi-node-control-plane 1/1 Running 0 4m24skube-apiserver-my-cluster-multi-node-control-plane 1/1 Running 0 4m17skube-controller-manager-my-cluster-multi-node-control-plane 1/1 Running 0 4m21skube-proxy-8t4xt 1/1 Running 0 5m27skube-proxy-skd5v 1/1 Running 0 5m29skube-scheduler-my-cluster-multi-node-control-plane 1/1 Running 0 4m18sweave-net-nmfq2 2/2 Running 1 5m27sweave-net-srdfw 2/2 Running 0 5m29s創建高可用 Kubernetes 集群
Kind也支持搭建高可用的Kubernetes集群,創建方式和多節點集群類似,也是通過配置文件來實現。
創建高可用 Kubernetes 集群配置文件
這里,我們通過直接在配置文件里使用國內容器鏡像源的方式解決了官方容器鏡像源不可用的問題,同時也達到了加速集群創建的目的。
創建高可用 Kubernetes 集群
配置文件創建完成后,就可以使用下面的命令來完成高可用 Kubernetes集群搭建。
$ kind create cluster --name my-cluster-ha --config my-cluster-ha.yamlCreating cluster "my-cluster-ha" ... ? Ensuring node image (kindest/node:v1.15.3) ? Preparing nodes ? Starting the external load balancer ?? ? Creating kubeadm config ? Starting control-plane ? ? Joining more control-plane nodes ? Joining worker nodes Cluster creation complete. You can now use the cluster with:export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster-ha")"kubectl cluster-infomaster $ export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster-ha")"master $ kubectl cluster-infoKubernetes master is running at https://localhost:44019KubeDNS is running at https://localhost:44019/api/v1/namespaces/kube-system/services/kube-dns:dns/proxyTo further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.同樣,我們根據上面命令執行完后,輸出的提示信息進行操作來驗證一下集群是否部署成功。
$ kubectl get nodesNAME STATUS ROLES AGE VERSIONmy-cluster-ha-control-plane Ready master 3m42s v1.15.3my-cluster-ha-control-plane2 Ready master 3m24s v1.15.3my-cluster-ha-control-plane3 Ready master 2m13s v1.15.3my-cluster-ha-worker Ready 96s v1.15.3my-cluster-ha-worker2 Ready 98s v1.15.3my-cluster-ha-worker3 Ready 95s v1.15.3從上面的輸出結果,可以看到包含了多個 master 節點,說明高可用的 Kubernetes集群已經搭建成功。
其它相關知識
Kind 的鏡像里的秘密
Kind鏡像一共分為兩類,一類是Base鏡像,另一類是Node鏡像。
Base 鏡像
Base 鏡像目前使用了 ubuntu:19.04作為基礎鏡像,并做了下面的調整:
安裝 Systemd相關的包,并調整一些配置以適應在容器內運行。
安裝 Kubernetes運行時的依賴包,比如:Conntrack、Socat、CNI等。
安裝容器運行環境,比如: Containerd、Crictl等。
配置自己的 ENTRYPOINT腳本,以適應和調整容器內運行的問題。
更多具體的構建邏輯可以參考:https://github.com/kubernetes-sigs/kind/blob/master/images/base/Dockerfile
Node 鏡像
Node鏡像的構建比較復雜,目前是通過運行Base鏡像并在Base鏡像內執行操作,再保存此容器內容為鏡像的方式來構建的,包含的操作有:
構建 Kubernetes相關資源,比如:二進制文件和鏡像。
運行一個用于構建的容器
把構建的 Kubernetes相關資源復制到容器里
調整部分組件配置參數,以支持在容器內運行
預先拉去運行環境需要的鏡像
通過 docker commit方式保存當前的構建容器為Node鏡像
如何快速刪除一個集群
如果你不需要本地的集群環境,通過以下命令進行刪除:
$ kind delete cluster --name my-clusterDeleting cluster "my-cluster" ...$KUBECONFIG is still set to use /root/.kube/kind-config-my-cluster even though that file has been deleted, remember to unset it至此,我們就演示完了如何使用 Kind快速搭建一個Kubernetes集群。不過有一個你需要注意的地方,Kind搭建的集群不適用于生產環境中使用。但是如果你想在本地快速構建一個Kubernetes集群環境,并且不想占用太多的硬件資源,那么Kind會是你不錯的選擇。
參考文檔
https://www.google.com
http://t.cn/AiRVBwDS
https://zhuanlan.zhihu.com/p/60464867
https://yeya24.github.io/post/kind/
http://dockerone.com/article/8974
https://kind.sigs.k8s.io/docs/user/quick-start/
你可能還喜歡
Docker / Kubernetes 鏡像源不可用,教你幾招搞定它!
總結
以上是生活随笔為你收集整理的docker 如何加入kubernetes_使用 Kind 在 5 分钟内快速部署一个 Kubernetes 高可用集群...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 月份加6个月_12月AHA HS大
- 下一篇: swift 从手机选照片_悦印移动互联自