架构
服务器IP | 服务名称 | 硬件配置 |
192.168.1.100 | k8s-master | 8核、16G、120G |
192.168.1.101 | k8s-node1 | 8核、16G、120G |
192.168.1.102 | k8s-node2 | 8核、16G、120G |
192.168.1.103 | nfs | 2核、4G、500G |
操作系统:Rocky9.3
后续通过K8S部署GitLab、Harbor、Jenkins
一、环境准备
关闭firewalld、selinux、swap
(三台K8S集群服务器同时操作)
#关闭防火墙开机自启
systemctl disable firewalld
#关闭防火墙服务
systemctl stop firewalld
#临时SELINUX
setenforce 0
#修改SELINUX配置文件,以免下次重启系统开启SELINUX
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
#临时关闭内存交换
swapoff -a
#修改fstab配置文件,以免下次重启系统开启swap
sed -i '/\sswap\s/s/^/#/' /etc/fstab
设置主机名称
(三台K8S集群服务器同时操作)
修改主机名称
hostnamectl set-hostname 主机名称
写入hosts配置
cat >> /etc/hosts <<EOF
192.168.1.100 k8s-master
192.168.1.101 k8s-node1
192.168.1.102 k8s-node2
EOF
将桥接的ipv4流量传递到iptables链
(三台K8S集群服务器同时操作)
#生成bridge相关内核参数
modprobe br_netfilter
#写入k8s.conf 配置
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
#生效
sysctl --system
#打开端口转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
#刷新
sysctl -p
同步时间
(三台K8S集群服务器同时操作)
yum install -y chrony
systemctl start chronyd
systemctl enable chronyd
timedatectl set-timezone Asia/Shanghai
二、部署containerd
K8S的1.24版本后续移除了dockershim,k8s绕过docker,直接调用containerd,所以本次部署不用docker,选择部署containerd
(三台K8S集群服务器同时操作)
#先安装yum-utils工具
yum install -y yum-utils
#配置Docker官方的yum仓库,如果做过,可以跳过
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装containerd
yum install containerd.io -y
#启动服务
systemctl enable containerd
systemctl start containerd
生成默认配置
containerd config default > /etc/containerd/config.toml
修改配置
sed -i 's@sandbox_image = "registry.k8s.io/pause:3.8"@sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8"@' /etc/containerd/config.toml
#改为阿里云镜像地址
sed -i 's@SystemdCgroup = false@SystemdCgroup = true@' /etc/containerd/config.toml
#重启containerd服务
systemctl restart containerd
三、配置kubernetes仓库
(三台K8S集群服务器同时操作)
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
四、安装kubeadm和kubelet
(三台K8S集群服务器同时操作)
#查看所有版本
yum --showduplicates list kubeadm
#安装1.28.2版本
yum install -y kubelet-1.28.2 kubeadm-1.28.2 kubectl-1.28.2
#启动kubelet服务
systemctl start kubelet.service
systemctl enable kubelet.service
五、设置crictl连接 containerd
(三台K8S集群服务器同时操作)
crictl config --set runtime-endpoint=unix:///run/containerd/containerd.sock
六、集群初始化
#Master执行初始化
一定要在master机子上操作以下命令!!!
一定要在master机子上操作以下命令!!!
一定要在master机子上操作以下命令!!!
kubeadm init --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --apiserver-advertise-address=192.168.1.100 --kubernetes-version=v1.28.2 --service-cidr=10.15.0.0/16 --pod-network-cidr=10.18.0.0/16
提示:输入命令后初始化比较久,该过程会下载相关东西,保证网络通畅
然后初始化完成后,你会看到token,跟下面类似的,先复制保存
kubeadm join 192.168.1.100:6443 --token 2a6go4.u2fxys0a208s8brv \
--discovery-token-ca-cert-hash sha256:4f5c4fef972b51fa34735675ee87fa52c5c1855f03e60f33009e8919e5e9ef40
#配置权限(不然无法使用kubectl命令操作K8S集群)
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
#node节点加入master
在两台node节点服务器上输入刚刚master初始化后得到的token
kubeadm join 192.168.1.100:6443 --token 2a6go4.u2fxys0a208s8brv \
--discovery-token-ca-cert-hash sha256:4f5c4fef972b51fa34735675ee87fa52c5c1855f03e60f33009e8919e5e9ef40
然后在master上等待一会再执行查询命令,观察节点是否加入
kubectl get node
kubectl get pod --all-namespaces
成功后会出现node信息
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 2d18h v1.28.2
k8s-node1 NotReady <none> 2d18h v1.28.2
k8s-node2 NotReady <none> 2d18h v1.28.2
七、配置代理镜像
因为默认的dockerhub地址被屏蔽导致镜像无法拉取,则需要在/etc/containerd/config.toml文件下进行配置代理镜像解决网络问题,如果能科学上网则不用配置代理镜像
#修改配置文件
vim /etc/containerd/config.toml
找到下面这一行mirrors
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
后插入下面这两行
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint=["docker.1panel.live"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
endpoint=["docker.1panel.live"]
保存后需要重启containerd
systemctl restart ontainerd
注意:docker.1panel.live代理地址不知道什么时候会出现无法使用,如果配置后还是无法下载镜像,自行去网上寻找新的镜像或者科学上网
也可以在别的拉取镜像的机器打包成镜像tar压缩包,分别在node上通过以下命令进行上传镜像
ctr -n k8s.io image import 镜像压缩包名称 镜像名称:v版本号
八、安装calico网络
master节点上操作
curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml -O
下载完后还需要修改⾥⾯定义 Pod ⽹络(CALICO_IPV4POOL_CIDR),与前⾯ kubeadm init 的 --podnetwork-cidr 指定的⼀样
vim calico.yaml
# - name: CALICO_IPV4POOL_CIDR
# value: "192.168.0.0/16"
# 修改为:
- name: CALICO_IPV4POOL_CIDR
value: "10.18.0.0/16"
部署
kubectl apply -f calico.yaml
查看
kubectl get pod -A
如果calico相关的pod都进入Running状态,则查看node信息
kubectl get pod
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 2d18h v1.28.2
k8s-node1 Ready <none> 2d18h v1.28.2
k8s-node2 Ready <none> 2d18h v1.28.2则calico安装成功
此时K8S集群部署成功!!!