使用 kind 在本地运行 k8s

发布时间 2023-10-23 17:07:24作者: MaxBruce

原文:https://www.jianshu.com/p/a4a4116e97df

本文介绍如何使用 kind 在本地快速启动一个 k8s 集群。kind 是 Kubernetes in Docker 的简写,从名字上看很容易猜出 kind 的目标是将一个 k8s 集群以容器的方式部署在本机电脑上。这种方式对平台依赖少,安装部署比较干净利落,理论上本地只需要一个 Docker 运行环境即可。

安装过程介绍

实验环境

  • 操作系统:macOS Catalina (10.15.7)
  • 容器环境:Docker Desktop for Mac 3.2.2
  • 包管理工具:Homebrew

设置 Docker 镜像加速

打开 Docker Desktop for Mac 的首选项界面,选择 Docker Engine,加入如下设置:

{
  "registry-mirrors": [
    "https://8km017g6.mirror.aliyuncs.com"
  ]
}

之后点击 Apply & Restart 重启 Docker。

安装 kind 和 kubectl

kind 并不依赖于 kubectl,但是开发人员需要 kubectl 与 kind 所创建的 k8s 集群进行通讯:

$ brew install kubectl
$ brew install kind

创建 k8s 集群

使用 kind create cluster 命令新建集群,注意 --name 选项指定集群的名称,若未指定该参数,kind 将会是默认的集群名称。

$ 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! ?

此时根据提示输入 kubectl cluster-info --context kind-demo 会显示集群当前的基本信息:

$ 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 中的节点信息:

$ 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 集群就已经创建好了。

删除集群

使用以下命令删除上面已经创建的集群 demo:

$ kind delete cluster --name demo
Deleting cluster "demo" ...

支持 Ingress 控制器的集群

带有 Ingress Controller 的集群则需要向主机暴露 80 和 443 端口以便于主机可以通过域名进行访问。kind 除了可以支持通过命令行选项的方式创建集群,也支持使用配置文件的方式对集群进行更细致的配置,创建命令如下:

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

当然你也可以把这个配置信息以文件的形式保存,比如叫 kind.yaml ,那么创建命令就是:

kind create cluster --config=kind.yaml

部署 NGINX Ingress 控制器

国内对于 GitHub 和 k8s.gcr.io 镜像仓库的访问速度不太理想,因此此处我们需要做一些针对于国内网络的准备工作。

拉取镜像

# 从阿里云镜像仓库拉取镜像
$ 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

将镜像导入到 kind

kind 的 load 命令可以帮助我们将 Docker 中的镜像导入到由 kind 创建的集群中,命令如下:

$ 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 的状态的是 Running,说明已经成功运行。

部署测试应用

此处我们使用 kind 官网提供的测试应用:

kubectl apply -f https://kind.sigs.k8s.io/examples/ingress/usage.yaml

测试 Ingress 的连通性:

$ curl localhost/foo
foo
$ curl localhost/bar
bar

参考资料



作者:枫之叶_eliu
链接:https://www.jianshu.com/p/a4a4116e97df
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。