核心二进制组件源码之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
我们查下集群内的某台master的进程启动情况:
[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
   

posted @ 2022-05-30 01:02  jinzi  阅读(92)  评论(0编辑  收藏  举报