当前位置: 首页 > news >正文

rockylinux9.4单master节点k8s1.28集群部署

kubernetes集群部署

常见的 k8s 部署方式包括:二进制包、kubeadm 工具、云服务提供商、或通过一些开源的工具搭建,例如:sealos、kuboard、Runcher、kubeSphere。

本文使用kubeadm的部署方式,部署k8s1.28版本

我本地安装资源规划如下:

IP地址主机名称角色操作系统主机配置参考
192.168.3.92master1masterrockylinux9.4(最小化安装)4核心CPU/4G内存/80G磁盘
192.168.3.93worker1workerrockylinux9.4(最小化安装)4核心CPU/4G内存/80G磁盘
192.168.3.94worker2workerrockylinux9.4(最小化安装)4核心CPU/4G内存/80G磁盘

初始化集群环境

**注意:**初始化集群环境,以下步骤在所有主机都需相应操作

修改相应主机的主机名称和host文件解析

hostnamectl set-hostname master1 && bash
hostnamectl set-hostname worker1 && bash
hostnamectl set-hostname worker2 && bash
cat <<EOF >> /etc/hosts
192.168.3.92 master1
192.168.3.93 worker1
192.168.3.94 worker2
EOF

配置相应主机的静态IP地址

vim /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
uuid=8fa4f8df-0d4d-3993-a38d-4de4f1af2382
type=ethernet
autoconnect-priority=-999
interface-name=ens160
timestamp=1725741990[ethernet][ipv4]
method=manual
dns=114.114.114.114
address1=192.168.3.92/24,192.168.3.2[ipv6]
addr-gen-mode=eui64
method=auto[proxy]

安装常用软件包

yum install -y epel-release tree vim wget bash-completion lrzsz nfs-utils net-tools sysstat iotop unzip nc nmap telnet bc psmisc yum-utils ipvsadm git socat conntrack sshpass libseccomp device-mapper-persistent-data lvm2 gcc gcc-c++ make cmake libxml2-devel openssl-devel curl libaio-devel ncurses-devel autoconf automake zlib-devel epel-release telnet 

关闭selinux和防火墙

setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
systemctl stop firewalld.service && systemctl disable firewalld.service

关闭swap缓存

swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab

配置免密登录

生成秘钥

ssh-keygen

拷贝秘钥到相应主机

ssh-copy-id 192.168.3.92

安装时间同步chrony软件

yum install chrony -y
systemctl enable chronyd.service --now
systemctl restart chronyd.service
vim /etc/chrony.conf#修改以下位置
#pool 2.rocky.pool.ntp.org iburst
pool ntp1.aliyun.com
修改内核参数
#加载内核模块
modprobe br_netfilter
modprobe ip_conntrack
modprobe iptable_filter
modprobe iptable_nat
modprobe overlay#查看是否加载
lsmod | grep -e ip_vs -e nf_conntrack
nf_conntrack          176128  1 nf_nat
nf_defrag_ipv6         20480  1 nf_conntrack
nf_defrag_ipv4         16384  1 nf_conntrack
libcrc32c              16384  3 nf_conntrack,nf_nat,xfslsmod | grep ip
iptable_nat            16384  0
nf_nat                 49152  1 iptable_nat
iptable_filter         16384  0
ip_tables              28672  2 iptable_filter,iptable_nat
nf_defrag_ipv6         20480  1 nf_conntrack
nf_defrag_ipv4         16384  1 nf_conntrack#修改内核参数
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#加载生效
sysctl --system#持久化加载内核模块
cat > /etc/modules-load.d/modules.conf << EOF
br_netfilter
ip_conntrack
iptable_filter
iptable_nat
overlay
EOFsystemctl restart systemd-modules-load.service#解释:
#对网桥上的IPv6数据包通过iptables处理            net.bridge.bridge-nf-call-ip6tables = 1  
#对网桥上的IPv4数据包通过iptables处理            net.bridge.bridge-nf-call-iptables = 1   
#开启IPv4路由转发,来实现集群中的容器与外部网络的通信 net.ipv4.ip_forward = 1          
安装docker
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#查看yum源中的docker版本
yum list docker-ce.x86_64 --showduplicates | sort -r
#安装指定版本
yum -y install docker-ce-26.1.1-1.el9.x86_64

安装好docker后containerd.io作为docker依赖也会被安装,在安装k8s前就无需再安装containerd.io了

[root@master1 ~]# rpm -qa | grep containerd
containerd.io-1.6.32-3.1.el8.x86_64

启用Docker Cgroup控制组,用于限制进程的资源使用量,如CPU、内存。再配置镜像加速器,harbor地址,方便后期拉取镜像。

mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{"log-opts": {"max-size": "5m","max-file":"3"},"exec-opts": ["native.cgroupdriver=systemd"],"insecure-registries": ["192.168.137.35","harbor.cn"],"registry-mirrors": ["https://jockerhub.com","https://mirror.baidubce.com","https://dockerproxy.com","https://docker.laoex.link","https://docker.nju.edu.cn"]
}
EOF

启动Docker服务并设置开机自启动

systemctl enable docker --now

安装k8s

配置软件仓库和安装所需包

因上文安装好了docker所以在安装k8s前就无需再安装containerd.io了

**注意:**所有主机均需要操作

添加阿里云kubernetes仓库

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
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

新版k8s网络源地址 1.29+版本

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=0
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
EOF

安装集群所需软件包
●kubeadm:用于初始化集群,并配置集群所需的组件并生成对应的安全证书和令牌;
●kubelet:负责与 Master 节点通信,并根据 Master 节点的调度决策来创建、更新和删除 Pod,同时维护 Node 节点上的容器状态;
●kubectl:用于管理k8集群的一个命令行工具;

安装 kubeadm kubelet kubectl

dnf install -y kubeadm-1.28.2-0 kubelet-1.28.2-0 kubectl-1.28.2-0

设置kubelet开机自启,集群初始化时kubelet会随着集群启动

systemctl enable kubelet

生成且修改containerd的配置文件(原有的配置文件不可使用)

containerd config default > /etc/containerd/config.toml#修改以下配置
vim /etc/containerd/config.toml
139             SystemdCgroup = true
67     sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"#拷贝到其它主机
scp /etc/containerd/config.toml 192.168.3.93:/etc/containerd/config.toml
scp /etc/containerd/config.toml 192.168.3.94:/etc/containerd/config.toml

启动containerd并设置开机自启动

systemctl restart containerd
systemctl enable containerd

查看集群所需镜像文件(国外镜像我们无法下载的)

kubeadm config images list --kubernetes-version=v1.28.13I0907 22:45:30.944332   40619 version.go:256] remote version is much newer: v1.31.0; falling back to: stable-1.28
registry.k8s.io/kube-apiserver:v1.28.13
registry.k8s.io/kube-controller-manager:v1.28.13
registry.k8s.io/kube-scheduler:v1.28.13
registry.k8s.io/kube-proxy:v1.28.13
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.9-0
registry.k8s.io/coredns/coredns:v1.10.1
kubernetes集群初始化

注:在master节点初始化集群

生成集群初始化配置文件

kubeadm config print init-defaults > kubeadm.yaml

修改advertiseAddress,name,imageRepository,kubernetesVersion的值,

添加podSubnet字段,加入kube proxy模式为ipvs的配置字段

vim kubeadm.yaml apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authentication
kind: InitConfiguration
localAPIEndpoint:advertiseAddress: 192.168.3.92 #控制节点IPbindPort: 6443
nodeRegistration:criSocket: unix:///var/run/containerd/containerd.sockimagePullPolicy: IfNotPresentname: master1 #控制节点名称taints: null
---
apiServer:timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:local:dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers #改为国内镜像
kind: ClusterConfiguration
kubernetesVersion: 1.28.13 #修改成1.28.13版本
networking:dnsDomain: cluster.localpodSubnet: 10.244.0.0/16 #添加这个字段 指定pod网段serviceSubnet: 10.96.0.0/12
scheduler: {}#加入以下配置使用ipvs转发规则
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

准备镜像

kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.28.13

导出所有镜像到其它主机,防止网络原因导致集群初始化失败

ctr -n=k8s.io images export all.tar.gz \
registry.aliyuncs.com/google_containers/coredns:v1.10.1 \
registry.aliyuncs.com/google_containers/etcd:3.5.9-0 \
registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.13 \
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.13 \
registry.aliyuncs.com/google_containers/kube-proxy:v1.28.13 \
registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.13 \
registry.aliyuncs.com/google_containers/pause:3.9scp k8sall.tar.gz 192.168.3.93:/root/
scp k8sall.tar.gz 192.168.3.94:/root/#[root@worker1 ~] 
ctr -n=k8s.io images import k8sall.tar.gz
#[root@worker2 ~] 
ctr -n=k8s.io images import k8sall.tar.gz

执行初始化命令(控制节点执行)

kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification

安装成功后会有以下提示信息

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:kubeadm join 192.168.3.199:16443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:d53d64de26fe12db3fc01de53b3f8c7f281f465215b2c3bb34be6747c3db9870 \--control-plane Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.3.199:16443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:d53d64de26fe12db3fc01de53b3f8c7f281f465215b2c3bb34be6747c3db9870 

初始化成功后,按照提示准备集群管理员配置文件

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

配置tab键命令补全

yum install bash-completion
source /usr/share/bash-completion/bash_completion
echo 'source <(kubectl completion bash)' >>~/.bashrc
echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -o default -F __start_kubectl k' >>~/.bashrc
source ~/.bashrc

查看集群状态

[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES           AGE    VERSION
master   NotReady   control-plane   2m3s   v1.28.2

此时集群状态还是NotReady 状态,因为网络组件没有启动。

部署Pod网络插件Calico

Calico 和 Flannel 是两种流行的 k8s 网络插件,它们都为集群中的 Pod 提供网络功能,然而,它们在实现方式和功能上有一些重要区别:
模型的区别:
●Calico 使用 BGP(边界网关协议)作为其底层网络模型。它利用 BGP 为每个 Pod 分配一个唯一的 IP 地址,并在集群内部进行路由。Calico 支持网络策略,可以对流量进行精细控制,允许或拒绝特定的通信。
●Flannel 则采用了一个简化的覆盖网络模型。它为每个节点分配一个 IP 地址子网,然后在这些子网之间建立覆盖网络。Flannel 将 Pod 的数据包封装到一个更大的网络数据包中,并在节点之间进行转发。Flannel 更注重简单和易用性,不提供与 Calico 类似的网络策略功能。

性能的区别:
●由于 Calico 使用 BGP 进行路由,其性能通常优于 Flannel。Calico 可以实现直接的 Pod 到 Pod 通信,而无需在节点之间进行额外的封装和解封装操作。这使得 Calico 在大型或高度动态的集群中具有更好的性能。
●Flannel 的覆盖网络模型会导致额外的封装和解封装开销,从而影响网络性能。对于较小的集群或对性能要求不高的场景,这可能并不是一个严重的问题。

**注:**在线下载配置文件地址是: https://calico-v3-25.netlify.app/archive/v3.25/manifests/calico.yaml

在master1节点下载calico.yaml文件

wget https://docs.tigera.io/archive/v3.25/manifests/calico.yamlvim calico.yaml
#修改pod网段ip ,把注释放开并修改vlaue值
...
- name: CALICO_IPV4POOL_CIDRvalue: "10.244.0.0/16"
...

若机器有多个网卡,需要在calico.yaml配置文件里指定可以联网的网卡。(若机器只有一个网卡也可以不配置此步)

增加指定网卡配置:(4513 4514 行 不同版本的calico行号位置略有不同)

4508                   name: calico-config
4509                   key: calico_backend
4510             # Cluster type to identify the deployment type
4511             - name: CLUSTER_TYPE
4512               value: "k8s,bgp"
4513             - name: IP_AUTODETECTION_METHOD   #加入这行
4514               value: "interface=ens160"       #加入这行
4515             # Auto-detect the BGP IP address.
4516             - name: IP
4517               value: "autodetect"

提前下载calico.yaml中所需要的镜像文件并导出至所有主机,防止网络原因导致集群初始化失败

docker pull docker.io/calico/kube-controllers:v3.25.0
docker pull docker.io/calico/node:v3.25.0
docker pull docker.io/calico/cni:v3.25.0
#这里我多下载一个nginx的镜像方便安装好后测试集群网络是否可用
docker pull docker.io/library/nginx:1.21#导出所需要的镜像
docker save $(docker images | grep -v REPOSITORY | awk 'BEGIN{OFS=":";ORS=" "}{print $1,$2}') -o calicoimg.tar.gz#所有主机都需要导入镜像
scp calicoimg.tar.gz 192.168.3.93:/root/
scp calicoimg.tar.gz 192.168.3.94:/root/
#[root@master1 ~]
ctr -n=k8s.io images import calicoimg.tar.gz
#[root@worker1 ~] 
ctr -n=k8s.io images import calicoimg.tar.gz
#[root@worker2 ~] 
ctr -n=k8s.io images import calicoimg.tar.gz

在master1节点创建Calico网络

kubectl apply -f calico.yaml

等待Calico相关的Pod状态为Running即可

[root@master ~]# kubectl get pod -n kube-system
NAME                                      READY   STATUS    RESTARTS   AGE
calico-kube-controllers-9d57d8f49-lk7sw   1/1     Running   0          10m
calico-node-drsmx                         1/1     Running   0          10m
coredns-6554b8b87f-6rjtd                  1/1     Running   0          39m
coredns-6554b8b87f-w5gzw                  1/1     Running   0          39m
etcd-master                               1/1     Running   0          39m
kube-apiserver-master                     1/1     Running   0          39m
kube-controller-manager-master            1/1     Running   0          39m
kube-proxy-cj5v8                          1/1     Running   0          39m
kube-scheduler-master                     1/1     Running   0          39m

查看集群节点状态是否为Ready

[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   39m   v1.28.2
将工作节点加入集群

在master1主机上查看加入节点的命令:

kubeadm token create --print-join-commandkubeadm join 192.168.3.92:6443 --token 27z1xd.143q77f4jqnt67r4 --discovery-token-ca-cert-hash sha256:48f4733f89787e74a07ac9a87d91782093a46190131ecfb20260a75968aa8166 

其它节点(worker1 worker2)执行加入命令

kubeadm join 192.168.3.92:6443 --token 27z1xd.143q77f4jqnt67r4 --discovery-token-ca-cert-hash sha256:48f4733f89787e74a07ac9a87d91782093a46190131ecfb20260a75968aa8166

创建nginx pod测试集群网络是否正常

apiVersion: v1
kind: Pod
metadata:name: nginxlabels:app: nginx
spec:containers:- name: nginximage: nginx:1.21ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-svc
spec:type: NodePortselector:app: nginxports:- port: 80targetPort: 80nodePort: 30080

浏览器访问 192.168.3.86:30080 nginx服务

完成部署

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • WordPress建站钩子函数及使用
  • [数据集汇总]智慧交通-铁路相关数据集汇总
  • USDT自动化交易【Pinoex】【自动化分析】【ChatGPT量化脚本】
  • mysql时间戳格式化yyyy-mm-dd
  • HarmonyOS NEXT 封装实现好用的网络模块(基于最新5.0的API12)
  • 全志A523 系统篇(一) 获取vmlinux
  • ASP.NET MVC 迅速集成 SignalR
  • 将硬盘的GPT 转化为MBR格式
  • 如何避免在使用 Context API 时出现状态管理的常见问题?
  • Redhat 7,8系(复刻系列) 一键部署Oracle21c-xe rpm
  • 在Android中fragment的生命周期
  • 【多模态融合】【NeurIPS 2021】Attention Bottlenecks for Multimodal Fusion
  • 2025年国家级高新技术企业认定,这些公司过不了了!
  • leetcode 105.从前序与中序遍历序列构造二叉树
  • 创客中国AIGC专题赛冠军天鹜科技:AI蛋白质设计引领者
  • 2019.2.20 c++ 知识梳理
  • CSS居中完全指南——构建CSS居中决策树
  • happypack两次报错的问题
  • JavaScript函数式编程(一)
  • JavaScript学习总结——原型
  • js继承的实现方法
  • KMP算法及优化
  • MySQL-事务管理(基础)
  • uva 10370 Above Average
  • VUE es6技巧写法(持续更新中~~~)
  • 包装类对象
  • 从零开始的无人驾驶 1
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 我建了一个叫Hello World的项目
  • 2017年360最后一道编程题
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • ###STL(标准模板库)
  • #QT(智能家居界面-界面切换)
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (14)Hive调优——合并小文件
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (5)STL算法之复制
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (翻译)terry crowley: 写给程序员
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (未解决)macOS matplotlib 中文是方框
  • (五)activiti-modeler 编辑器初步优化
  • (一)Java算法:二分查找
  • (一一四)第九章编程练习
  • (原)本想说脏话,奈何已放下
  • ***检测工具之RKHunter AIDE
  • .aanva
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .gitignore文件忽略的内容不生效问题解决
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .net6 webapi log4net完整配置使用流程