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-managerscheduler服务都与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. 问题

(有待补充)

3. 参考链接

posted @ 2021-09-03 18:01  风吹蛋生丶  阅读(842)  评论(0编辑  收藏  举报