背景
集群管理不仅包括集群搭建,还包括比如:
- 集群扩缩容;
- 节点健康检查和自动修复;
- Kubernetes 升级;
- 操作系统升级。
云原生场景中集群应该按照我们的期望的状态运行,这意味着集群管理应该建立在声明式API的基础之上。
k8s cluster api
如果需要通过声明式api来管理集群,那么需要怎样抽象管理模型呢。
- 计算节点。包括机器的系统,规格等。
- 集群。master多少个,worker多少个,k8s版本是什么等。
下面以官网图为例说明一下怎样基于声明式api管理集群。
参与角色
- 管理集群
管理 workload 集群的集群,用来存放 Cluster API 对象的地方。只跑了apiserver,etcd,和clusterapi相关的控制器(监听用户定义的集群规格并创建目标workload集群)。 - Workload 集群
真正开放给用户用来运行应用的集群,由管理集群管理。 - Infrastructure provider
提供不同云的基础架构管理,包括计算节点,网络等,也可以使用docker。目前流行的公有云大多都与 Cluster API 集成了。 - Bootstrap provider
- 证书生成;
- 控制面组件安装和初始化,监控节点的创建;
- 将主节点和计算节点加入集群。
- Control plane
Kubernetes 控制平面组件。
涉及模型
- Machine
- 计算节点,用来描述可以运行 Kubernetes 组件的机器对象(与 Kubernetes Node 的差异:machine是说明我需要这样规格的一台机器,而node是已经加入到集群中并且状态为ready );
- 一个新 Machine 被创建以后,对应的控制器会创建一个计算节点,安装好操作系统并更新 Machine 的状态;
- 当一个 Machine 被删除后,对应的控制器会删除掉该节点并回收计算资源;
- 当 Machine 属性被更新以后(比如 Kubernetes 版本更新),对应的控制器会删除旧节点并创建新节点。
- Machine Immutability (In-place Upgrade vs. Replace)
不可变基础架构。 - MachineDeployment
提供针对 Machine 和 MachineSet 的声明式更新,类似于 Kubernetes Deployment。 - MachineSet
维护一个稳定的机器集合,类似 Kubernetes ReplicaSet。 - MachineHealthCheck
对machine进行的健康检查。
安装cluster api集群
参考链接:https://www.cnblogs.com/longtds/p/15998001.html
-
安装kind,clustercli
https://kind.sigs.k8s.io/docs/user/quick-start/#installing-with-a-package-manager
https://github.com/kubernetes-sigs/cluster-api/releasescurl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.12.0/kind-linux-amd64 chmod +x ./kind mv ./kind /some-dir-in-your-PATH/kind wget https://github.91chi.fun//https://github.com//kubernetes-sigs/cluster-api/releases/download/v1.1.3/clusterctl-linux-amd64 cp /root/clusterctl-linux-amd64 /usr/bin/clusterctl
2.安装集群
部署脚本如下: #cat create_cluster.sh env KIND_EXPERIMENTAL_DOCKER_NETWORK=bridge kind create cluster --config ./kind.conf #cat kind.conf kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane extraMounts: - hostPath: /var/run/docker.sock containerPath: /var/run/docker.sock
注:这里拉取镜像可能会很慢,需要设置docker镜像加速。
cat /etc/docker/daemon.json { "registry-mirrors": [ "https://0bo4n5zl.mirror.aliyuncs.com", "https://hub-mirror.c.163.com/", "https://reg-mirror.qiniu.com"] } systemctl restart docker
再次安装即可。
查看集群信息kubectl cluster-info kubectl get node -o wide
3.安装管理集群# 使用docker作为基础架构 clusterctl init --infrastructure docker
这里需要替换镜像。k get deploy -A -o wide
kubectl set image deploy/capd-controller-manager -n capd-system manager=docker.io/cncamp/capd-manager:v0.4.2 kubectl set image deploy/capi-kubeadm-bootstrap-controller-manager -n capi-kubeadm-bootstrap-system manager=docker.io/cncamp/kubeadm-bootstrap-controller:v0.4.2 kubectl set image deploy/capi-kubeadm-control-plane-controller-manager -n capi-kubeadm-control-plane-system manager=docker.io/cncamp/kubeadm-control-plane-controller:v0.4.2 kubectl set image deploy/capi-controller-manager -n capi-system manager=docker.io/cncamp/cluster-api-controller:v0.4.2
等待pod都处于running状态。
4.安装负载集群
创建集群配置文件# cat generate_workload_cluster.sh clusterctl generate cluster capi-quickstart --flavor development \ --kubernetes-version v1.22.2 \ --control-plane-machine-count=1 \ --worker-machine-count=1 \ > capi-quickstart.yaml # cat capi-quickstart.yaml apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: capi-quickstart namespace: default spec: clusterNetwork: pods: cidrBlocks: - 192.168.0.0/16 serviceDomain: cluster.local services: cidrBlocks: - 10.128.0.0/12 controlPlaneRef: apiVersion: controlplane.cluster.x-k8s.io/v1beta1 kind: KubeadmControlPlane name: capi-quickstart-control-plane namespace: default infrastructureRef: apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerCluster name: capi-quickstart namespace: default --- apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerCluster metadata: name: capi-quickstart namespace: default --- apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate metadata: name: capi-quickstart-control-plane namespace: default spec: template: spec: extraMounts: - containerPath: /var/run/docker.sock hostPath: /var/run/docker.sock --- apiVersion: controlplane.cluster.x-k8s.io/v1beta1 kind: KubeadmControlPlane metadata: name: capi-quickstart-control-plane namespace: default spec: kubeadmConfigSpec: clusterConfiguration: apiServer: certSANs: - localhost - 127.0.0.1 controllerManager: extraArgs: enable-hostpath-provisioner: "true" initConfiguration: nodeRegistration: criSocket: /var/run/containerd/containerd.sock kubeletExtraArgs: cgroup-driver: cgroupfs eviction-hard: nodefs.available<0%,nodefs.inodesFree<0%,imagefs.available<0% joinConfiguration: nodeRegistration: criSocket: /var/run/containerd/containerd.sock kubeletExtraArgs: cgroup-driver: cgroupfs eviction-hard: nodefs.available<0%,nodefs.inodesFree<0%,imagefs.available<0% machineTemplate: infrastructureRef: apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate name: capi-quickstart-control-plane namespace: default replicas: 1 version: v1.22.2 --- apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate metadata: name: capi-quickstart-md-0 namespace: default spec: template: spec: {} --- apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 kind: KubeadmConfigTemplate metadata: name: capi-quickstart-md-0 namespace: default spec: template: spec: joinConfiguration: nodeRegistration: kubeletExtraArgs: cgroup-driver: cgroupfs eviction-hard: nodefs.available<0%,nodefs.inodesFree<0%,imagefs.available<0% --- apiVersion: cluster.x-k8s.io/v1beta1 kind: MachineDeployment metadata: name: capi-quickstart-md-0 namespace: default spec: clusterName: capi-quickstart replicas: 1 selector: matchLabels: null template: spec: bootstrap: configRef: apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 kind: KubeadmConfigTemplate name: capi-quickstart-md-0 namespace: default clusterName: capi-quickstart infrastructureRef: apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate name: capi-quickstart-md-0 namespace: default version: v1.22.2
安装
./generate_workload_cluster.sh kubectl apply -f capi-quickstart.yaml
我这里安装报错了。暂未解决。
未完待续。。。