二进制搭建k8s集群

发布于:2021-10-21 18:03:09

目录


一、背景


二、步骤


0.环境和版本


1.初始化变量


2.创建 CA 根证书和私钥


3.安装kubectl


4.安装etcd集群


5-1.master节点


5-2.部署 kube-apiserver 集群


5-3.部署高可用 kube-controller-manager 集群


5-4.部署高可用kube-scheduler集群


6-1. worker节点


6-2. 部署apiserver 高可用


6-3. 安装Docker


6-4. 安装CNI等插件


6-5. 部署kubelet组件


6-6.部署kube-proxy组件


6-7.部署Calico组件


三、遇到的问题


四、参考文档



一、背景

虽然kubeadm搭建k8s集群的方式很方便,但是如果想要能够更多地了解k8s的组件,建议还是通过二进制方式逐步搭建集群。这里参考了好些达人们的搭建步骤,并全程自行搭建完成。


其中遇到不少问题,有自己迷糊地看错敲错的问题;也有版本环境不同的问题;还有一些是参考文档自身的bug。各种曲折沮丧无法用文字形容。这里记录搭建的步骤,算是对自己的一个总结,也为各位看官提供思路吧。


PS:由于还在学*中,有许多知识点不甚了解,所以这里以记录具体步骤为主。


二、步骤

整体步骤和思路是按照参考文档来的,只是根据环境和版本不同,细节之处有一些差异。由于篇幅限制,也出于对原作者的尊重,本文中的步骤,只针对自己环境与文中有差异,或者文中有误的地方做记录。原始步骤欢迎大家移步该作者的原文参考。


0.环境和版本

1)操作系统相关


内容版本操作命令
操作系统:CentOS7.8.2003cat /etc/redhat-release
内核:Linux4.14.131cat /proc/version 或 uname -a

注意:内核版本至少需在v4.1及以上,曾经在部署calico插件时就出现类似内核版本问题的报错。在参考文档中也给出有为何要升级内核版本的解释。手动升级内核操作可参考:手动升级CentOS内核到指定版本


2)软件或镜像版本


组件版本下载地址说明
cfssl*1.4.1wget https://github.com/cloudflare/cfssl/releases/download/v1.4.1/cfssl***?
kubernetes1.19.2https://github.com/kubernetes/kubernetes/tags?
etcd3.4.2https://github.com/etcd-io/etcd/tags?after=api%2Fv3.5.0-alpha.0?
docker20.10.3----直接通过yum安装的
runc1.0.0-rc10https://github.com/opencontainers/runc/tags?
calico3.8.2curl https://docs.projectcalico.org/v3.8/manifests/calico.yaml -O?
calicoctl3.18.0curl -O -L? https://github.com/projectcalico/calicoctl/releases/download/v3.18.0/calicoctl?
cni-plugins0.8.7https://github.com/containernetworking/plugins/tags?
nginx1.18.0http://nginx.org/en/download.html?
pause3.2?这是镜像,后面会用到

注意:这里给出的是手动下载地址,方便在离线状况下手动安装。


1.初始化变量

1)节点IP规划:


节点角色节点名称IP
mastermaster10.0.12.234
workernode110.0.12.235
workernode210.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 根证书和私钥

参考:02. 创建 CA 根证书和秘钥


3.安装kubectl

参考:03. 安装和配置 kubectl


4.安装etcd集群

1)根据具体环境修改 etcd-csr.json 中的IP地址。


2)将 etcd.service.template 中,除 ##NODE_NAME## 以外的变量替换成具体值;末尾的“\”需要替换成“”。


参考:04. 部署 etcd 集群


5-1.master节点

参考:05-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


参考:05-2.部署 kube-apiserver 集群


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节点

参考:06-1. 部署 worker 节点


6-2. 部署apiserver 高可用

参考:06-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


参考:部署 containerd 组件


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

参考:06-4. 部署 kubelet 组件


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 中变量替换成具体值;末尾的“\”需要替换成“”。


参考: 06-5. 部署 kube-proxy 组件


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一直不断*簦觳槿罩痉⑾郑鱿掷嗨票ù恚篶alico/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的。


参考:06-6. 部署 calico 网络


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


?

相关推荐

最新更新

猜你喜欢