kubernetes-v1.20.8二进制安装(五)-kube-controller-manager
1. kube-controller-manager部署
kube-controller-manager 用于实现 Kubernetes 集群故障检测和恢复的自动化工作
该集群包含 3 个节点,启动后将通过竞争选举机制产生一个 leader 节点,其它节点为阻塞状态。当 leader 节点不可用时,阻塞的节点将再次进行选举产生新的 leader 节点,从而保证服务的可用性。
kube-controller-manager 在如下两种情况下使用该证书:
- 与
kube-apiserver
的安全端口通信; - 在安全端口
(https,10257)
输出prometheus
格式的 metrics;
1.20版本以前 kube-controller-manager 设置为只调用当前机器的 apiserver,走127.0.0.1网卡,因此不配制SSL证书
1.20版本+ --insecure-port has been deprecated, This flag has no effect now and will be removed in v1.24
--insecure-port
默认禁用已弃用的。从 v1.20 开始,该端口将被永久禁用,并在以后的版本中删除该标志。
相比于1.15版本,无法让master其他必要组件使用http方式进行访问,只能通过https方式访问
1.1. 下载kubernetes二进制包
如前篇章节已做该步骤, 请忽略该小节
当前使用kubernetes版本为 1.20.8
获取安装包(需要FQ下载)
wget https://dl.k8s.io/v1.20.8/kubernetes-server-linux-amd64.tar.gz -P /opt/software/kubernetes/tools
解压相关文件至对应目录
cd /opt/software/kubernetes/bin
tar --strip-components=3 -xvpf /opt/software/kubernetes/tools/kubernetes-server-linux-amd64.tar.gz kubernetes/server/bin/kubectl
cd /opt/software/kubernetes/master/bin
tar --strip-components=3 -xvpf /opt/software/kubernetes/tools/kubernetes-server-linux-amd64.tar.gz kubernetes/server/bin/{kube-apiserver,kube-controller-manager,kubectl,kube-scheduler}
cd /opt/software/kubernetes/node/bin
tar --strip-components=3 -xvpf /opt/software/kubernetes/tools/kubernetes-server-linux-amd64.tar.gz kubernetes/server/bin/{kubelet,kube-proxy}
--strip-components
忽略目录层数,只解压出文件
1.2. 生成kube-controller-manager证书
cfssl
支持SAN(Subject Alternative Name)
,它是X.509中定义的一个扩展,使用了SAN字段的SSL证书,可以扩展此证书支持的域名,即一个证书可以支持多个不同域名的解析,即下面的 *.k8s-host.com
,有利于节点的扩展,不用和以前的部署中提前将需要的IP写入到证书hosts中。
cat > /opt/software/kubernetes/certs/kube-controller-manager-csr.json<<EOF
{
"CN": "system:kube-controller-manager",
"key": {
"algo": "rsa",
"size": 2048
},
"hosts": [
"127.0.0.1",
"*.k8s-host.com"
],
"names": [
{
"C": "CN",
"ST": "Guangzhou",
"L": "TianHe",
"O": "system:kube-controller-manager",
"OU": "system"
}
]
}
EOF
生成证书
cd /opt/software/kubernetes/certs/
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-controller-manager-csr.json | cfssl-json -bare kube-controller-manager
cp kube-controller-manager.pem kube-controller-manager-key.pem /opt/software/kubernetes/master/certs/
1.3. 生成kubeconfig文件
设置集群参数
kubectl config set-cluster kubernetes --certificate-authority=ca.pem --embed-certs=true --server=https://islb.k8s-host.com:6443 --kubeconfig=/opt/software/kubernetes/master/kubeconfig/kube-controller-manager.kubeconfig
- master与node节点的
islb.k8s-host.com
不同, 是因为master的controller-manager
和scheduler
服务都与apiserver
为同一台服务器,所以直接指向127.0.0.1
即可
设置客户端认证参数
kubectl config set-credentials system:kube-controller-manager --client-certificate=kube-controller-manager.pem --client-key=kube-controller-manager-key.pem --embed-certs=true --kubeconfig=/opt/software/kubernetes/master/kubeconfig/kube-controller-manager.kubeconfig
设置上下文参数
kubectl config set-context system:kube-controller-manager --cluster=kubernetes --user=system:kube-controller-manager --kubeconfig=/opt/software/kubernetes/master/kubeconfig/kube-controller-manager.kubeconfig
设置默认上下文
kubectl config use-context system:kube-controller-manager --kubeconfig=/opt/software/kubernetes/master/kubeconfig/kube-controller-manager.kubeconfig
1.4. 编写配置文件
注意各个节点bind-address的修改
cat > /opt/software/kubernetes/master/config/kube-controller-manager.conf<<EOF
KUBE_CONTROLLER_MANAGER_OPTS="--bind-address=0.0.0.0 \\
--address=127.0.0.1 \\
--port=10252 \\
--secure-port=10257 \\
--kubeconfig=/opt/software/kubernetes/kubeconfig/kube-controller-manager.kubeconfig \\
--service-cluster-ip-range=10.254.0.0/16 \\
--cluster-name=kubernetes \\
--cluster-signing-cert-file=/opt/software/kubernetes/certs/ca.pem \\
--cluster-signing-key-file=/opt/software/kubernetes/certs/ca-key.pem \\
--service-account-private-key-file=/opt/software/kubernetes/certs/ca-key.pem \\
--tls-cert-file=/opt/software/kubernetes/certs/kube-controller-manager.pem \\
--tls-private-key-file=/opt/software/kubernetes/certs/kube-controller-manager-key.pem \\
--root-ca-file=/opt/software/kubernetes/certs/ca.pem \\
--use-service-account-credentials=true \\
--cluster-signing-duration=87600h \\
--leader-elect=true \\
--feature-gates=RotateKubeletServerCertificate=true \\
--controllers=*,bootstrapsigner,tokencleaner \\
--use-service-account-credentials=true \\
--alsologtostderr=true \\
--logtostderr=true \\
--log-dir=/opt/software/kubernetes/logs \\
--v=2"
EOF
--port=10252
:如值为0,则关闭监听非安全端口(http),同时--address
参数无效,--bind-address
参数有效;--secure-port=10257
、--bind-address=0.0.0.0
: 在所有网络接口监听 10252 端口的 https /metrics 请求;--kubeconfig
:指定 kubeconfig 文件路径,kube-controller-manager 使用它连接和验证 kube-apiserver;--authentication-kubeconfig
和--authorization-kubeconfig
:kube-controller-manager 使用它连接 apiserver,对 client 的请求进行认证和授权。kube-controller-manager
不再使用--tls-ca-file
对请求 https metrics 的 Client 证书进行校验。如果没有配置这两个 kubeconfig 参数,则 client 连接 kube-controller-manager https 端口的请求会被拒绝(提示权限不足)。--cluster-signing-*-file
:签名 TLS Bootstrap 创建的证书;--experimental-cluster-signing-duration
:指定 TLS Bootstrap 证书的有效期;--root-ca-file
:放置到容器 ServiceAccount 中的 CA 证书,用来对 kube-apiserver 的证书进行校验;--service-account-private-key-file
:签名 ServiceAccount 中 Token 的私钥文件,必须和 kube-apiserver 的--service-account-key-file
指定的公钥文件配对使用;--service-cluster-ip-range
:指定 Service Cluster IP 网段,必须和 kube-apiserver 中的同名参数一致;--leader-elect=true
:集群运行模式,启用选举功能;被选为 leader 的节点负责处理工作,其它节点为阻塞状态;--controllers=*,bootstrapsigner,tokencleaner
:启用的控制器列表,tokencleaner 用于自动清理过期的 Bootstrap token;--horizontal-pod-autoscaler-*
:custom metrics 相关参数,支持 autoscaling/v2alpha1;--tls-cert-file
、--tls-private-key-file
:使用 https 输出 metrics 时使用的 Server 证书和秘钥;--use-service-account-credentials=true
: kube-controller-manager 中各 controller 使用 serviceaccount 访问 kube-apiserver;
--leader-elect-resource-lock="leases"
用于在leader选举期间锁定资源的类型, 1.20版本默认值为"leases", 1.19版本为"endpointsleases", 查看基础组件信息可使用命令kubectl get leases
查看. (添加该参数为默认值会报错,所以此处省略,保持默认值)
1.5. 编写service启动文件
cat >/opt/software/kubernetes/master/service/kube-controller-manager.service<<EOF
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes
[Service]
Type=simple
EnvironmentFile=-/opt/software/kubernetes/config/kube-controller-manager.conf
ExecStart=/opt/software/kubernetes/bin/kube-controller-manager \$KUBE_CONTROLLER_MANAGER_OPTS
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
1.6. 分发
hosts=(master01 master02 master03)
domain='k8s-host.com'
config_files=('config/kube-controller-manager.conf')
cd /opt/software/kubernetes
for host in ${hosts[*]}
do
scp -r master/{bin,certs,kubeconfig,service} ${host}.${domain}:/opt/software/kubernetes/
done
# 不可重复执行,否则覆盖修改的配置
for host in ${hosts[*]}
do
for file in ${config_files[*]}
do
scp -r master/${file} ${host}.${domain}:/opt/software/kubernetes/${file}
done
done
1.7. 服务启动
请修改各个节点配置文件的差异地方
设置service文件软链接且启动
hosts=(master01 master02 master03)
domain='k8s-host.com'
for host in ${hosts[*]}
do
# 软链接
ssh root@${host}.${domain} "ln -s /opt/software/kubernetes/service/kube-controller-manager.service /usr/lib/systemd/system/kube-controller-manager.service"
# 开机启动并启动服务
ssh root@${host}.${domain} "systemctl daemon-reload && systemctl enable kube-controller-manager.service --now "
done
1.8. 验证服务
前提客户端已配置kubectl
命令
1.20版本之前可使用命令kubectl get endpoints
查看集群信息, 当前显示leader为master01, 可关停master01
测试是否转移.
$ kubectl get leases -n kube-system
NAME HOLDER AGE
kube-controller-manager master01.k8s-host.com_xxxxx 3d18h
2. 问题
(有待补充)