乐趣区

关于kubernetes:Kubernetes-高可用集群下组件实例状态

kubernetes 高可用集群的典型架构

管制面组件:

  • etcd:多实例并行运行,通过 Raft 保障统一;
  • apiserver:多实例并行运行;
  • controller-manager:多实例仅有 1 个节点 active;
  • scheduler:多实例仅有 1 个节点 active;

工作节点组件:

  • kubelet
  • kube-proxy

apiserver 多实例运行

apiserver 是无状态的,所有数据保留在 etcd 中,apiserver 不做缓存。

apiserver 多个实例并行运行,通过 Loadbalancer 负载平衡用户的申请。

scheuler 和 controller-manager 单实例运行

scheduler 和 controller-manager 会批改集群状态,多实例运行会产生竞争状态。

通过 –leader-elect 机制,只有领导者实例能力运行,其它实例处于 standby 状态;当领导者实例宕机时,残余的实例选举产生新的领导者。

领导者选举的办法:多个实例抢占创立 endpoints 资源,创立成功者为领导者。
比方多个 scheduler 实例,抢占创立子 endpoints 资源:kube-scheduler

# kubectl get endpoints kube-scheduler -n kube-system -oyaml
apiVersion: v1
kind: Endpoints
metadata:
  annotations:
    control-plane.alpha.kubernetes.io/leader: '{"holderIdentity":"master1_293eaef2-fd7e-4ae9-aae7-e78615454881","leaseDurationSeconds":15,"acquireTime":"2021-10-06T20:46:43Z","renewTime":"2021-10-19T02:49:21Z","leaderTransitions":165}'
  creationTimestamp: "2021-02-01T03:10:48Z"
......

查问 kube-scheduler 资源,能够看到此时 master1 上的 scheduler 是 active 状态,其它实例则为 standby。

kubelet 和 kube-proxy 在工作节点上运行

kubelet 和 kube-proxy 运行在工作节点上。

kubelet 负责:

  • 向 apiserver 创立一个 node 资源,以注册该节点;
  • 继续监控 apiserver,若有 pod 部署到该节点上,创立并启动 pod;
  • 继续监控运行的 pod,向 apiserver 报告 pod 的状态、事件和资源耗费;
  • 周期性的运行容器的 livenessProbe,当探针失败时,则重启容器;
  • 继续监控 apiserver,若有 pod 删除,则终止该容器;

kube-proxy 负责:

  • 负责确保对服务 ip 和 port 的拜访最终能达到 pod 中,通过节点上的 iptables/ipvs 来实现;

参考:

  1. kubernetes in action
退出移动版