本文介紹如何使用 kind 在本地快速啟動一個 k8s 集群胃榕。kind 是 Kubernetes in Docker 的簡寫霹菊,從名字上看很容易猜出 kind 的目標(biāo)是將一個 k8s 集群以容器的方式部署在本機電腦上伤提。這種方式對平臺依賴少搜变,安裝部署比較干凈利落艘蹋,理論上本地只需要一個 Docker 運行環(huán)境即可车酣。
安裝過程介紹
實驗環(huán)境
- 操作系統(tǒng):macOS Catalina (10.15.7)
- 容器環(huán)境:Docker Desktop for Mac 3.2.2
- 包管理工具:Homebrew
設(shè)置 Docker 鏡像加速
打開 Docker Desktop for Mac 的首選項界面,選擇 Docker Engine榴都,加入如下設(shè)置:
{
"registry-mirrors": [
"https://8km017g6.mirror.aliyuncs.com"
]
}
之后點擊 Apply & Restart
重啟 Docker待锈。
安裝 kind 和 kubectl
kind 并不依賴于 kubectl,但是開發(fā)人員需要 kubectl 與 kind 所創(chuàng)建的 k8s 集群進(jìn)行通訊:
$ brew install kubectl
$ brew install kind
創(chuàng)建 k8s 集群
使用 kind create cluster
命令新建集群嘴高,注意 --name
選項指定集群的名稱竿音,若未指定該參數(shù),kind
將會是默認(rèn)的集群名稱拴驮。
$ kind create cluster --name demo
Creating cluster "demo" ...
? Ensuring node image (kindest/node:v1.20.2) ??
? Preparing nodes ??
? Writing configuration ??
? Starting control-plane ???
? Installing CNI ??
? Installing StorageClass ??
Set kubectl context to "kind-demo"
You can now use your cluster with:
kubectl cluster-info --context kind-demo
Thanks for using kind! ??
此時根據(jù)提示輸入 kubectl cluster-info --context kind-demo
會顯示集群當(dāng)前的基本信息:
$ kubectl cluster-info --context kind-demo
Kubernetes control plane is running at https://127.0.0.1:56770
KubeDNS is running at https://127.0.0.1:56770/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
查看集群 demo 中的節(jié)點信息:
$ kubectl get node
NAME STATUS ROLES AGE VERSION
demo-control-plane Ready control-plane,master 4m46s v1.20.2
$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-74ff55c5b-9gdc5 1/1 Running 0 6m24s
coredns-74ff55c5b-tnb5w 1/1 Running 0 6m24s
etcd-demo-control-plane 1/1 Running 0 6m38s
kindnet-4fmq9 1/1 Running 0 6m24s
kube-apiserver-demo-control-plane 1/1 Running 0 6m38s
kube-controller-manager-demo-control-plane 1/1 Running 0 6m38s
kube-proxy-6wrdz 1/1 Running 0 6m24s
kube-scheduler-demo-control-plane 1/1 Running 0 6m38s
至此春瞬,一個最基本的 k8s 集群就已經(jīng)創(chuàng)建好了。
刪除集群
使用以下命令刪除上面已經(jīng)創(chuàng)建的集群 demo:
$ kind delete cluster --name demo
Deleting cluster "demo" ...
支持 Ingress 控制器的集群
帶有 Ingress Controller 的集群則需要向主機暴露 80 和 443 端口以便于主機可以通過域名進(jìn)行訪問莹汤。kind 除了可以支持通過命令行選項的方式創(chuàng)建集群快鱼,也支持使用配置文件的方式對集群進(jìn)行更細(xì)致的配置颠印,創(chuàng)建命令如下:
cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
kubeadmConfigPatches:
- |
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
node-labels: "ingress-ready=true"
extraPortMappings:
- containerPort: 80
hostPort: 80
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
EOF
當(dāng)然你也可以把這個配置信息以文件的形式保存纲岭,比如叫 kind.yaml
,那么創(chuàng)建命令就是:
kind create cluster --config=kind.yaml
部署 NGINX Ingress 控制器
國內(nèi)對于 GitHub 和 k8s.gcr.io 鏡像倉庫的訪問速度不太理想线罕,因此此處我們需要做一些針對于國內(nèi)網(wǎng)絡(luò)的準(zhǔn)備工作止潮。
拉取鏡像
# 從阿里云鏡像倉庫拉取鏡像
$ docker pull registry.aliyuncs.com/kubeadm-ha/ingress-nginx_controller:v0.43.0
# 重命名為官方鏡像名稱
$ docker tag registry.aliyuncs.com/kubeadm-ha/ingress-nginx_controller:v0.43.0 k8s.gcr.io/ingress-nginx/controller:v0.43.0
將鏡像導(dǎo)入到 kind
kind 的 load
命令可以幫助我們將 Docker 中的鏡像導(dǎo)入到由 kind 創(chuàng)建的集群中,命令如下:
$ kind load docker-image k8s.gcr.io/ingress-nginx/controller:v0.43.0
Image: "k8s.gcr.io/ingress-nginx/controller:v0.43.0" with ID "sha256:38dca1cbd23197f591e58fc6c949110b53f7a003e15f6d4974d86e7f7a00815d" not yet present on node "kind-control-plane", loading...
部署 Ingress 控制器
我們使用 Gitee 的鏡像倉庫地址來加速資源的下載:
$ kubectl apply -f https://gitee.com/mirrors/ingress-nginx/raw/controller-v0.43.0/deploy/static/provider/kind/deploy.yaml
Ingress 控制器的部署和啟動需要等待一會钞楼,可以使用以下命令來查看運行情況:
$ kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-ktp2g 0/1 Completed 0 7h4m
ingress-nginx-admission-patch-q4vmb 0/1 Completed 2 7h4m
ingress-nginx-controller-55bc59c885-mcp25 1/1 Running 0 7h4m
如果 ingress-nginx-controller-xxx 的狀態(tài)的是 Running喇闸,說明已經(jīng)成功運行。
部署測試應(yīng)用
此處我們使用 kind 官網(wǎng)提供的測試應(yīng)用:
kubectl apply -f https://kind.sigs.k8s.io/examples/ingress/usage.yaml
測試 Ingress 的連通性:
$ curl localhost/foo
foo
$ curl localhost/bar
bar