一、集群节点准备
ip | 主机名称 | 操作系统 |
---|---|---|
192.168.1.160 | master-1 | Centos-7.9 |
192.168.1.161 | node-1 | Centos-7.9 |
二、安装前主机环境准备 (所有主机都需要进行)
1、配置主机名解析
bash
echo "192.168.1.160 master-1" >> /etc/hosts
echo "192.168.1.161 node-1" >> /etc/hosts
bash
hostnamectl set-hostname master-1 ;bash
hostnamectl set-hostname node-1 ;bash
2、关闭防火墙和SELIUNX
bash
systemctl disable --now firewalld
sed -i 's/enforcing/disabled/' /etc/selinux/config
3、关闭交换分区(在1.28版本后,可以开启交换分区进行使用,但是还是建议关闭)
bash
## 查看分区使用
free -m
## 临时关闭交换分区,重启系统后,会继续开启
swapoff -a
## 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab
4、设置时间同步服务
bash
## 安装ntpdate的命令
yum -y install ntpdate
##时间同步服务
crontab -l
0 */1 * * * /usr/sbin/ntpdate timel.aliyun.com
## 同步时间
ntpdate time1.aliyun.com
5、必要时升级内核版本
bash
wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.273-1.el7.elrepo.x86_64.rpm
wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.273-1.el7.elrepo.x86_64.rpm
wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-doc-5.4.273-1.el7.elrepo.noarch.rpm
wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-headers-5.4.273-1.el7.elrepo.x86_64.rpm
wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-tools-5.4.273-1.el7.elrepo.x86_64.rpm
wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-tools-libs-5.4.273-1.el7.elrepo.x86_64.rpm
wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-tools-libs-devel-5.4.273-1.el7.elrepo.x86_64.rpm
bash
yum -y install ./kernel-lt-5.4.273-1.el7.elrepo.x86_64.rpm
yum -y install ./kernel-lt-devel-5.4.273-1.el7.elrepo.x86_64.rpm
yum -y install ./kernel-lt-doc-5.4.273-1.el7.elrepo.noarch.rpm
yum -y install ./kernel-lt-headers-5.4.273-1.el7.elrepo.x86_64.rpm
yum -y install ./kernel-lt-tools-5.4.273-1.el7.elrepo.x86_64.rpm
yum -y install ./kernel-lt-tools-libs-5.4.273-1.el7.elrepo.x86_64.rpm
yum -y install ./kernel-lt-tools-libs-devel-5.4.273-1.el7.elrepo.x86_64.rpm
bash
#查看内核是否载入到grub2
#/etc/grub2.cfg文件是/boot/grub2/grub.cfg文件的软链接,grub.cfg文件是grub引导加载器的配置文件
#注意:如果服务器使用efi模式启动,那么可能没有/boot/grub2/grub.cfg文件,其对应的配置文件可能是/boot/efi/EFI/centos/grub.cfg
[root@localhost ~]# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (5.4.273-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)
2 : CentOS Linux (0-rescue-f87a526ce61b4e088ddb59691fd99d0b) 7 (Core)
刚刚安装的内核即0 : CentOS Linux (5.4.257-1.el7.elrepo.x86_64) 7 (Core)
我们需要把grub默认设置为0
可以通过 grub2-set-default 0 命令设置或编辑 vim /etc/default/grub 文件来设置
vim /etc/default/grub
GRUB_DEFAULT=0 #这句改为GRUB_DEFAULT=0 意思是GRUB初始化页面的第一个内核将作为默认内核,保存退出
#检查默认内核是不是5.4
grubby --default-kernel
#生成 grub 配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg
#重启linux系统
reboot
#重启完成,查看现在linux内核,已经变成 5.4.273了
uname -r
Linux localhost.localdomain 5.4.273-1.el7.elrepo.x86_64 #1 SMP Wed Mar 27 15:58:08 EDT 2024 x86_64 x86_64 x86_64 GNU/Linux
#安装完成之后,会在/usr/src/kernels目录生成内核的源码包,这个仅了解即可
[root@jump ~]# ls /usr/src/kernels/5.4.273-1.el7.elrepo.x86_64/
arch block certs crypto drivers fs include init ipc Kconfig kernel lib Makefile mm Module.symvers net samples scripts security sound System.map tools usr virt
6、配置内核转发以及网桥过滤
bash
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
直接加载会出现报错,报错如下:
-
使用 modprobe br_netfilter 进行加载
-
或者使用:sysctl --system 使其生效
7、安装ipset及ipvsadm
bash
yum -y install ipset ipvsadm
配置ipvsadm模块加载方式
添加需要加载的模块
bash
# 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
授权、运行、检查是否加载
bash
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack
三、安装容器运行时 (所有主机都需要安装)
- 本次采用安装docker-ce 和 cri-docker 的方式
1、安装docker
bash
# 添加yum源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
## 刷新yum源缓存
yum makecache
## 安装docker-ce
yum -y install docker-ce
## 启动docker并设置开机启动
systemctl enable --now docker
2、修改cgroup方式
- /etc/docker/daemon.json 默认没有此文件,需要单独创建
bash
## 在/etc/docker/daemon.json添加如下内容
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
## 重新加载服务,并重启docker
systemctl daemon-reload ; systemctl restart docker
3、cri-dockerd 的安装
bash
##下载cri-dockerd的rpm包
https://github.com/mirantis/cri-dockerd/releases/download/v0.3.8/cri-dockerd-0.3.8-3.e17.x86_64.rpm
## 下载cri-dockerd的tar包
# 下载安装2
$ wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.10/cri-dockerd-0.3.10.amd64.tgz
$ tar -xf cri-dockerd-0.3.1.amd64.tgz
$ cp cri-dockerd/cri-dockerd /usr/bin/
$ chmod +x /usr/bin/cri-dockerd
###安装cri-dockerd
yum -y install cri-dockerd-0.3.8-3.el7.x86_64.rpm
- 修改cri-dockerd配置文件
bash
vim /usr/lib/systemd/system/cri-docker.service
## 修改第10行
10 ExecStart=/usr/bin/cri-dockerd --pod-infra-container-image=registry.k8s.io/pause:3.9 --container-runtime-endpoint fd://
## 二进制安装需要手动添加配置文件
vim /usr/lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
# 这里的参数 `--pod-infra-container-image`,这个值要根据实际情况调整,如果你的安装环境不能访问互联网,那你就需要配置为内部镜像仓库。
## 创建一个 socket 文件以便 kubelet 与 cri-dockerd 通信
cat <<"EOF" > /usr/lib/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF
## 启动服务,并设定为开机自启动
systemctl daemon-reload ; systemctl enable --now cri-docker
- 安装docker-ce,默认已经安装了containerd
四、kubernetes-1.29版本集群安装
1、kubernetes社区yum准备
bash
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
#exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
bash
## 清理所有缓存
yum clean all
## 刷新缓存
yum makecache
## 查看kubadm安装包
yum list | grep kubeadm
kubernetes 阿里云yum源准备(现在使用最新版)
bash
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/rpm/repodata/repomd.xml.key
EOF
setenforce 0
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet
ps: 由于官网未开放同步方式, 可能会有索引gpg检查失败的情况, 这时请用 yum install -y --nogpgcheck kubelet kubeadm kubectl 安装
2、kubeadm kubectl kubelet 安装
bash
yum -y install kubeadm kubectl kubelet
## 设置开机自启动,不设置为启动,是因为还没有配置五年级
systemctl enable kubelet
3、创建一个 socket 文件以便 kubelet 与 cri-dockerd 通信
bash
cat <<"EOF" > /usr/lib/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF
# 重启 cri-docker 服务
$ systemctl daemon-reload && systemctl restart cri-docker
4、master节点安装镜像
- 查看 master需要哪些镜像,以及镜像版本
bash
[root@master-1 ~]# kubeadm config images list
registry.k8s.io/kube-apiserver:v1.29.3
registry.k8s.io/kube-controller-manager:v1.29.3
registry.k8s.io/kube-scheduler:v1.29.3
registry.k8s.io/kube-proxy:v1.29.3
registry.k8s.io/coredns/coredns:v1.11.1
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.12-0
- 下载镜像报错的原因,是因为系统有多个容器运行时
bash
kubeadm config images pull --cri-socket unix:///var/run/cri-dockerd.sock
- 镜像脚本
bash
#!/bin/bash
images_list='
registry.k8s.io/kube-apiserver:v1.29.3
registry.k8s.io/kube-controller-manager:v1.29.3
registry.k8s.io/kube-scheduler:v1.29.3
registry.k8s.io/kube-proxy:v1.29.3
registry.k8s.io/coredns/coredns:v1.11.1
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.12-0'
for i in $images_list
do
docker pull $i
done
docker save -o k8s-1-29-0.tar $images_list
5、master节点初始化集群
bash
kubeadm init \
--apiserver-advertise-address=192.168.1.160 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.29.3 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/cri-dockerd.sock \
--ignore-preflight-errors=all
--apiserver-advertise-address 集群通告地址
●
--image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
●
--kubernetes-version K8s版本,与上面安装的一致
●
--service-cidr 集群内部虚拟网络,Pod统一访问入口
●
--pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致
●
--cri-socket 指定cri-dockerd接口,如果是containerd则使用--cri-socket unix:///run/containerd/containerd.sock
●
--ignore-preflight-errors=all参数用于在运行kubeadm初始化之前忽略所有的预检错误。在执行kubeadm init时,Kubernetes会运行一系列的预检来确保节点的配置符合Kubernetes的要求。这些预检包括检查内核参数、网络设置、环境变量等。有时候,一些预检可能会失败,但是你仍然想要继续初始化集群。在这种情况下,你可以使用--ignore-preflight-errors参数并指定要忽略的错误,或者使用--ignore-preflight-errors=all来忽略所有的预检错误。
6、node节点加入集群
7、网络组件flannel
bash
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
需要对yaml文件进行修改
第一处,网卡信息修改
135 containers:
136 - args:
137 - --ip-masq
138 - --kube-subnet-mgr
139 - --iface=ens33 ###默认是使用第一个网络,一般第一个网卡都是docker占用
140 command:
141 - /opt/bin/flanneld
142 env:
143 - name: POD_NAME
144 valueFrom:
145 fieldRef:
146 fieldPath: metadata.name
147 - name: POD_NAMESPACE
148 valueFrom:
149 fieldRef:
150 fieldPath: metadata.namespace
第二处:pod地址范围修改
68 data:
69 cni-conf.json: |
70 {
71 "name": "cbr0",
72 "cniVersion": "0.3.1",
73 "plugins": [
74 {
75 "type": "flannel",
76 "delegate": {
77 "hairpinMode": true,
78 "isDefaultGateway": true
79 }
80 },
81 {
82 "type": "portmap",
83 "capabilities": {
84 "portMappings": true
85 }
86 }
87 ]
88 }
89 net-conf.json: |
90 {
91 "Network": "10.244.0.0/16", ## 这个默认是这个值,如果初始化不是这个pod地址范围,需要修改
92 "Backend": {
93 "Type": "vxlan"
94 }
95 }
第三处:镜像版本,考虑网络环境,如果不是本地环境,考虑换成国内的,或者提前拉取下来
[root@master-1 ~]# cat kube-flannel.yml | grep image
image: docker.io/flannel/flannel:v0.24.4
image: docker.io/flannel/flannel-cni-plugin:v1.4.0-flannel1
image: docker.io/flannel/flannel:v0.24.4
五、kubernetes-1.29版本可用性测试
1、集群状态检测
2、使用测试容器对集群进行检测
bash
##1、启动容器
kubectl run bs --image=busybox:1.28.4 -- sleep 24h
## 2、查看容器状态
kubectl get pod
## 3、进入容器
kubectl exec -it bs -- sh
## 4、测试网络环境
ping www.baidu.com
## 5、域名解析
nslookup kubernetes.default.svc.cluster.local
- 通过以上操作都证明集群安装成功,如果有需要可以对master node节点进行添加,添加补充命令,方便操作,添加颜色高亮,看起来更加舒服,通过租户,添加到Dashboard等方便操作