搭建K8S集群
这里介绍使用 kubeadm
的方式进行搭建K8S集群。
搭建的K8S版本为 1.23 版本的,也就是底层还是使用docker作为容器运行时的版本。
1.机器环境准备和安装docker
这里我搭建的是三个结点的集群,分别为master节点 和 两个worker结点。我使用的linux系统为 Centos7。
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 联系