Kind介绍
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kind介绍相关的知识,希望对你有一定的参考价值。
参考技术AKind 是一种使用 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介绍的主要内容,如果未能解决你的问题,请参考以下文章