目录
5-3.部署高可用 kube-controller-manager 集群
一、背景
虽然kubeadm搭建k8s集群的方式很方便,但是如果想要能够更多地了解k8s的组件,建议还是通过二进制方式逐步搭建集群。这里参考了好些达人们的搭建步骤,并全程自行搭建完成。
其中遇到不少问题,有自己迷糊地看错敲错的问题;也有版本环境不同的问题;还有一些是参考文档自身的bug。各种曲折沮丧无法用文字形容。这里记录搭建的步骤,算是对自己的一个总结,也为各位看官提供思路吧。
PS:由于还在学习中,有许多知识点不甚了解,所以这里以记录具体步骤为主。
二、步骤
整体步骤和思路是按照参考文档来的,只是根据环境和版本不同,细节之处有一些差异。由于篇幅限制,也出于对原作者的尊重,本文中的步骤,只针对自己环境与文中有差异,或者文中有误的地方做记录。原始步骤欢迎大家移步该作者的原文参考。
0.环境和版本
1)操作系统相关
内容 | 版本 | 操作命令 |
操作系统:CentOS | 7.8.2003 | cat /etc/redhat-release |
内核:Linux | 4.14.131 | cat /proc/version 或 uname -a |
注意:内核版本至少需在v4.1及以上,曾经在部署calico插件时就出现类似内核版本问题的报错。在参考文档中也给出有为何要升级内核版本的解释。手动升级内核操作可参考:手动升级CentOS内核到指定版本
2)软件或镜像版本
组件 | 版本 | 下载地址 | 说明 |
---|---|---|---|
cfssl* | 1.4.1 | wget https://github.com/cloudflare/cfssl/releases/download/v1.4.1/cfssl*** | |
kubernetes | 1.19.2 | https://github.com/kubernetes/kubernetes/tags | |
etcd | 3.4.2 | https://github.com/etcd-io/etcd/tags?after=api%2Fv3.5.0-alpha.0 | |
docker | 20.10.3 | ---- | 直接通过yum安装的 |
runc | 1.0.0-rc10 | https://github.com/opencontainers/runc/tags | |
calico | 3.8.2 | curl https://docs.projectcalico.org/v3.8/manifests/calico.yaml -O | |
calicoctl | 3.18.0 | curl -O -L https://github.com/projectcalico/calicoctl/releases/download/v3.18.0/calicoctl | |
cni-plugins | 0.8.7 | https://github.com/containernetworking/plugins/tags | |
nginx | 1.18.0 | http://nginx.org/en/download.html | |
pause | 3.2 | 这是镜像,后面会用到 |
注意:这里给出的是手动下载地址,方便在离线状况下手动安装。
1.初始化变量
1)节点IP规划:
节点角色 | 节点名称 | IP |
master | master | 10.0.12.234 |
worker | node1 | 10.0.12.235 |
worker | node2 | 10.0.12.236 |
2)环境变量
参考:https://github.com/opsnull/follow-me-install-kubernetes-cluster/blob/master/manifests/environment.sh
注意:SERVICE_CIDR和CLUSTER_CIDR的配置
#!/usr/bin/bash
# 生成 EncryptionConfig 所需的加密 key
export ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64)
# 集群各机器 IP 数组
export NODE_IPS=(10.0.12.234 10.0.12.235 10.0.12.236)
# 集群各 IP 对应的主机名数组
export NODE_NAMES=(master node1 node2)
# etcd 集群服务地址列表
export ETCD_ENDPOINTS="https://10.0.12.234:2379,https://10.0.12.235:2379,https://10.0.12.236:2379"
# etcd 集群间通信的 IP 和端口
export ETCD_NODES="master=https://10.0.12.234:2380,node1=https://10.0.12.235:2380,node2=https://10.0.12.236:2380"
# kube-apiserver 的反向代理(kube-nginx)地址端口
export KUBE_APISERVER="https://127.0.0.1:8443"
# 节点间互联网络接口名称
export IFACE="eth0"
# etcd 数据目录
export ETCD_DATA_DIR="/data/k8s/etcd/data"
# etcd WAL 目录,建议是 SSD 磁盘分区,或者和 ETCD_DATA_DIR 不同的磁盘分区
export ETCD_WAL_DIR="/data/k8s/etcd/wal"
# k8s 各组件数据目录
export K8S_DIR="/data/k8s/k8s"
## DOCKER_DIR 和 CONTAINERD_DIR 二选一
# docker 数据目录
export DOCKER_DIR="/data/k8s/docker"
# containerd 数据目录
export CONTAINERD_DIR="/data/k8s/containerd"
## 以下参数一般不需要修改
# TLS Bootstrapping 使用的 Token,可以使用命令 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成
BOOTSTRAP_TOKEN="41f7e4ba8b7be874fcff18bf5cf41a7c"
# 最好使用 当前未用的网段 来定义服务网段和 Pod 网段
# 服务网段,部署前路由不可达,部署后集群内路由可达(kube-proxy 保证)
# 这里,如果物理节点ip使用10网段,建议这里的集群网络采用192.168网段,反之也可
SERVICE_CIDR="192.168/16"
# Pod 网段,建议 /16 段地址,部署前路由不可达,部署后集群内路由可达(flanneld 保证)
# 这个是创建给pod使用的网段,不能和物理节点IP段重合
CLUSTER_CIDR="100.30.0.0/16"
# 服务端口范围 (NodePort Range)
export NODE_PORT_RANGE="30000-32767"
# kubernetes 服务 IP (一般是 SERVICE_CIDR 中第一个IP)
export CLUSTER_KUBERNETES_SVC_IP="192.168.0.1"
# 集群 DNS 服务 IP (从 SERVICE_CIDR 中预分配)
export CLUSTER_DNS_SVC_IP="192.168.0.2"
# 集群 DNS 域名(末尾不带点号)
export CLUSTER_DNS_DOMAIN="cluster.local"
# 将二进制目录 /opt/k8s/bin 加到 PATH 中
export PATH=/opt/k8s/bin:$PATH
其余步骤参考:01. 初始化系统和全局变量
2.创建 CA 根证书和私钥
3.安装kubectl
4.安装etcd集群
1)根据具体环境修改 etcd-csr.json 中的IP地址。
2)将 etcd.service.template 中,除 ##NODE_NAME## 以外的变量替换成具体值;末尾的“\\”需要替换成“\”。
5-1.master节点
5-2.部署 kube-apiserver 集群
1)根据具体环境修改 kubernetes-csr.json 中的IP地址。
2)将 kubernetes-csr.json 中的变量,替换成具体值。
3)将 kube-apiserver.service.template 中,除 ##NODE_IP## 以外的变量替换成具体值;末尾的“\\”需要替换成“\”。
***遇到的问题:操作中由于没有注意到这一点,导致在配置calico时,出现有x509证书问题。可参考:https://github.com/opsnull/follow-me-install-kubernetes-cluster/issues/584
5-3.部署高可用 kube-controller-manager 集群
1)根据具体环境修改 kube-controller-manager-csr.json 中IP地址。
2)将 kube-controller-manager.service.template 中,除 ##NODE_IP## 以外的变量替换成具体值;末尾的“\\”需要替换成“\”。
参考:05-3. 部署高可用 kube-controller-manager 集群
5-4.部署高可用kube-scheduler集群
1)根据具体环境修改 kube-scheduler-csr.json 中的IP地址。
2)遇到的问题:A. 在配置 kube-scheduler.service.template 时,原文有误。
出现类似报错:--requestheader-allowed-names is no value
这里作者已经修订,更正方式:--requestheader-allowed-names="aggregator"
B. 出现类似报错:https://github.com/opsnull/follow-me-install-kubernetes-cluster/issues/519
更正方式:https://github.com/kelseyhightower/kubernetes-the-hard-way/issues/427
apiVersion: kubescheduler.config.k8s.io/v1beta1
kind: KubeSchedulerConfiguration
clientConnection:
kubeconfig: "/var/lib/kubernetes/kube-scheduler.kubeconfig"
leaderElection:
leaderElect: true
参考:05-4. 部署高可用 kube-scheduler 集群
6-1. worker节点
6-2. 部署apiserver 高可用
6-3. 安装Docker
1)添加镜像源:
{
"registry-mirrors": ["https://registry.docker-cn.com",
"http://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com",
"http://cr.console.aliyun.com/"],
"insecure-registries":["10.0.12.234:5000"]
}
其中,10.0.12.234:5000 是为创建本地仓库做准备。
参考:按照参考文档中的安装即可。
6-4. 安装CNI等插件
注意:这里没有使用containerd,而是安装的docker
6-5. 部署kubelet组件
1)将 kubelet-config.yaml.template 中,除 ##NODE_IP## 以外的变量替换成具体值。
2)将 kubelet.service.template 中,除 ##NODE_NAME## 以外的变量替换成具体值;末尾的“\\”需要替换成“\”。
3)增加2个参数:
--cni-bin-dir=/opt/k8s/bin \
--pod-infra-container-image=10.0.12.234:5000/k8s.gcr.io/pause:3.2 \
######
A.若未指定 --cni-bin-dir,会出现类似无法找到cni文件的报错信息。根据网上查看的资料说,尽管k8s在v1.19已经不需要该参数,但实际情况是仍然需要指定
B.--pod-infra-container-image指定从本地镜像仓库拉去pause镜像。若未指定,可能出现pod一直在Init状态
######
删除2个参数:
由于没有使用containerd,所以删除了 --container-runtime的两个参数
4)遇到的问题:A.开始配置token时采用了environment.sh中的固定值,导致kubelet无法启动。
B. 授予 kube-apiserver 访问 kubelet API 的权限时,由于前面的步骤重新配置了,这里需要重新授权时,提示已有kube-apiserver 所以要先删除原有的绑定关系重新授权
删除原有授权的命令:
# kubectl delete clusterrolebinding kube-apiserver:kubelet-apis
6-6.部署kube-proxy组件
1)在创建和分发 kubeconfig 文件时(kube-proxy.kubeconfig),将${KUBE_APISERVER}替换为environment.sh中的值。
2)将 kube-proxy-config.yaml.template 中,除 ##NODE_IP## 以外的变量替换成具体值。
3)将 kube-proxy.service 中变量替换成具体值;末尾的“\\”需要替换成“\”。
6-7.部署Calico组件
1)下载calico.yaml:
curl https://docs.projectcalico.org/v3.8/manifests/calico.yaml -O
2)修改calico.yaml
A.修改yaml文件中所有镜像下载地址(因为前面安装docker的步骤里,已经创建了registry本地镜像仓库:10.0.12.234:5000)
如,
image: 10.0.12.234:5000/calico/node:v3.8.2
*** 遇到的问题:未正确修改镜像仓库和镜像版本,镜像拉不下来或出错。
B.修改CALICO_IPV4POOL_CIDR的value为environment.sh文件中${CLUSTER_CIDR}
C.增加变量。可以通过# ip a查看实际网卡地址填写,这次采用通配符方式。
# Auto-detect the BGP IP address.
- name: IP_AUTODETECTION_METHOD
value: "interface=eth.*|en.*|em.*"
D.修改“path: /opt/cni/bin”为“path: /opt/k8s/bin”
E.增加如下变量
# Set Felix logging to "info"
- name: FELIX_LOGSEVERITYSCREEN
value: "info"
......
# 增加的3个变量如下
- name: KUBERNETES_SERVICE_HOST
value: "10.0.12.234"
- name: KUBERNETES_SERVICE_PORT
value: "6443"
- name: KUBERNETES_SERVICE_PORT_HTTPS
value: "6443"
F. 修改calico-node的健康检查
livenessProbe:
exec:
command:
- /bin/calico-node
- -felix-ready
- -bird-ready
*** 遇到的问题:启动calico后,calico-node一直不断重启,检查日志发现,出现类似报错:calico/node is not ready: BIRD is not ready: BGP not established
G.修改污点兼容规则:
containers:
- name: calico-kube-controllers
......
# 增加污点兼容规则
tolerations:
- key: "CriticalAddonOnly"
operator: "Exists"
- effect: "NoSchedule"
key: "node.kubernetes.io/not-ready"
containers:
- name: calico-node
......
# 增加污点兼容规则
tolerations:
- effect: "NoSchedule"
operator: "Exists"
- key: "CriticalAddonOnly"
operator: "Exists"
- effect: "NoExecute"
key: "Exists"
- effect: "NoSchedule"
key: "node.kubernetes.io/not-ready"
operator: "Exists"
- effect: "NoExecute"
key: "node.kubernetes.io/unreachable"
operator: "Exists"
*** 遇到的问题:calico-kube-controllers一直无法启动。使用kubectl describe pod看到报错,是与taint相关;使用命令# kubectl describe node | grep Taint查看污点信息发现node是NoSchedule的。
6-8.安装calicoctl
1)下载:curl -O -L https://github.com/projectcalico/calicoctl/releases/download/v3.18.0/calicoctl
详见参考文档
三、遇到的问题
1.在01章节--优化内核参数时,按照步骤进行,最后提示如下两项没有。实际通过# sysctl -a | grep bridge可以查看到。
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
注意:由于内核的升级,部分参数已经自动设置好
2.为了方便对比,遇到的问题都在相应的步骤中指出。
四、参考文档
https://github.com/opsnull/follow-me-install-kubernetes-cluster -- 安装k8s,这篇文整体上步骤和思路都是最清晰的,并且出错的较少。
https://blog.csdn.net/qq_41709494/article/details/94603041 -- 安装docker-ce
https://www.cnblogs.com/Christine-ting/p/12837250.html -- 拉取calico镜像以及配置本地registry镜像仓库
https://blog.51cto.com/14268033/2493173-- 安装calicoctl