官方的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=/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=/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镜像版本)

kubernetes常用控制器之DaemonSet然后进redis容器查看数据 kubernetes controller-manager_ide

 

 

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