k8s

基于声明式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

    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

    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

    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

    再次安装即可。
    file
    查看集群信息

    kubectl cluster-info
    kubectl get node -o wide

    file
    3.安装管理集群

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

    file
    这里需要替换镜像。

    k get deploy -A -o wide

    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

    等待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

    安装

    ./generate_workload_cluster.sh
    kubectl apply -f capi-quickstart.yaml

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

分类: k8s
0 0 投票数
文章评分
订阅评论
提醒
guest

0 评论
内联反馈
查看所有评论

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部
0
希望看到您的想法,请您发表评论x