核心二进制组件源码之kube-controller-manager
官方的kube--controller-manager 启动选项配置,官方地址: https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-controller-manager/
一、kube-controller-manager
1) kube--controller-manager组件
Kubernetes 的kube--controller-manager是一个 daemon进程(后台运行的进程),内嵌随 Kubernetes 一起发布的核心控制回路。
在 Kubernetes 中,kube--controller-manager包括多个控制器,每个控制器是一个控制回路,通过API server(kube-apiserver)监视集群的共享状态, 并尝试进行更改以将当前状态转为期望状态。 目前,Kubernetes 自带的controllers包括daemon controller、node controller、namespaces controller和 serviceaccount controller等,该组件属于master组件,只需在master上部署,node节点上不用部署。
注:由于组件模型,所以要分清楚哪些组件是在master上部署,哪些是在node节点上进行部署,同时他们使用的配置文件是什么名称,应该放置在哪里,配置文件应该怎么配置等。
2)kube-controller-manager由一系列的控制器组成,Kube-controller-manager组件最终会启动了很多controller:
如下是必须启动的一些核心控制器:
EndpointController |
Endpoint用来表示kubernetes集群中Service对应的后端Pod副本的访问地址,Endpoint Controller则是用来生成和维护Endpoints对象的控制器,其主要负责监听Service和对应Pod副本变化
|
ReplicationController | Replication Controller,用于一直监控 pod 资源运行状态,一旦异常,控制在其它节点启动新的 Pod,以实现高可用 |
PodGCController | 垃圾回收 |
ResourceQuotaController | 资源配额管理 |
NamespaceController | 管理维护Namespace,定期清理无效的Namespace,包括Namesapce下的API对象,比如Pod、Service等 |
ServiceAccountController | 管理维护Service Account |
GarbageCollectorController | 资源管理包括删除资源等 |
DaemonSetController | Daemonset controller 监控 damonset,pod 以及 node 的变化,然后进行相应的 pod 创建或者删除 |
JobController | job controller 监控 job 的变化,然后创建相应的 pod |
DeploymentController | 控制两类相关的资源对象:Deployment 和 ReplicaSet |
ReplicaSetController | replicaset 资源对象的管理 |
HPAController | 弹性收缩管理(例如kubectl autoscale) |
DisruptionController | 干扰控制器(例如驱逐,移除等) |
StatefulSetController | 监听 pod 和 statefulset 对象的变更事件 |
CronJobController | 监控 cronjob 的变化 |
TTLController | 提供了TTL机制去限制那些已经完成执行动作的资源对象的声明周期 |
如下是默认启动的可选控制器,可通过选项设置是否开启:
TokenController
NodeController
ServiceController
RouteController
PVBinderController
AttachDetachController
如下是默认禁止的可选控制器,可通过选项设置是否开启:
BootstrapSignerController
TokenCleanerController
3) 我们首先看下我们集群中的部署情况: kubernetes1.10.13
主机 | k8s集群内的角色 | 部署的二进制组件工具 |
192.168.55.112 | Master | kube-apiserver kube-schduler kube-controller-manager calico kubelet kubectl |
192.168.55.12 | node | kubelet kube-proxy docker calico |
[root@k2 ~]# ps -ef| grep hy root 979 1 0 Apr17 ? 05:28:51 /usr/local/bin/hyperkube scheduler
//集成版本的hyperkube,通过参数scheduler来启动 kube-scheduler 组件服务
--logtostderr=true
--v=2
--master=http://127.0.0.1:8080
--address=0.0.0.0 --leader-elect=true --algorithm-provider=DefaultProvider
root 982 1 0 Apr17 ? 00:15:32 /usr/local/bin/hyperkube controller-manager
//集成版本的hyperkube,通过参数controller-manager来启动 kube-controller-manager 组件服务
--logtostderr=true --v=2
--master=http://127.0.0.1:8080
--bind-address=0.0.0.0
--cluster-name=kubernetes
--cluster-signing-cert-file=/etc/kubernetes/ssl/k8s-root-ca.pem
--cluster-signing-key-file=/etc/kubernetes/ssl/k8s-root-ca-key.pem
--controllers=*,bootstrapsigner,tokencleaner --deployment-controller-sync-period=10s
--experimental-cluster-signing-duration=86700h0m0s
--leader-elect=true
--node-monitor-grace-period=40s
--node-monitor-period=5s
--pod-eviction-timeout=1m0s
--terminated-pod-gc-threshold=50
--root-ca-file=/etc/kubernetes/ssl/k8s-root-ca.pem
--service-account-private-key-file=/etc/kubernetes/ssl/k8s-root-ca-key.pem
--feature-gates=RotateKubeletServerCertificate=true
root 1435 1 0 Apr17 ? 01:20:08 /usr/local/bin/hyperkube proxy
//集成版本的hyperkube,通过参数proxy来启动 kube-proxy 组件服务
--logtostderr=true --v=2
--master=http://127.0.0.1:8080
--bind-address=0.0.0.0
--hostname-override=k2.master
--kubeconfig=/etc/kubernetes/conf/kube-proxy.kubeconfig
--cluster-cidr=172.17.0.0/16 root 1756 1 1 Apr17 ? 17:10:08 /usr/local/bin/hyperkube kubelet
//集成版本的hyperkube,通过参数kubelet来启动 kubelet 组件服务
--logtostderr=true
--v=2 --node-ip=192.168.55.112
--hostname-override=k2.master
--allow-privileged=true
--bootstrap-kubeconfig=/etc/kubernetes/conf/bootstrap.kubeconfig
--cert-dir=/etc/kubernetes/ssl
--cgroup-driver=cgroupfs
--network-plugin=cni
--cluster-dns=172.17.0.2
--cluster-domain=cluster.local.
--fail-swap-on=false
--feature-gates=RotateKubeletClientCertificate=true,RotateKubeletServerCertificate=true
--node-labels=node-role.kubernetes.io/k8s-master=true
--image-gc-high-threshold=70
--image-gc-low-threshold=50
--kube-reserved=cpu=500m,memory=512Mi,ephemeral-storage=1Gi
--kubeconfig=/etc/kubernetes/conf/kubelet.kubeconfig
--system-reserved=cpu=1000m,memory=1024Mi,ephemeral-storage=1Gi
--serialize-image-pulls=false
--sync-frequency=30s
--pod-infra-container-image=k8s.gcr.io/pause-amd64:3.0
--resolv-conf=/etc/resolv.conf
--rotate-certificates
root 85920 1 2 Apr17 ? 1-06:02:32 /usr/local/bin/hyperkube apiserver
//集成版本的hyperkube,通过参数apiserver来启动 kube-apiserver 组件服务
--logtostderr=true --v=2
--etcd-servers=https://192.168.55.111:2379,https://192.168.55.112:2379,https://192.168.55.113:2379
--advertise-address=10.129.55.112
--bind-address=10.129.55.112
--secure-port=6443
--allow-privileged=true
--service-cluster-ip-range=172.17.0.0/16
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,
ValidatingAdmissionWebhook,ResourceQuota,NodeRestriction
--anonymous-auth=false
--apiserver-count=3
--audit-log-maxage=30
--audit-log-maxbackup=3
--audit-log-maxsize=100
--audit-log-path=/var/log/kube-audit/audit.log
--audit-policy-file=/etc/kubernetes/conf/audit-policy.yaml
--authorization-mode=Node,RBAC --client-ca-file=/etc/kubernetes/ssl/k8s-root-ca.pem
--enable-bootstrap-token-auth
--enable-garbage-collector
--enable-logs-handler --enable-swagger-ui
--etcd-cafile=/etc/etcd/ssl/etcd-root-ca.pem --etcd-certfile=/etc/etcd/ssl/etcd.pem
--etcd-keyfile=/etc/etcd/ssl/etcd-key.pem --etcd-compaction-interval=5m0s
--etcd-count-metric-poll-period=1m0s --event-ttl=48h0m0s
--kubelet-https=true
--kubelet-timeout=3s --max-requests-inflight=800 --log-flush-frequency=5s
--token-auth-file=/etc/kubernetes/token.csv
--tls-cert-file=/etc/kubernetes/ssl/kube-apiserver.pem
--tls-private-key-file=/etc/kubernetes/ssl/kube-apiserver-key.pem
--service-node-port-range=30000-50000
--service-account-key-file=/etc/kubernetes/ssl/k8s-root-ca.pem
--storage-backend=etcd3
--enable-swagger-ui=true
二、下载集群二进制包
E:\k8s二进制程序\v1.13.1\server\kubernetes-server-linux-amd64\kubernetes\server\bin
内包括 kube-controller-manager 二进制程序,这里注意发布的版本有集成版本 hyperkube、独立二进制版本kube-controller-manager
以及 kube-controller-manager.tar(docker镜像版本)
三、官方介绍kube-controller-manager的启动选项参数说明
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-controller-manager/ 中文版本
https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/ 英文版本
四、代码层面
1.入口函数
E:\k8s源码\kubernetes-1.10.13\kubernetes-1.10.13\cmd\kube-controller-manager
我们查看cmd下的kube-controller-manager,会发现大量引用的都是 E:\k8s源码\kubernetes-1.10.13\kubernetes-1.10.13\pkg\controller 和apimachinery的内容
2.配置主要看两个地方
E:\k8s源码\kubernetes-1.10.13\kubernetes-1.10.13\cmd\controller-manager\app\options (放置了一部分配置参数选项设置)
E:\k8s源码\kubernetes-1.10.13\kubernetes-1.10.13\cmd\kube-controller-manager\app\options (放置了另一部分配置参数选项设置)
3.处理逻辑
E:\k8s源码\kubernetes-1.10.13\kubernetes-1.10.13\pkg\controller 这里放置了各种的controller
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类