目录

一、背景

二、步骤

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一直不断重启,检查日志发现,出现类似报错: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的。

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

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐