Kind介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kind介绍相关的知识,希望对你有一定的参考价值。

参考技术A

Kind 是一种使用 Docker 容器作为 node 节点,运行本地 Kubernetes 集群的工具,在 K8s 中有着非常广泛的应用。

什么是 Kind

Kind(Kubernetes IN Docker)[1]是 一个用来快速创建和测试 kubernetes 的工具 ,它把环境的依赖降低到最小,仅需要机器安装了 Docker 即可使用。

Kind 可以做什么?

Kind 有哪些优势?

使用 Kind

Kind 的原理

Kind 使用一个 container 来模拟一个 node,在 container 里面跑 systemd ,并用 systemd 托管 kubelet 以及 containerd,然后通过容器内部的 kubelet 把其他 K8s 组件,比如 kube-apiserver、etcd、CNI 等跑起来。

它可以通过配置文件的方式创建多个 container 来模拟创建多个 node,并以这些 node 构建一个多节点的 Kubernetes 集群。

Kind 内部使用的集群部署工具是 kubeadm,借助 kubeadm 提供的 Alpha 特性,它可以部署包括 HA master 的高可用集群。同时,在 HA master 下, 它还额外部署了一个 nginx,用来提供负载均衡 vip。

构建镜像

Kind 的镜像分为两个,一个 node 镜像,一个 base 镜像。

node 镜像

node 镜像的构建比较复杂, 需要通过运行 base 镜像,并在 base 镜像内执行操作,再保存此容器内容为镜像的方式来完成构建 。它包含的操作有:

具体的逻辑,可以参考 node.go[2]。

base 镜像

base 镜像目前 使用了 Ubuntu:19.04 作为基础镜像 ,做了以下调整:

具体的逻辑,可以参考构建的 Dockerfile[3]。

创建集群

Kind 创建集群的基本过程为:

关于每个容器是如何作为 node 跑起来的,这里简单讲解下原理: 根据不同的角色,调用不同的函数创建节点 nodes.go [5]。

节点(容器)创建时,通过配置 --privileged、挂载 tmpfs、修改主机名等,来运行节点 create[6]。

更多

Kind 是一个比较简单有趣的项目,它的 scope [7]定得比较明确具体,也比较小。开发者可以借助 Kind 或 Kind 的思想做更多事情,比如:

此外,文中提及到的 Kind 借助 kubeadm 新特性实现 HA master 高可用集群 借助 join 的方式扩容 master 节点达到 HA master ,其内部实现方式也有优缺点,感兴趣的读者可以参考 kubeadm 源码[8]。

参考文献

1. https://github.com/kubernetes-sigs/kind

2. https://github.com/kubernetes-sigs/kind/blob/master/pkg/build/node/node.go

3. https://github.com/kubernetes-sigs/kind/blob/master/images/base/Dockerfile

4. https://github.com/kubernetes-sigs/kind/blob/master/pkg/cluster/internal/create/create.go#L55

5. https://github.com/kubernetes-sigs/kind/blob/master/pkg/cluster/internal/create/nodes.go#L196

6. https://github.com/kubernetes-sigs/kind/blob/master/pkg/cluster/nodes/create.go#L124

7. https://kind.sigs.k8s.io/docs/contributing/project-scope/

8. https://github.com/kubernetes/kubernetes/tree/master/cmd/kubeadm

使用Kind搭建本地k8s集群

介绍

Kind 是 Kubernetes In Docker 的缩写,是使用 Docker 容器部署 Kubernetes 的工具。也是官方推荐的搭建本地集群的工具。

安装 Kind

$ curl -Lo ./kind https://github.com/kubernetes-sigs/kind/releases/download/v0.5.1/kind-$(uname)-amd64
$ chmod +x ./kind
$ sudo mv ./kind /usr/bin/

安装 Docker

步骤略

安装 kubectl

$ sudo yum install kubernetes-client

或

$ curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/bin/kubectl

单节点集群

创建集群

$ sudo 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:

$ export KUBECONFIG="$(sudo kind get kubeconfig-path --name="kind")"

$ sudo kubectl cluster-info
Kubernetes master is running at https://127.0.0.1:34059
KubeDNS is running at https://127.0.0.1:34059/api/v1/proxy/namespaces/kube-system/services/kube-dns

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

也可以使用下面命令来在创建集群的时候制定集群名称。

$ sudo kind create cluster --name mycluster

查看集群

查看集群信息

$ export KUBECONFIG="$(sudo kind get kubeconfig-path --name="kind")"
$ sudo kubectl cluster-info
Kubernetes master is running at https://127.0.0.1:34059
KubeDNS is running at https://127.0.0.1:34059/api/v1/proxy/namespaces/kube-system/services/kube-dns

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

查看集群节点信息

$ sudo kubectl get nodes
NAME                 STATUS    AGE
kind-control-plane   Ready     1h

查看系统上的集群

$ sudo kind get clusters
kind

删除集群

$ sudo kind delete cluster
Deleting cluster "kind" ...
$KUBECONFIG is still set to use /root/.kube/kind-config-kind even though that file has been deleted, remember to unset it

多节点集群

对于多节点集群的创建,需要通过使用配置文件的方式来创建。

配置文件

先创建一个 yaml 格式文件,文件名就叫 kind-config.yaml,内容如下:

kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
kubeadmConfigPatches:
- |
  apiVersion: kubeadm.k8s.io/v1beta2
  kind: ClusterConfiguration
  metadata:
    name: config
  networking:
    serviceSubnet: 10.0.0.0/16
- |
  apiVersion: kubeadm.k8s.io/v1beta2
  kind: InitConfiguration
  metadata:
    name: config
  networking:
    serviceSubnet: 10.0.0.0/16
nodes:
- role: control-plane
- role: control-plane
- role: control-plane
- role: worker
- role: worker
- role: worker

创建集群

通过配置文件创建集群

$ sudo kind create cluster --name mycluster --config kind-config.yaml
Creating cluster "mycluster" ...
 ✓ Ensuring node image (kindest/node:v1.15.3)
 ✓ Preparing nodes
 ✓ Configuring the external load balancer
 ✓ Creating kubeadm config
 ✓ Starting control-plane
 ✓ Installing CNI
 ✓ Installing StorageClass
 ✓ 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="mycluster")"
kubectl cluster-info

查看集群

查看集群信息

$ export KUBECONFIG="$(sudo kind get kubeconfig-path --name="mycluster")"
$ sudo kubectl cluster-info
Kubernetes master is running at https://127.0.0.1:33483
KubeDNS is running at https://127.0.0.1:33483/api/v1/proxy/namespaces/kube-system/services/kube-dns

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

查看集群节点

$ sudo kubectl get nodes
NAME                       STATUS    AGE
mycluster-control-plane    Ready     6m
mycluster-control-plane2   Ready     5m
mycluster-control-plane3   Ready     4m
mycluster-worker           Ready     4m
mycluster-worker2          Ready     4m
mycluster-worker3          Ready     4m
​```shell

查询集群容器

​```shell
$ sudo docker ps
CONTAINER ID        IMAGE                                                                                          COMMAND                  CREATED             STATUS              PORTS                                  NAMES
93bb0d8df106        kindest/node:v1.15.3@sha256:27e388752544890482a86b90d8ac50fcfa63a2e8656a96ec5337b902ec8e5157   "/usr/local/bin/en..."   9 minutes ago       Up 9 minutes        42008/tcp, 127.0.0.1:42008->6443/tcp   mycluster-control-plane
2a1b67d11463        kindest/node:v1.15.3@sha256:27e388752544890482a86b90d8ac50fcfa63a2e8656a96ec5337b902ec8e5157   "/usr/local/bin/en..."   9 minutes ago       Up 9 minutes                                               mycluster-worker3
d7a8f74a9e95        kindest/node:v1.15.3@sha256:27e388752544890482a86b90d8ac50fcfa63a2e8656a96ec5337b902ec8e5157   "/usr/local/bin/en..."   9 minutes ago       Up 9 minutes                                               mycluster-worker
8d2aaa019a21        kindest/haproxy:2.0.0-alpine                                                                   "/docker-entrypoin..."   9 minutes ago       Up 9 minutes        33483/tcp, 127.0.0.1:33483->6443/tcp   mycluster-external-load-balancer
dd2fca2b2401        kindest/node:v1.15.3@sha256:27e388752544890482a86b90d8ac50fcfa63a2e8656a96ec5337b902ec8e5157   "/usr/local/bin/en..."   9 minutes ago       Up 9 minutes                                               mycluster-worker2
f47d3c836f85        kindest/node:v1.15.3@sha256:27e388752544890482a86b90d8ac50fcfa63a2e8656a96ec5337b902ec8e5157   "/usr/local/bin/en..."   9 minutes ago       Up 9 minutes        39892/tcp, 127.0.0.1:39892->6443/tcp   mycluster-control-plane3
5feeee745b06        kindest/node:v1.15.3@sha256:27e388752544890482a86b90d8ac50fcfa63a2e8656a96ec5337b902ec8e5157   "/usr/local/bin/en..."   9 minutes ago       Up 9 minutes        36154/tcp, 127.0.0.1:36154->6443/tcp   mycluster-control-plane2
4213abeebc6f        kindest/haproxy:2.0.0-alpine         

删除集群

$ sudo kind delete cluster --name mycluster
Deleting cluster "mycluster" ...
$KUBECONFIG is still set to use /root/.kube/kind-config-mycluster even though that file has been deleted, remember to unset it

以上是关于Kind介绍的主要内容,如果未能解决你的问题,请参考以下文章

Go语言(十五) 反射

云原生:windows 10家庭版使用kind启动本地k8s测试集群

关于变形金刚(Transformers )介绍的英语作文

k8s 之service资源介绍

HMHomeManager返回零

go-反射