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资源,创立成功者为领导者。
# 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负责:
- 向apiserver创立一个node资源,以注册该节点
- 继续监控apiserver,若有pod部署到该节点上,创立并启动pod
- 继续监控运行的pod,向apiserver报告pod的状态、事件和资源耗费
- 周期性的运行容器的livenessProbe,当探针失败时,则重启容器
- 继续监控apiserver,若有pod删除,则终止该容器
kube-proxy负责:
负责确保对服务ip和port的拜访最终能达到pod中,通过节点上的iptables/ipvs来实现;
k8s master 节点都有哪些组件涉及选举?
在 Kubernetes 中,以下组件涉及选举:
etcd:Kubernetes 使用 etcd 作为其分布式键值存储系统。在 etcd 集群中,多个实例之间会进行选举,选择一个主节点来处理写入请求。
kube-controller-manager:Kubernetes 控制器管理器,负责监控集群状态并做出相应的决策。在高可用部署中,多个 kube-controller-manager 实例之间会进行选举,选择一个主节点来处理控制器管理任务。
kube-scheduler:Kubernetes 调度器,负责将容器调度到合适的节点上。在高可用部署中,多个 kube-scheduler 实例之间会进行选举,选择一个主节点来处理调度任务。
哪些组件的配置文件中会有 api server 的地址?
Kubernetes中有很多组件的配置文件中都会包含API Server的地址,以下是其中一些常见的组件及其配置文件中包含API Server地址的部分:
kubelet:kubelet是Kubernetes节点上的代理程序,用于管理节点上的容器。kubelet的配置文件(/etc/kubernetes/kubelet.conf)中包含API Server地址,用于与API Server通信。
kube-proxy:kube-proxy是Kubernetes节点上的网络代理,用于实现Service的负载均衡和网络隔离。kube-proxy的配置文件(/etc/kubernetes/kube-proxy.conf)中包含API Server地址,用于与API Server通信。
kube-apiserver:kube-apiserver是Kubernetes API Server,用于处理所有的API请求。kube-apiserver的配置文件(/etc/kubernetes/apiserver.conf)中包含自身的地址和端口,以及etcd的地址和端口。
kube-controller-manager:kube-controller-manager是Kubernetes控制器管理器,用于管理集群中的各种控制器。kube-controller-manager的配置文件(/etc/kubernetes/controller-manager.conf)中包含API Server地址,用于与API Server通信。
kube-scheduler:kube-scheduler是Kubernetes调度器,用于将Pod调度到合适的节点上。kube-scheduler的配置文件(/etc/kubernetes/scheduler.conf)中包含API Server地址,用于与API Server通信。
需要注意的是,不同版本的Kubernetes可能会有不同的组件和配置文件,因此具体的配置文件路径和内容可能会有所不同。
参考
关于kubernetes:Kubernetes-高可用集群下组件实例状态
https://lequ7.com/guan-yu-kuberneteskubernetes-gao-ke-yong-ji-qun-xia-zu-jian-shi-li-zhuang-tai.html
Kubernetes 高可用API Server
https://lequ7.com/guan-yu-kuberneteskubernetes-gao-ke-yong-ji-qun-xia-zu-jian-shi-li-zhuang-tai.html