Z.S.K.'s Records

Kubernetes学习(kind实践)

Kind(kubernetes in docker的缩写), 用于快速地在本地部署kubernetes集群,顾名思义,就是将 Kubernetes 所需要的所有组件,全部部署在一个 Docker 容器中,可以很方便的搭建 Kubernetes 集群。

Kind 已经广泛的应用于 Kubernetes 上游及相关项目的 CI 环境中

优势

  1. 最小的安装依赖,仅需要安装 Docker 即可
  2. 使用方法简单,只需 Kind Cli 工具即可快速创建集群
  3. 使用容器来模似 Kubernetes 节点
  4. 内部使用 Kubeadm 的官方主流部署工具

架构

Kind 使用容器来模拟每一个 Kubernetes 节点,并在容器里面运行 Systemd。 容器里的 Systemd 托管了 KubeletContainerd,然后容器内部的 Kubelet 把其它 Kubernetes 组件:Kube-ApiserverEtcdCNI 等等组件运行起来。

Kind内部使用了Kubeadm这个工具来做集群的部署,包括高可用集群也是借助Kubeadm提供的特性来完成的。在高用集群下还会额外部署了一个Nginx来提供VIP

这是官方一张图, 可以很形象的说明上面的观点.

使用

Kind安装

kind是以golang开发的,因此直接下载对应平台的二进制包即可,我是mac,因此直接brew安装即可

1
$ brew install kind

可以来看一下kind支持的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ kind -h
kind creates and manages local Kubernetes clusters using Docker container 'nodes'

Usage:
kind [command]

Available Commands:
build Build one of [node-image]
completion Output shell completion code for the specified shell (bash, zsh or fish)
create Creates one of [cluster]
delete Deletes one of [cluster]
export Exports one of [kubeconfig, logs]
get Gets one of [clusters, nodes, kubeconfig]
help Help about any command
load Loads images into nodes
version Prints the kind CLI version

Flags:
-h, --help help for kind
--loglevel string DEPRECATED: see -v instead
-q, --quiet silence all stderr output
-v, --verbosity int32 info log verbosity
--version version for kind

Use "kind [command] --help" for more information about a command

单节点

搭建单节点集群是 Kind 最基础的功能,当然使用起来也很简单,仅需一条指令即可完成。

1
2
3
4
5
6
7
8
9
10
$ kind create cluster --name my-cluster --image kindest/node:v1.15.3
Creating 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,该镜像里面包含了所有需要安装的东西,包括:kubectlkubeadmkubelet 的二进制文件,以及安装对应版本 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` 有所了解的同学都知道它默认使用的镜像在国内是不能访问的,所以一样需要自行解决网络问题。

可以来验证一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster")"

$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
my-cluster-control-plane Ready master 2m v1.15.3

$ kubectl get po -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-86c58d9df4-6g66f 1/1 Running 0 21m
coredns-86c58d9df4-pqcc4 1/1 Running 0 21m
etcd-my-cluster-control-plane 1/1 Running 0 20m
kube-apiserver-my-cluster-control-plane 1/1 Running 0 20m
kube-controller-manager-my-cluster-control-plane 1/1 Running 0 20m
kube-proxy-cjgnt 1/1 Running 0 21m
kube-scheduler-my-cluster-control-plane 1/1 Running 0 21m
weave-net-ls2v8 2/2 Running 0 21m

从上面可以看出,对于使用kind部署一个单节点来说,单节点集群默认方式启动的节点类型是 control-plane,该节点包含了所有的组件。这些组件分别是:2*CorednsEtcdApi-ServerController-ManagerKube-ProxySheduler 和网络插件 Weave

单节点的只有一个Node容器,如果想部署多个节点呢?

多节点

多节点的集群可以使用配置文件来指定,Kind 在创建集群的时候,支持通过 --config 参数传递配置文件给 Kind,配置文件可修改的内容主要有 role 和 节点使用的镜像

1
2
3
4
5
6
7
8
$ vim my-cluster-multi-node.yaml
kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
nodes:
- role: control-plane # 一个控制节点
- role: worker # 一个工作节点

$ kind create cluster --config my-cluster-multi-node.yaml --name my-cluster-multi-node --image kindest/node:v1.15.3

可以发现这个配置文件的形式跟kubeadm的配置文件非常的类似, 更多的参数可以参考这里

验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
kubectl get nodes
NAME STATUS ROLES AGE VERSION
my-cluster-multi-node-control-plane Ready master 3m20s v1.15.3
my-cluster-multi-node-worker Ready <none> 3m8s v1.15.3

$ kubectl get po -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-86c58d9df4-cnqhc 1/1 Running 0 5m29s
coredns-86c58d9df4-hn9mv 1/1 Running 0 5m29s
etcd-my-cluster-multi-node-control-plane 1/1 Running 0 4m24s
kube-apiserver-my-cluster-multi-node-control-plane 1/1 Running 0 4m17s
kube-controller-manager-my-cluster-multi-node-control-plane 1/1 Running 0 4m21s
kube-proxy-8t4xt 1/1 Running 0 5m27s
kube-proxy-skd5v 1/1 Running 0 5m29s
kube-scheduler-my-cluster-multi-node-control-plane 1/1 Running 0 4m18s
weave-net-nmfq2 2/2 Running 0 5m27s
weave-net-srdfw 2/2 Running 0 5m29s

高可用

高可用的集群跟多节点类似, 只不过control-plane的角色需要至少需要3个Node

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$ vim my-cluster-ha.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
imageRepository: registry.aliyuncs.com/google_containers
nodeRegistration:
kubeletExtraArgs:
pod-infra-container-image: registry.aliyuncs.com/google_containers/pause:3.1
- |
apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
metadata:
name: config
networking:
serviceSubnet: 10.0.0.0/16
imageRepository: registry.aliyuncs.com/google_containers
nodes:
- role: control-plane # 三个 control-plane 节点
- role: control-plane
- role: control-plane
- role: worker # 三个work节点
- role: worker
- role: worker


$ kind create cluster --name my-cluster-ha --config my-cluster-ha.yaml --image kindest/node:v1.15.3

验证

1
2
3
4
5
6
7
8
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
my-cluster-ha-control-plane Ready master 3m42s v1.15.3
my-cluster-ha-control-plane2 Ready master 3m24s v1.15.3
my-cluster-ha-control-plane3 Ready master 2m13s v1.15.3
my-cluster-ha-worker Ready <none> 96s v1.15.3
my-cluster-ha-worker2 Ready <none> 98s v1.15.3
my-cluster-ha-worker3 Ready <none> 95s v1.15.3

删除集群

1
$ kind delete  cluster --name my-cluster

从集群的部署来看, 使用kind部署出来的集群除了把容器当Node使用之外, 其它的差别并不大

Image

Kind中使用到了两种image, base image以及Node image

baseImage

baseimage主要是安装一些systemd,kubernetes需要的依赖,基于ubuntu.

NodeImage

Node 镜像的构建比较复杂,目前是通过运行 Base 镜像并在 Base 镜像内执行操作,再保存此容器内容为镜像的方式来构建的,包含的操作有:

  • 构建 Kubernetes 相关资源,比如:二进制文件和镜像。
  • 运行一个用于构建的容器
  • 把构建的 Kubernetes 相关资源复制到容器里
  • 调整部分组件配置参数,以支持在容器内运行
  • 预先拉去运行环境需要的镜像
  • 通过 docker commit 方式保存当前的构建容器为 Node 镜像

最后再强调一下: kind部署出来的集群是不适用生产环境的,官方推荐只是用于需要一个k8s集群用于ci或者testing.

参考文章:

转载请注明出处https://izsk.me

Z.S.K. wechat
Scan Me To Read on Phone
I know you won't do this,but what if you did?