Kubeadm部署单Master节点的K8s集群

Kubenates 集群部署方式

kubeadm部署

官网安装地址:https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/

  • kubeadm 是一个工具,可以通过kubeadm init 和kubeadm join快速部署k8s集群
  • kubeadm 的前置操作非常多,会安装各种各样的插件,网络插件,但是安装过程简单

minikube 部署

RKE部署k8s

公有云部署

  • 阿里云ACK
  • 华为云CCE(Cloud Container Engine)
  • 腾讯云EKS(Elastic Kubernetes Service)

国内三方部署工具

  • kubekey
  • kubeasz

Kubeadm部署单Master节点的K8s集群(K8s 1.21 部署)

经过不断的摸索尝试,除了最后的k8s的初始化节点(kubelet init之后的操作) ,其他的前置准备工作,每个节点都要做

清单中2.5之前的工作,每一个工作节点都要执行

部署环境准备工作

操作系统统一使用CentOS7.9
整个过程在vmware虚拟机中进行
每个节点至少2核心4G的配置
网络模式:Net模式
网关:192.168.77.2

CPU 内存 硬盘 角色 主机名称 ip地址
2Core 4G 50G master k8s-master01 192.168.77.210
2Core 4G 50G worker k8s-worker01 192.168.77.211
2Core 4G 50G worker k8s-worker02 192.168.77.212

主机配置

主机名配置

分别设置三台主机的主机名称

k8s-master01

1
hostnamectl set-hostname k8s-master01  # 192.168.77.210

k8s-worker01

1
hostnamectl set-hostname k8s-worker01   # 192.168.77.211

8s-worker02

1
hostnamectl set-hostname k8s-worker02   # 192.168.77.212

主机ip地址配置

/etc/sysconfig/network-scripts/ifcfg-ens33
1
vim /etc/sysconfig/network-scripts/ifcfg-ens33

k8s-master01的ip地址配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="f693d834-f55e-4c2e-8329-957cc221303d"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.77.210"
GATEWAY="192.168.77.2"
DNS1="119.29.29.29"

k8s-worker01的ip地址配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="f693d834-f55e-4c2e-8329-957cc221303d"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.77.211"
GATEWAY="192.168.77.2"
DNS1="119.29.29.29"

k8s-worker02的ip地址配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@k8s-worker02 ~]# 
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="f693d834-f55e-4c2e-8329-957cc221303d"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.77.212"
GATEWAY="192.168.77.2"
DNS1="119.29.29.29"

主机名和IP地址解析

所有的集群主机都需要配置 vim /etc/hosts 追加如下配置

1
2
3
192.168.77.210 k8s-master01
192.168.77.211 k8s-worker01
192.168.77.212 k8s-worker02

关闭防火墙配置

1
2
3
# systemctl disable firewalld  关闭开机子启动
# systemctl stop firewalld 关机防火墙
# firewall-cmd --state

禁用SELINUX配置

所有的主机都要操作,操作完成后要重启服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vim /etc/selinux/config


# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted

更改上述配置文件中的

1
2
SELINUX=enforcing  为disabled
然后保存退出

时间同步配置(所有节点)

同步时间服务器需要安装ntpdate

1
yum install ntpdate
1
2
3
# which ntpdate  查看
crontab -e
0 */1 * * * ntpdate time1.aliyun.com #每隔一小时同步一下阿里云服务器

升级操作系统内核(所有节点都要执行)

1
2
导入 elrepo gpg key (确认软件合法性)
# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
1
2
3
安装elrepo yum 源仓库
# yum -y install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
# 验证是否包含elrepo的包 yum repolist 观察是否存在elrepo
1
2
安装kernel-ml 内核版本,ml为长期稳定版本,lt 为长期维护版本
# yum --enablerepo="elrepo-kernel" -y install kernel-ml.x86_64
1
2
3
4
5
设置安装的内核优先启动 ,设置默认的引导项为0
# grub2-set-default 0
该命令不会立即生效,所以需要重新生成配置文件
# grub2-mkconfig -o /boot/grub2/grub.cfg

1
2
3
4
# 更新后需要重启,使用升级的内核生效
reboot
uname -r
重启后查看内核是否更新为对应的版本 uname -r

配置内核转发及网桥过滤

所有的主机均需要操作

添加网桥过滤及内核转发配置文件

1
2
3
4
5
6
vim /etc/sysctl.d/k8s.conf
复制如下到该文件中
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
vm.swappiness=0

保存退出

1
2
3
4
5
6
7
8
9
# 加载br_netfilter模块
modprobe br_netfilter

查看是否加载
lsmod | grep br_netfilter

# 加载网桥过滤及内核转发配置文件
sysctl -p /etc/sysctl.d/k8s.conf

安装ipset及ipvadm

1
主要为了实现service转发  

安装ipset 及ipvsadm

1
2
3
4
5
6
7
8
9
10
yum -y install ipset ipvsadm
# 配置ipvsadm 模块加载方式
cat > /etc/sysconfig/modules/ipvs.modules << EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF

授权、运行检查是否加载

1
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack

关闭swap分区(所有节点都要执行)

因为关闭后,可以提高k8s的性能。且初始化master节点的时候不会报错

1
2
3
4
5
6
7
8
9
10
11
12
vi /etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon Oct 3 15:41:00 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=715915d4-5b52-469f-a69d-f92410a28415 /boot xfs defaults 0 0
#/dev/mapper/centos-swap swap swap defaults 0 0 swap前加个#号

装Docker(所有的节点都要执行)

下面是阿里云官网提供的安装的方式

查看可以安装的docker的版本

1
yum list docker-ce.x86_64 --showduplicates |sort -r

配置docker安装

1
2
3
4
5
6
7
8
9
10
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

配置镜像加速器

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://rv0ikufp.mirror.aliyuncs.com"] # 配置自己的阿里云镜像操作地址
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

配置开启自启动

1
systemctl enable docker;systemctl start docker

修改cgroup 方式

1
2
3
4
vim /etc/docker/daemon.json 中添加如下内容
{
"exec-opts":["native.cgroupdriver=systemd"]
}

重启docker

1
systemctl restart docker

kubelet集群部署

kubeadm kubelet kubectl
版本 1.21.0 1.21.0 1.21.0
安装位置 集群中所有的主机 集群中所有的主机 集群中所有的主机
作用 初始化集群、管理集群等 用于接口api-server并对pod的生命周期进行管理 集群应用的命令行管理工具

kubernates yum 源准备

阿里云的yum源 (所有的节点都要执行)

vim /etc/yum.repos.d/kubernetes.repo

1
2
3
4
5
6
7
8
9
10
11
12
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF


1
yum repolist 查看yum源是否可用,网络不好的情况下,注意观察,否则后续操作可能会失败

集群软件安装(都要执行)

1
2
3
4
5
6
7
8
# 查看指定的版本
yum list kubeadm.x86_64 --showduplicates | sort -r
yum list kublet.x86_64 --showduplicates | sort -r
yum list kubectl.x86_64 --showduplicates | sort -r


# 安装指定的版本
yum -y install --setopt=obsoletes=0 kubeadm-1.21.0-0 kubelet-1.21.0-0 kubectl-1.21.0-0

配置kubelet(都要执行)

1
2
3
4
5
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"

# 设置kubelet开机自启动
systemctl enable kubelet

集群镜像准备(所有节点都要)

1
#强制删除所有镜像的命令(慎用)  docker rmi --force $(docker images -q)
1
2
3
# 查看 需要下载镜像
kubeadm config images list --kubernetes-version=v1.21.0

编写镜像下载脚本 vim images_pull.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
images_list='
k8s.gcr.io/kube-apiserver:v1.21.0
k8s.gcr.io/kube-controller-manager:v1.21.0
k8s.gcr.io/kube-scheduler:v1.21.0
k8s.gcr.io/kube-proxy:v1.21.0
k8s.gcr.io/pause:3.4.1
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns/coredns:v1.8.0'

for i in $images_list
do
docker pull $i
done

docker save -o k8s-1-21-0.tar $images_list

可能会遇到镜像拉不下来的场景,可以换成如下脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/bash
# 下面的镜像应该去除"k8s.gcr.io"的前缀,版本换成kubeadm config images list命令获取
到的版本
images=(
kube-apiserver:v1.21.0
kube-controller-manager:v1.21.0
kube-scheduler:v1.21.0
kube-proxy:v1.21.0
pause:3.4.1
etcd:3.4.13-0
coredns:v1.8.0
)
for imageName in ${images[@]} ;
do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
docker tag k8s.gcr.io/coredns:v1.8.0 k8s.gcr.io/coredns/coredns:v1.8.0
docker rmi k8s.gcr.io/coredns:v1.8.0

docker save -o k8s.1.21.0.tar \
k8s.gcr.io/kube-proxy:v1.21.0 \
k8s.gcr.io/kube-apiserver:v1.21.0 \
k8s.gcr.io/kube-controller-manager:v1.21.0 \
k8s.gcr.io/kube-scheduler:v1.21.0 \
k8s.gcr.io/coredns/coredns:v1.8.0 \
k8s.gcr.io/etcd:3.4.13-0 \
k8s.gcr.io/pause:3.4.1 \

保存镜像

1
2
3
4
5
6
7
8
docker save -o k8s.1.21.0.tar \
k8s.gcr.io/kube-proxy:v1.21.0 \
k8s.gcr.io/kube-apiserver:v1.21.0 \
k8s.gcr.io/kube-controller-manager:v1.21.0 \
k8s.gcr.io/kube-scheduler:v1.21.0 \
k8s.gcr.io/coredns:v1.8.0 \
k8s.gcr.io/etcd:3.4.13-0 \
k8s.gcr.io/pause:3.4.1 \

master节点初始化工作

初始化

1
2
3
4
5
kubeadm init --kubernetes-version v1.21.0 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.77.210
# 只有master节点进行初始化
# --kubernetes=v1.21.0 k8s的版本
# --pod-network-cidr=10.244.0.0/16 k8s集群内的网络 不要使用真实网络的网段
# --apiserver-advertise-address=192.168.77.210 api-server监听的地址

会得到以下提示,按照步骤输入即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:
# 部署配置
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

export KUBECONFIG=/etc/kubernetes/admin.conf
#部署网络
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:
# 工作节点加入master中
kubeadm join 192.168.77.210:6443 --token el7wfg.8xwwykz5hcn8y0ew \
--discovery-token-ca-cert-hash sha256:a6295f2bb6fff92c8b20e6506baa8f7f8a88abade29a3e29c9ff5382c3956f3b
您在 /var/spool/mail/root 中有新邮件

第一步执行配置命令:

1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

kubernate 集群网络配置

https://projectcalico.docs.tigera.io/getting-started/kubernetes/quickstart

左侧Install Calico] -> Kubernetes->Quickstart

运行

1
2
# 如果这一步执行不了,把域名换成指定的ip地址配置在hosts里面  域名ip查询链接链接:http://ip.tool.chinaz.com/  或者把文件下载到本地计算机再上传到服务器里面,不需要改什么东西
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/tigera-operator.yaml

第二步骤,下载该文件,如果文件下载不下来,可以使用如下已经下载好的文件

wget https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/custom-resources.yaml

custom-resources.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# This section includes base Calico installation configuration.
# For more information, see: https://projectcalico.docs.tigera.io/master/reference/installation/api#operator.tigera.io/v1.Installation
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
name: default
spec:
# Configures Calico networking.
calicoNetwork:
# Note: The ipPools section cannot be modified post-install.
ipPools:
- blockSize: 26
cidr: 10.244.0.0/16 # 更改为自己的网段
encapsulation: VXLANCrossSubnet
natOutgoing: Enabled
nodeSelector: all()

---

# This section configures the Calico API server.
# For more information, see: https://projectcalico.docs.tigera.io/master/reference/installation/api#operator.tigera.io/v1.APIServer
apiVersion: operator.tigera.io/v1
kind: APIServer
metadata:
name: default
spec: {}

修改13行为k8s初始化时自己设置的网段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
kubectl apply -f  custom-resources.yaml
kubectl get ns #查看命名空间calio-system

# 查看节点是否加入了calico网络中去
watch kubectl get pods -n calico-system
# 出现如下提示,网络就已经可以了
Every 2.0s: kubectl get pods -n calico-system Mon Oct 10 18:33:12 2022

NAME READY STATUS RESTARTS AGE
calico-kube-controllers-78687bb75f-4j7f5 1/1 Running 0 5m48s
calico-node-575vz 1/1 Running 0 5m49s
calico-typha-5978d86859-gfnwb 1/1 Running 0 5m49s
csi-node-driver-drqb2 2/2 Running 0 3m29s

# 如果某些节点一直处于初始化节点,需要把污点取消
kubectl taint nodes --all node-role.kubernetes.io/control-plane-node-role.kubernetes.io/master-

1
2
3
4
5
6
7
8
9
官网下载地址:
https://docs.projectcalico.org/v3.24.1/manifests/calico.yaml
github地址:
https://github.com/projectcalico/calico

docker pull calico/cni:v3.24.1
docker pull calico/pod2daemon-flexvol:v3.24.1
docker pull calico/node:v3.24.1
docker pull calico/kube-controllers:v3.24.1

安装calio客户端

https://projectcalico.docs.tigera.io/maintenance/clis/calicoctl/install

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
curl -L https://github.com/projectcalico/calico/releases/download/v3.24.1/calicoctl-linux-amd64 -o calicoctl
mv calicoctl /usr/bin
# 添加可执行权限
chmod +x /usr/bin/calicoctl

ls -l /usr/bin/calicoctl
# 查看版本
calicoctl version


效果如下:通过宿主机下面的隐藏文件,获取节点
[root@k8s-master01 calicodir]# DATASTORE_TYPE=kubernetes KUBECONFIG=~/.kube/config calicoctl get nodes
NAME
k8s-master01

[root@k8s-master01 calicodir]#

在k8s集群工作节点中添加

k8s-worker01节点

1
2
3
[root@k8s-worker02 ~]# kubeadm join 192.168.77.210:6443 --token el7wfg.8xwwykz5hcn8y0ew \
> --discovery-token-ca-cert-hash sha256:a6295f2bb6fff92c8b20e6506baa8f7f8a88abade29a3e29c9ff5382c3956f3b

k8s-worker02节点

1
2
3
[root@k8s-worker01 ~]# kubeadm join 192.168.77.210:6443 --token el7wfg.8xwwykz5hcn8y0ew \
> --discovery-token-ca-cert-hash sha256:a6295f2bb6fff92c8b20e6506baa8f7f8a88abade29a3e29c9ff5382c3956f3b

在master节点执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@k8s-master01 /]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane,master 5h41m v1.21.0
k8s-worker01 NotReady <none> 103s v1.21.0
k8s-worker02 NotReady <none> 98s v1.21.0

网络的初始化完成,需要一些时间,可以通过如下命令查询
[root@k8s-master01 /]# kubectl get pods -n calico-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-78687bb75f-4j7f5 1/1 Running 0 15m
calico-node-575vz 1/1 Running 0 15m
calico-node-d686n 0/1 Init:0/2 0 2m36s
calico-node-t2585 0/1 Init:0/2 0 2m41s
calico-typha-5978d86859-gfnwb 1/1 Running 0 15m
calico-typha-5978d86859-qk2mt 0/1 ContainerCreating 0 2m30s
csi-node-driver-drqb2 2/2 Running 0 13m

1
2
3
4
5
kubeadm init 初始化日志中会有kubeadm join 复制在worker节点中执行
# 查看节点是否加入了calico网络中去
DATASTORE_TYPE=kubernetes KUBECONFIG=~/.kube/config calicoctl get nodes


完全卸载K8s

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
kubeadm reset -f
modprobe -r ipip
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd
yum clean all
yum remove kube*



1、杀死运行的容器:

# docker kill $(docker ps -a -q)

2、删除所有容器:

# docker rm $(docker ps -a -q)

3、强制删除所有镜像:

# docker rmi -f $(docker images -q)

报错问题记录

K8S安装node加入到节点错误Running pre-flight checks

1
2
3
1.时间不同步
2.token过期
3.master主节点防火墙没有关闭

kubectl join 生成

1
kubeadm token create --ttl 0 --print-join-command