• 基于声明式api管理集群


    背景

    集群管理不仅包括集群搭建,还包括比如:

    • 集群扩缩容;
    • 节点健康检查和自动修复;
    • Kubernetes 升级;
    • 操作系统升级。

    云原生场景中集群应该按照我们的期望的状态运行,这意味着集群管理应该建立在声明式API的基础之上。

    k8s cluster api

    如果需要通过声明式api来管理集群,那么需要怎样抽象管理模型呢。

    • 计算节点。包括机器的系统,规格等。
    • 集群。master多少个,worker多少个,k8s版本是什么等。

    下面以官网图为例说明一下怎样基于声明式api管理集群。

    file

    参与角色

    • 管理集群
      管理 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

    1. 安装kind,clustercli
    https://kind.sigs.k8s.io/docs/user/quick-start/#installing-with-a-package-manager
    https://github.com/kubernetes-sigs/cluster-api/releases
    
    • 1
    • 2
    curl -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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    file
    注:这里拉取镜像可能会很慢,需要设置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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    再次安装即可。
    
    • 1

    file
    查看集群信息

    kubectl cluster-info
    kubectl get node -o wide
    
    • 1
    • 2

    file
    3.安装管理集群

    # 使用docker作为基础架构
    clusterctl init --infrastructure docker
    
    • 1
    • 2

    file
    这里需要替换镜像。

    k get deploy -A -o wide
    
    • 1

    file

    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
    
    • 1
    • 2
    • 3
    • 4

    等待pod都处于running状态。
    file
    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
    
    • 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
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134

    安装

    ./generate_workload_cluster.sh
    kubectl apply -f capi-quickstart.yaml
    
    • 1
    • 2

    我这里安装报错了。暂未解决。
    file
    未完待续。。。

  • 相关阅读:
    lararvel学习文档
    【二叉树】链式结构的一些操作实现
    Jwt的基础入门,详细讲解
    JAVA基础——反射机制
    PNG怎么转换成PDF?这篇文章教会你
    Java 开发常用的 Linux 命令知识积累
    flutter入门实践2——将完成的flutter软件打包为apk
    物联网AI MicroPython学习之语法 bluetooth蓝牙
    linux制作 ext4镜像image 脚本demo
    限时免费领《新程序员》电子书啦!
  • 原文地址:https://blog.csdn.net/weixin_43616190/article/details/126415703