2043 kube-controller-manager

部署一个三实例 kube-controller-manager 的集群,启动后将通过竞争选举机制产生一个 leader 节点,其它节点为阻塞状态。当 leader 节点不可用时,阻塞的节点将再次进行选举产生新的 leader 节点,从而保证服务的可用性。

部署策略:

  • 3 节点高可用;

  • 关闭非安全端口,在安全端口 10252 接收 https 请求;

  • 使用 kubeconfig 访问 apiserver 的安全端口;

  • 自动 approve kubelet 证书签名请求 (CSR),证书过期后自动轮转;

  • 各 controller 使用自己的 ServiceAccount 访问 apiserver;

部署软件规划

IP

部署软件包

10.40.61.116

kube-controller-manager

10.40.58.153

kube-controller-manager

10.40.58.154

kube-controller-manager

01.创建 kube-controller-manager 证书和私钥

创建证书签名请求:

cat > kube-controller-manager-csr.json <<EOF
{
  "CN": "system:kube-controller-manager",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "China",
      "L": "Beijing",
      "O": "Kubernetes",
      "OU": "Kubernetes",
      "ST": "Beijing"
    }
  ]
}
EOF

说明: hosts 列表包含所有 kube-controller-manager 节点 IP; CN 为 system:kube-controller-manager,kubernetes 内置的 ClusterRoleBindings system:kube-controller-manager 赋予 kube-controller-manager 工作所需的权限。

创建 kube-controller-manager凭证与私钥:

结果将产生以下几个文件:

02.创建kubeconfig

kube-controller-manager 使用 kubeconfig 文件访问 apiserver,该文件提供了 apiserver 地址、 CA 证书和 kube-controller-manager 证书

先确定apiserver对外提供服务的地址

  • 设置集群参数

  • 设置客户端认证参数

  • 设置上下文参数

  • 设置默认上下文

03.service-accout证书

请使用kube-apiserver文档中生成的service-account证书, 其中kube-apiserver使用公钥, kube-controller-manager使用私钥

04.使用systemd管理kube-controller-manager

启动参数的请看参数详解

05.启动/停止 kube-controller-manager

kube-controller-manager can be started and stopped as follows:

06.验证

查看进程是否正常

查看权限:

ClusteRole system:kube-controller-manager 的权限很小,只能创建 secret、serviceaccount 等资源对象,各 controller 的权限分散到 ClusterRole system:controller:XXX 中。

当在 kube-controller-manager 的启动参数中添加 --use-service-account-credentials=true 参数,这样 main controller 会为各 controller 创建对应的 ServiceAccount XXX-controller。内置的 ClusterRoleBinding system:controller:XXX 将赋予各 XXX-controller ServiceAccount 对应的 ClusterRole system:controller:XXX 权限。

查看其中deployment controller

07.参数详解

kube-controller-manager,k8s的大脑,大部分控制器所在,大管家,配置包括:

  • 驱逐相关

  • 高可用选主相关

  • PodIP网段

启动命令

参数用途说明

开启选举。

利用etcd的强一致性,可以用来组件的选主,kube-controller-manager就是利用这个特性实现的高可用。

高可用条件: kube-controller-manager数量大于等于2即可。

驱逐超时,默认5分钟,配置为3分钟,从controller感知到节点挂了开始计时。

一级驱逐速率,这里两个0.1相当于每个节点每10秒钟驱逐一个Pod。

Number of nodes per second on which pods are deleted in case of node failure when a zone is healthy (see –unhealthy-zone-threshold for definition of healthy/unhealthy). Zone refers to entire cluster in non-multizone clusters.

当开启多可用区时,一级驱逐速率只有在zone健康的时候生效;当非多可用区的时候,zone代表整个集群。

二级驱逐速率,这里两个0.1相当于每个节点每10秒钟驱逐一个Pod。

Number of nodes per second on which pods are deleted in case of node failure when a zone is unhealthy (see –unhealthy-zone-threshold for definition of healthy/unhealthy). Zone refers to entire cluster in non-multizone clusters. This value is implicitly overridden to 0 if the cluster size is smaller than –large-cluster-size-threshold.

Number of nodes from which NodeController treats the cluster as large for the eviction logic purposes. –secondary-node-eviction-rate is implicitly overridden to 0 for clusters this size or smaller.

设置一个"大"集群的阈值,多大为大集群,默认为50,当集群节点数小于该值的时候,二级驱逐速率就是0,不驱逐!

Fraction of Nodes in a zone which needs to be not Ready (minimum 3) for zone to be treated as unhealthy.

Zone被认为不健康的条件,大于55%的节点故障(NodeReady的节点数大于等于3).

举例:

比如现在ZoneB有20个节点,那么当20 * 0.55 = 11个以上节点挂了后,那么这个Zone就被认为不健康了,此时一级驱逐速率也就不生效了;由于总结点数大于1,那么二级速率有效,所以整个集群会以10s/pod/node进行驱逐。

08.Q&A

Q:

A:

Q:

A: 需要在启动命令中添加如下配置

最后更新于

这有帮助吗?