这里介绍使用 kubeadm 的方式进行搭建K8S集群。

搭建的K8S版本为 1.23 版本的,也就是底层还是使用docker作为容器运行时的版本。

1.机器环境准备和安装docker

这里我搭建的是三个结点的集群,分别为master节点 和 两个worker结点。我使用的linux系统为 Centos7。

角色

主机名

ip

master

k8s001

10.0.0.51

worker

k8s002

10.0.0.52

worker

k8s003

10.0.0.53

1.先进行服务器环境准备。(这里基础环境准备的操作直接使用脚本编写)

#!/bin/bash

# 关闭selinux(临时和永久) 
setenforce 0
sed -i 's#SELINUX=enforcing#disabled#' /etc/selinux/config

# 关闭临时分区(临时)
swapoff -a && sysctl -w vm.swappiness=0

# 永久设置关闭临时分区 (永久)
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

# 允许iptables转发关于k8s的数据包
cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

# 开启ipv4转发功能
  # 临时开启
sysctl -w net.ipv4.ip_forward=1
  # 永久开启
vim /etc/sysctl.conf
net.ipv4.ip_forward=1    # 更改或添加该行
sysctl -p /etc/sysctl.conf

# 更改 /etc/hosts文件,添加k8s集群内结点的ip映射关系(k8s运行会需要这个)
	# 注意是 cat >> 而不是 cat > 。cat >> 将内容追加到对应的文件内。
cat >> /etc/hosts <<EOF
10.0.0.51 k8s001
10.0.0.52 k8s002
10.0.0.53 k8s003
EOF


# 准备docker-ce的yum文件

	# 如果下载过docker的话,需要先将已经下载过的进行删除(防止有残留文件导致安装失败)
yum remove docker docker-common docker-selinux docker-engine
yum install -y yum-utils
	# 下载docker的yum文件
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

# 刷新yum缓存
yum clean all && yum makecache


# 安装docker-ce(这里需要指定安装 18 版本防止与k8s版本不兼容,因为本次安装的k8s版本为1.23,这个k8s版本还是使用docker作为容器运行时)
yum -y install docker-ce-18.09.4-3.el7

# 配置docker的配置文件(加速源、驱动)
  # # 配置docker的镜像加速站。如果有其它好用的加速站,可以在我提供的加速源后边使用 , 进行分割并追加其它加速源
  # # 设置容器的cgroupdrivers驱动为systemd模式,因为k8s需要使用这个模式
cat > /etc/docker/daemon.json <<EOF    
{
  "registry-mirrors": ["https://wpdym3f4.mirror.aliyuncs.com/"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

# 启动docker 并设置docker开机启动
systemctl daemon-reload && systemctl start docker && systemctl enable docker

2.将该脚本复制到另外两个服务器

# copy到k8s002结点
[root@k8s001 ~]# rsync -av env_preparation.sh root@10.0.0.52:/root/
# copy到k8s003结点
[root@k8s001 ~]# rsync -av env_preparation.sh root@10.0.0.53:/root/

3.三个结点分别都执行该脚本

[root@k8s001 ~]# bash env_preparation.sh
[root@k8s002 ~]# bash env_preparation.sh
[root@k8s003 ~]# bash env_preparation.sh

4.如果你有代理的话可以给docker配置代理 (可选。如果没有代理,这一步骤可以不做。)

# 查看docker服务的文件地址
[root@shangting clash]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
    # docker的服务文件为 /usr/lib/systemd/system/docker.service


# 修改docker服务文件,添加代理地址。(在[service]模块下添加自己的代理地址)
[root@k8s001 ~]# vim /usr/lib/systemd/system/docker.service
[service]
# 添加代理地址
Environment="HTTP_PROXY=http://127.0.0.1:7890/"
Environment="HTTPS_PROXY=http://127.0.0.1:7890/"

至此,所有服务器都已经完成了环境准备 和 docker-ce的安装。


2.初始化K8S集群

初始化集群使用k8s的master结点进行初始化,先给所有结点安装上k8s所需要的组件。

1.安装k8s组件

这里仍然使用脚本

# 编写脚本文件
[root@k8s001 ~]# vim install_k8s.sh

#!/bin/bash

# 配置k8s的yum源
cat  > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF


# 下载组件
  # 指定组件版本号
version="1.23.17-0"
  # 下载
yum -y install {kubeadm,kubelet,kubectl}-${version}

# 配置kubelet自启动
systemctl enable kubelet

2.将脚本文件复制到另外两台服务器

r

3.三台服务器执行 install_k8s.sh 脚本

[root@k8s001 ~]# bash install_k8s.sh 

# 另外两台也要执行脚本,这里不做演示。其实worker结点只需要 kubelet、kubectl 既可以了。不过安装kubeadm也不会有影响。

4.准备初始化集群所需要的镜像(可选)

初始化集群所需要的镜像如下:

registry.aliyuncs.com/google_containers/kube-apiserver:v1.23.17

registry.aliyuncs.com/google_containers/kube-proxy:v1.23.17

registry.aliyuncs.com/google_containers/kube-scheduler:v1.23.17

registry.aliyuncs.com/google_containers/kube-controller-manager:v1.23.17

registry.aliyuncs.com/google_containers/etcd:3.5.6-0

registry.aliyuncs.com/google_containers/coredns:v1.8.6

registry.aliyuncs.com/google_containers/pause:3.6

这里我们可以提前进行拉取所需要的镜像。

4.进行初始化k8s集群

# 在master结点使用kubeadm进行初始化 k8s 集群。
# 1.执行初始化命令
kubeadm init --kubernetes-version=v1.23.17 --image-repository registry.aliyuncs.com/google_containers  --pod-network-cidr=10.244.0.0/16 --service-cidr=10.254.0.0/16  --service-dns-domain=llh.com

# kubernetes-version=v1.23.17  : 指定k8s版本为 1.23.17
# image-repository  :            指定初始化所需要的镜像从这个镜像站进行拉取
# pod-network-cid   :            指定该集群所创建的pod的ip地址范围段
# service-cidr      :            指定该集群所创建的service的ip地址范围段
# service-dns-domain=llh.com      指定service的域名。如果这里不指定,则该值默认为 cluster.local


# 2.如果上边初始化好后执行  (在初始化好后就会提示执行这三句命令)
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 3. 初始化好后同时会输出一个命令,用来让其它工作结点加入到该集群。(如下)
# kubeadm join 10.0.0.51:6443 --token fzye7b.h4pi8ckcriowa3cp \
	--discovery-token-ca-cert-hash sha256:dc5297543094242bcfc809dea9e34ec3d509a1bb6d87d871f8e5e53daaf1f8d6

至此,主节点任务就已经完成了

3.工作结点加入集群

1.例如上边的步骤三中的命令让worker结点加入集群

# 分别在 k8s002 、 k8s003 结点执行加入集群命令
kubeadm join 10.0.0.51:6443 --token fzye7b.h4pi8ckcriowa3cp \
	--discovery-token-ca-cert-hash sha256:dc5297543094242bcfc809dea9e34ec3d509a1bb6d87d871f8e5e53daaf1f8d6

// 上边的加入集群命令是基于tokne的,这个token会过期,当token过期就不能使用这个命令让worker结点加入集群。我们可以重新创建token。方式如下

生成worker结点加入集群命令:

在master结点执行

[root@k8s001 ~]# kubeadm token create --print-join-command
kubeadm join 10.0.0.51:6443 --token xbwe1l.jamisqwzbrbuftvy --discovery-token-ca-cert-hash sha256:dc5297543094242bcfc809dea9e34ec3d509a1bb6d87d871f8e5e53daaf1f8d6

# 这就新创建了一个加入集群的token,并且直接打印出来使用该token加入集群的命令。要加入集群的worker结点执行该命令即可加入集群。

4.附加组件配置

通过以上步骤k8s集群已经初步完成

1.查看集群结点信息

[root@k8s001 ~]# kubectl get nodes
NAME     STATUS     ROLES                  AGE   VERSION
k8s001   NotReady   control-plane,master   16m   v1.23.17
k8s002   NotReady   <none>                 11m   v1.23.17
k8s003   NotReady   <none>                 11m   v1.23.17

# 可以看到集群内有三个结点,但是它们的状态都为 NotReady,这是因为它们还没有网络组件,结点的通讯需要使用网络组件来完成。

2.部署网络插件

这里我们使用flannel插件(当然也可以使用calico插件)

# 在master结点执行

# 1.下载插件的部署文件
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

# 2.查看部署该插件所需要的 容器镜像。
[root@k8s001 ~]# grep image kube-flannel.yml 
        image: ghcr.io/flannel-io/flannel:v0.26.6
        image: ghcr.io/flannel-io/flannel-cni-plugin:v1.6.2-flannel1
        image: ghcr.io/flannel-io/flannel:v0.26.6

  # 这些镜像估计会出现下载超时,如果出现拉取超时的话可以浏览器访问如下地址来拉取加速镜像(主要flannel文件中的镜像标签要和自己本地镜像标签一致)
  #  https://docker.aityp.com/r/docker.io/flannel/flannel?page=1

# 3.部署flannel镜像
[root@k8s001 ~]# kubectl apply -f kube-flannel.yml 
namespace/kube-flannel created
serviceaccount/flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
  # 这个步骤要稍等两分钟

# 4. 重新查看结点状态 (可以看到都变为了ready)
[root@k8s001 ~]# kubectl get nodes
NAME     STATUS   ROLES                  AGE   VERSION
k8s001   Ready    control-plane,master   25m   v1.23.17
k8s002   Ready    <none>                 20m   v1.23.17
k8s003   Ready    <none>                 20m   v1.23.17


# 5.如果还是不行的话,应该就是镜像拉取问题。那么可以提前拉取所需镜像到本地,要保证本地镜像和部署文件中镜像的标签一致。

至此,k8s集群就已经搭建完成了。接下来就可以通过k8s进行部署了。

后续会编写
Containerd + K8S 组合集群的部署
Docker + K8S 组合集群部署(新版本)

如果有疑问可以通过 209192865@qq.com 联系

文章作者: Administrator
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 寻梦
linux linux
喜欢就支持一下吧