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: 需要在启动命令中添加如下配置
最后更新于
这有帮助吗?