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

安装部署K8S集群环境(实测有效版本)

1 系统初始化配置(所有节点同步操作)

1.1 实验环境

名称IP地址操作系统配置
k8s-master10.0.0.100CentOS7.92核4G
k8s-node110.0.0.101CentOS7.92核2G
k8s-node210.0.0.102CentOS7.92核2G

1.2关闭防火墙和SELinux

# 关闭防火墙并设置为开机自动关闭
systemctl disable --now firewalld# 关闭SELinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 临时关闭SELinux
setenforce 0

1.3 配置hosts文件域名解析

cat >> /etc/hosts <<EOF
10.0.0.100   k8s-master 
10.0.0.101   k8s-node1
10.0.0.102   k8s-node2
EOF

1.4 修改主机名

master节点:
hostnamectl set-hostname k8s-masternode1节点:
hostnamectl set-hostname k8s-node1node2节点:
hostnamectl set-hostname k8s-node2

1.5 时间同步

yum install -y chrony
sed -ri 's/^pool.*/#&/' /etc/chrony.conf
cat >> /etc/chrony.conf << EOF
pool ntp1.aliyun.com iburst
EOF
systemctl restart chronyd
chronyc sources
# 修改时区,如果之前是这个时区就不用修改
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' > /etc/timezone

1.6 关闭交换分区

# 关闭当前交换分区
swapoff -a
# 禁止开机自动启动交换分区
sed -ri 's/.*swap.*/#&/' /etc/fstab

1.7 将桥接的IPv4流量传递到iptables的链

cat >> /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOFsysctl -p /etc/sysctl.d/kubernetes.conf
sysctl --system# 加载网桥过滤模块
modprobe br_netfilter
lsmod | grep br_netfilter  # 查看是否加载完成

1.8 配置免密登录(可选)

ssh-keygen  # 连续回车三次
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.100ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.101ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.102测试登录ssh root@10.0.0.100
无需密码登录即成功

1.9 安装ipvs转发支持

在kubernetes中Service有两种代理模型,一种是基于iptables的,一种是基于ipvs,两者对比ipvs的性能要高。默认使用iptables,所以要手动加载ipvs。

# 安装依赖包
yum install -y conntrack ipvsadm ipset jq iptables sysstat libseccomp wget cat > /etc/sysconfig/modules/ipvs.modules <<EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4  
EOFchmod +x /etc/sysconfig/modules/ipvs.modules 
# 执行脚本
/etc/sysconfig/modules/ipvs.modules
# 验证ipvs模块
lsmod | grep -e ip_vs -e nf_conntrack_ipv4

1.10 安装docker,containerd

# 创建 /etc/modules-load.d/containerd.conf 配置文件:
cat << EOF > /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOFmodprobe overlay
modprobe br_netfilter# 获取阿里云YUM源
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 安装yum-config-manager配置工具
yum -y install yum-utils# 设置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker-ce版本,使用最新版本24.0.7,也可以指定安装版本
yum install -y docker-ce
# 启动并设置开机自启动
systemctl enable --now docker# 查看版本号
docker --version
# 查看版本具体信息
docker version# Docker镜像源设置
# 修改文件 /etc/docker/daemon.json,没有这个文件就创建
# 添加以下内容后,重启docker服务:
cat >/etc/docker/daemon.json<<EOF
{"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
EOF
# 加载
systemctl reload docker# 查看
systemctl status docker containerd# 其他配置
# containerd生成配置文件
containerd config default > /etc/containerd/config.toml# 配置containerd cgroup 驱动程序为systemd
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml# 将 sandbox_image 镜像源设置为阿里云google_containers镜像源
sed -i "s#registry.k8s.io/pause:3.6#registry.aliyuncs.com/google_containers/pause:3.9#g"       /etc/containerd/config.toml# 修改runtime_type为io.containerd.runc.v2
runtime_type = "io.containerd.runc.v2"# 启动containerd并设置开机自启动
systemctl enable --now containerd
# 查看containerd状态
systemctl status containerd

说明:

1、dockerd实际真实调用的还是containerd的api接口,containerd是dockerd和runC之间的一个中间交流组件。所以启动docker服务的时候,也会启动containerd服务的。

2、kubernets自v1.24.0后,就不再使用docker.shim,替换采用containerd作为容器运行时端点。因此需要安装containerd(在docker的基础下安装),上面安装docker的时候就自动安装了containerd了。这里的docker只是作为客户端而已。容器引擎还是containerd。

2 安装kubernetes集群

2.1 配置阿里云上k8s的yum源(所有节点执行)

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[k8s]
name=k8s
enabled=1
gpgcheck=0
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
EOF## 查看所有的可用版本
yum list kubelet --showduplicates | sort -r |grep 1.28

2.2 安装kubectl,kubelet和kubeadm(所有节点执行)

# 若不指定版本默认安装最高版本
yum install -y kubectl-1.28.2-0 kubelet-1.28.2-0 kubeadm-1.28.2-0# 设置kubelet为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动
systemctl enable kubelet# 准备k8s1.28.2 所需要的镜像
kubeadm config images list --kubernetes-version=v1.28.2# 可以提前把镜像下载好,这样安装快
crictl pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.2
crictl pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.2
crictl pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.2
crictl pull registry.aliyuncs.com/google_containers/kube-proxy:v1.28.2
crictl pull registry.aliyuncs.com/google_containers/pause:3.9
crictl pull registry.aliyuncs.com/google_containers/etcd:3.5.9-0
crictl pull registry.aliyuncs.com/google_containers/coredns:v1.10.1

2.3 集群初始化(在master上执行)

kubeadm init --kubernetes-version=v1.28.2 \
--pod-network-cidr=10.224.0.0/16 \
--apiserver-advertise-address=10.0.0.105 \
--service-cidr=192.168.0.0/16 \
--image-repository=registry.aliyuncs.com/google_containers \
--ignore-preflight-errors=all

--apiserver-advertise-address 集群apiServer地址(master节点IP即可) 

--image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址

--kubernetes-version     K8s版本,与上面安装的一致

--service-cidr     集群内部虚拟网络,Pod统一访问入口 

--pod-network-cidr     Pod网络,,与下面部署的CNI网络组件yaml中保持一致 安装成功会输出以下内容:

Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.confYou should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:https://kubernetes.io/docs/concepts/cluster-administration/addons/Then you can join any number of worker nodes by running the following on each as root:kubeadm join 10.0.0.105:6443 --token 70n2ca.0mug2am9i77gx2wb \--discovery-token-ca-cert-hash sha256:af51d42c76b4d67e52bccd3369465f8d72d075337b4426bdb0ac6d70dbaaa4c1

2.4 重置后再初始化(可选)

若集群初始化失败,可以通过排障后重新初始化集群

kubeadm reset
rm -fr ~/.kube/  /etc/kubernetes/* var/lib/etcd/*

2.5 配置环境变量

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 临时生效(退出当前窗口重连环境变量失效)
export KUBECONFIG=/etc/kubernetes/admin.conf
# 永久生效(推荐)
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source  ~/.bash_profile

2.6 node工作节点加入k8s集群

根据master节点最后输出的内容,直接在node1和node2节点上执行

kubeadm join 10.0.0.105:6443 --token gxs9lb.jo9dcih5drihlb7w \--discovery-token-ca-cert-hash sha256:3522f10099342f88aafd7043b05f3e81cc0ff53873e8a48dbc39e0b1a3d2e67b

如果没有令牌,可以通过在控制平面节点上运行以下命令来获取令牌:

kubeadm token list

默认情况下, 令牌会在24小时后过期。如果要在当前令牌过期后将节点加入集群, 则可以通过在控制平面节点上运行以下命令来创建新令牌:

kubeadm token create

再查看

kubeadm token list

如果你没有  –discovery-token-ca-cert-hash 的值,则可以通过在控制平面节点上执行以下命令链来获取它:

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

如果执行kubeadm init时没有记录下加入集群的命令,可以通过以下命令重新创建 (推荐)一般不用上面的分别获取token和ca-cert-hash方式,执行以下命令一气呵成:

kubeadm token create --print-join-command

2.7 查看节点状态

[root@k8s-master ~]# kubectl get node
NAME         STATUS     ROLES           AGE   VERSION
k8s-master   NotReady   control-plane   14m   v1.28.2
k8s-node1    NotReady   <none>          12m   v1.28.2
k8s-node2    NotReady   <none>          12m   v1.28.2

发现节点是NotReady状态,说明集群还不可以使用,还需要安装网络插件。

2.8 安装网络插件(master节点操作)

网络组件有很多种,只需要部署其中一个即可,推荐Calico。

Calico是一个纯三层的数据中心网络方案,Calico支持广泛的平台,包括Kubernetes、OpenStack等。

Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的虚拟路由器( vRouter) 来负责数据转发,而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。

此外,Calico 项目还实现了 Kubernetes 网络策略,提供ACL功能。

(1)下载calico的yaml文件

wget --no-check-certificate https://projectcalico.docs.tigera.io/archive/v3.25/manifests/calico.yaml

(2)修改calico.yaml

# (1)修改pod容器网络
sed -i 's/192.168.0.0/10.244.0.0/g' calico.yaml
# (2)添加网卡信息- name: IP_AUTODETECTION_METHODvalue: "interface=ens33"
# (3)修改仓库
将docker.io修改为docker.m.daocloud.io

图片

图片

(2)安装calico

kubectl apply -f calico.yaml

2.9 给node节点打标签(可选)

kubectl label nodes k8s-node1 node-role.kubernetes.io/worker=worker
kubectl label nodes k8s-node2 node-role.kubernetes.io/worker=worker

2.10 验证集群

(1)查看集群信息

[root@k8s-master ~]#  kubectl cluster-info
Kubernetes control plane is running at https://10.0.0.100:6443
CoreDNS is running at https://10.0.0.100:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxyTo further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

(2)查看节点信息

[root@k8s-master ~]# kubectl get node
NAME         STATUS   ROLES           AGE   VERSION
k8s-master   Ready    control-plane   39m   v1.28.2
k8s-node1    Ready    worker          38m   v1.28.2
k8s-node2    Ready    worker          38m   v1.28.2

(3)查看pod运行状态

[root@k8s-master ~]# kubectl get pods -A

图片

(4)测试:创建一个nginx服务

# 创建nginx的deployment
kubectl create deployment nginx  --image=docker.m.daocloud.io/nginx:1.25# 暴露端口
[root@k8s-master ~]# kubectl expose deploy nginx  --port=80 --target-port=80  --type=NodePort
service/nginx exposed
[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   192.168.0.1       <none>        443/TCP        4h21m
nginx        NodePort    192.168.190.124   <none>        80:31732/TCP   3s

登录测试:http://10.0.0.100:31732

图片

至此,集群已搭建完成并测试可用!

http://www.dtcms.com/a/321550.html

相关文章:

  • 复杂姿态漏检率↓79%!陌讯多模态算法在安全带穿戴识别的落地实践
  • Node.js Turbo 包入门教程
  • web端-登录页面验证码的实现(springboot+vue前后端分离)超详细
  • (Arxiv-2025) CINEMA:通过基于MLLM的引导实现多主体一致性视频生成
  • 基于Jeecgboot3.8.1的flowable流程审批人与发起人相同设置-前端部分
  • Vue2与Vue3 Hooks对比:写法差异与演进思考
  • 【3d61638 渍韵】001 png pdf odt 5与明天各种号(虚拟文章スミレ数据)
  • PDF处理控件Aspose.PDF教程:使用 C#、Java 和 Python 代码调整 PDF 页面大小
  • 以rabbitmq为例演示podman导出导入镜像文件
  • kafka 为什么需要分区?分区的引入带来了哪些好处
  • Kafka + 时间轮 + 数据库实现延迟队列方案
  • 前端开发:JavaScript(7)—— Web API
  • 机器学习视角下的黄金市场动态:3400美元关口的多因子驱动机制
  • Seata分布式事务环境搭建
  • Access开发右下角浮窗提醒
  • RS485转Profibus网关在QDNA钠离子分析仪与S7-300PLC系统集成中的应用
  • 深入解析K-means聚类:从原理到调优实战
  • 基于STM32F030C8T6单片机实现与CH224Q诱骗芯片的I2C通信和电压输出配置
  • 9:USB摄像头的最后一战(上):MP4音视频合封!
  • 《MySQL索引底层原理:B+树、覆盖索引与最左前缀法则》
  • TF 上架全流程实战,从构建到 TestFlight 分发
  • iOS 签名证书全流程详解,申请、管理与上架实战
  • 飞算JavaAI深度剖析:开启Java开发智能新时代
  • 路由器不能上网的解决过程
  • 综合实验作业
  • Web Worker 性能革命:让浏览器多线程为您的应用加速
  • OpenAI 开源 GPT-OSS:1200亿参数推理模型上线,完全免费、商用可用,全民可控智能体时代正式开启!
  • 异步改变Promise状态与then调用顺序
  • 零基础深度学习规划路线:从数学公式到AI大模型的系统进阶指南
  • 【完整源码+数据集+部署教程】植物病害检测系统源码和数据集:改进yolo11-MultiSEAMHead