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

Kubernetes-架构安装

一、Kuberntes架构

1.宏观架构

  • Master node(控制面):集群管理者
  • Worker node(数据面):工作节点,运行用户的任务

2.微观架构

3.主要组件

Master node(控制面)组件

  • kube-apiserver:整个 Kubernetes 系统的唯一入口;加上了验证、授权等功能;所有其他组件都只能和它直接通信
  • kube-scheduler:负责容器的编排工作,检查节点的资源状态,把 Pod 调度到最适合的节点上运行
  • kube-controller-manager:负责维护容器和节点等资源的状态,实现故障检测、服务迁移、应用伸缩等功能
  • etcd:采用Raft分布式共识算法;分布式 Key-Value 数据库;持久化存储系统里的各种资源对象和状态;只与 apiserver 有直接联系

Worker node(数据面)组件

  • kubelet :实现状态报告、命令下发、启停容器等功能,负责 Pod 生命周期管理,执行任务并将 Pod 状态报告给 Master 节点
  • kube-proxy:是 Node 的网络代理,只负责管理容器的网络通信
  • CR ( Container Runtime ):容器和镜像的实际使用者,在 kubelet 的指挥下创建容器,管理 Pod 的生命周期

4.工作流程

  • 每个 Node 上kubelet会定期向 kube-apiserver 上报节点状态,kube-apiserver 再存到 etcd 里

  • 每个 Node 上的 kube-proxy 实现了 TCP/UDP 反向代理,让容器对外提供稳定的服务

  • kube-scheduler 通过 kube-apiserver 得到当前的节点状态,调度 Pod,然后 kube-apiserver 下发命令给某 个 Node 上的 kubelet,kubelet 调用 container-runtime 启动容器

  • controller-manager 也通过 kube-apiserver 得到实时的节点状态,监控可能的异常情况,再使用相应的手段去调节恢复

5.功能插件

  • DNS: 负责为整个集群提供DNS服务
  • Ingress Controller:为服务提供外网入口
  • MetricsServer:提供资源监控
  • Dashboard:提供GUI

二、Kubernetes 集群部署

1.Kubeadm

  • Kubernetes 管理员
  • Kubeadm 是用容器和镜像来封装 Kubernetes 的各种组件
  • 轻松地在集群环境里部署 Kubernetes

2.环境准备

(1)所需服务器

角色

主机名

IP

最小配置

建议配置

操作系统

Master 节点

master

192.168.5.110

2C4G

2C4G

Rockylinux 9.4

Worker 节点

worker

192.168.5.120

2C2G

2C4G

Rockylinux 9.4

(2)关闭防火墙&&SELinux

# 关闭防火墙,并禁止开机自动运行 
systemctl disable --now firewalld# 设置 SELinux 的执行模式。0 表示关闭 SELinux。
setenforce 0
# 修改 SELinux 配置文件  /etc/selinux/config ,禁用 SELinux 
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

(3)关闭交换分区

swapoff -a; sed -i '/swap/d' /etc/fstab

(4)配置时钟同步

dnf -y install chrony ​
​
# 修改配置文件 /etc/chrony.conf  ,添加如下行 ​
server ntp.aliyun.com iburst​
server ntp1.aliyun.com iburst​
server ntp2.aliyun.com iburst​
​
# 启动服务 ​
systemctl restart chronyd​
systemctl enable chronyd ​
​
# 检查状态 ​
chronyc tracking

(5)修改内核参数

[root@localhost ~]# 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 --system
# net.ipv4.ip_forward = 1 启用了IPv4的IP转发功能,允许服务器作为网络路由器转发数据包。​
# net.bridge.bridge-nf-call-iptables = 1  当使用网络桥接技术时,将数据包传递到iptables进行处理。

(6)配置hosts本地解析

cat > /etc/hosts <<EOF
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.5.110   master
192.168.5.120   worker
EOF

(7)安装容器运行时

dnf install -y yum-utils 
# 使用 阿里云仓库 
dnf config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装 containerd 
dnf -y install containerd.io-1.7.25

(8)修改 containerd 配置文件

# 创建默认配置文件
cd /etc/containerd
mv config.toml config.toml.orig
containerd config default > /etc/containerd/config.toml# 修改 Containerd cgroup 配置
sed -i "s#SystemdCgroup\ \=\ false#SystemdCgroup\ \=\ true#g" /etc/containerd/config.toml# grep -i SystemdCgroup  /etc/containerd/config.toml
# SystemdCgroup = true # false 改为 true # 修改 sandbox 沙箱镜像地址(就是 pause 镜像地址)
sed -i "s#registry.k8s.io#registry.aliyuncs.com/google_containers#g" /etc/containerd/config.toml# grep -i sandbox_image /etc/containerd/config.toml
# sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.8"
# 修改镜像仓库 从 registry.k8s.io 修改为 阿里云 

(9)启动 containerd 服务

systemctl enable --now containerd
systemctl status  containerd
ctr version 

(10)nerdctl命令行工具

# Kubernetes 容器运行时 从 Docker 切换到 Containerd 之后,使用 ctr 或 crictl 命令管理容器和镜像都不方便,今天我们使用一个新的命令行工具 nerdctl 
# 下载 
# wget https://github.com/containerd/nerdctl/releases/download/v2.0.3/nerdctl-2.0.3-linux-amd64.tar.gz# 解压 
# tar Cxzvvf /usr/local/bin nerdctl-2.0.3-linux-amd64.tar.gz

(11)安装kubeadm和k8s组件

# k8s 官方的仓库访问受限,我们使用阿里云的仓库 
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/repodata/repomd.xml.key
EOFdnf install -y kubeadm-1.32.2 kubelet-1.32.2 kubectl-1.32.2systemctl enable --now kubelet

3.Master 节点初始化

(1)生成初始化的配置文件

kubeadm config  print init-defaults > kubeadm-config.yaml

(2)修改配置文件

# 默认生成的kubeadm初始化配置文件  kubeadm-config.yaml 需要修改以下内容:
localAPIEndpoint:advertiseAddress: 192.168.5.110  # 修改为 master节点IP地址,如果使用公有云,配置虚机的内网地址 bindPort: 6443
... ...   
imageRepository: registry.aliyuncs.com/google_containers # 修改为阿里云镜像仓库 
kind: ClusterConfiguration
kubernetesVersion: 1.32.2  # # 需要安装的 k8s 版本号
networking:dnsDomain: cluster.localserviceSubnet: 192.168.111.0/24    #(真实机的网段,即网络的网段)podSubnet: 172.17.0.0/16 # 添加 pod 网络 CIDR 地址(容器的网段)

(3)下载集群初始化所需镜像

# 查看 Kubernetes 初始化需要用到的镜像 
[root@master-01 ~]# kubeadm config --config=kubeadm-config.yaml  images list# 下载初始化需要用的镜像 
[root@master-01 ~]# kubeadm config --config=kubeadm-config.yaml  images pull# 查看下载后的镜像 使用 ctr 命令
[root@master-01 ~]# ctr -n k8s.io image list 

(4)集群初始化

kubeadm init --config=kubeadm-config.yaml# 配置 kubectl 的认证文件 
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config# 验证集群
[root@master-01 ~]# kubectl get node
NAME     STATUS     ROLES           AGE     VERSION
master   NotReady   control-plane   2m21s   v1.32.2

(5)Worker 节点加入集群

注:在worker节点执行命令

kubeadm join 192.168.5.110:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:9feaeaba353c4ca994ce329e4bb65600c93a37a28acfd90f64b5a2fb9226fb97

注:在master节点查看

[root@localhost ~]# kubectl get nodes
NAME        STATUS     ROLES           AGE     VERSION
worker      NotReady   <none>          55s     v1.32.2
master      NotReady   control-plane   6m45s   v1.32.2

4.安装网络插件

注:在 master 节点执行,实现跨节点的网络容器之间的通信

# 我们使用 Calico 网络插件,calico 用到的镜像在 hub.docker.com 上,国内需要配置加速器,或者导入离线镜像
# 导入镜像, ctr 是 containerd 的客户端命令(每个节点都要导),压缩包从资源仓库下载
ctr  -n k8s.io  image import calico-3.29.2.image# 下载 calico YAML 文件 
curl https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/calico.yaml -O# 安装 calico 插件 (只在master节点上执行)
kubectl  create -f calico.yaml 

最终结果:

[root@localhost ~]# kubectl  get pods -A -w
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-77969b7d87-75wvq   1/1     Running   0          37s
kube-system   calico-node-l7xxv                          1/1     Running   0          37s
kube-system   calico-node-zdtq9                          1/1     Running   0          37s
kube-system   coredns-6766b7b6bb-c8ldf                   1/1     Running   0          20m
kube-system   coredns-6766b7b6bb-vhfqf                   1/1     Running   0          20m
kube-system   etcd-master                                1/1     Running   0          20m
kube-system   kube-apiserver-master                      1/1     Running   0          20m
kube-system   kube-controller-manager-master             1/1     Running   0          20m
kube-system   kube-proxy-q6fg8                           1/1     Running   0          20m
kube-system   kube-proxy-t8gsz                           1/1     Running   0          14m
kube-system   kube-scheduler-master                      1/1     Running   0          20m# 此时集群初始化完毕
[root@localhost ~]# kubectl get node
NAME        STATUS   ROLES           AGE   VERSION
worker      Ready    <none>          15m   v1.32.2
master      Ready    control-plane   21m   v1.32.2# 控制面组件状态显示 Healthy
[root@localhost ~]# kubectl  get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE   ERROR
controller-manager   Healthy   ok        
scheduler            Healthy   ok        
etcd-0               Healthy   ok  

5.常见故障处理

(1)镜像拉取失败

  • 如果 Pod 状态显示 ImagePullBackOff,表示容器所有的节点 镜像拉取失败,需要到对应节点上手动拉取镜像或者导入离线镜像即可

(2)Master 节点初始化失败

  • 在 master 节点初始化过程中,常见的故障是 卡在如下界面,此处是正在等待 kube-apiserver 启动成功,如果apiserver启动失败,这里会一直等待,直到4分钟超时会有报错。
  • 排错的时候需要查看 messages 日志定位具体原因,在初始化的过程中建议打开一个shell 终端运行 tail -f /var/log/messages 命令,注意观察报错信息

(3)Worker 节点加入集群失败

  • Worker 节点在加入集群过程中需要成功运行 kubelet 服务,再连接 kube-apiserver,任何一步失败都无法加入集群
  • 因此在执行 kubeadm join 时也需要打开一个shell 终端运行 tail -f /var/log/messages 命令,观察日志中的报错信息

(4)重置集群

  • 如果找到了报错原因,需要重新初始化集群或是worker节点重新加入集群, 都需要先执行 kubeadm reset 命令,再执行 kubeadm init 或是 kubeadm join
[root@localhost ~]# kubeadm reset
[reset] Reading configuration from the "kubeadm-config" ConfigMap in namespace "kube-system"...
[reset] Use 'kubeadm init phase upload-config --config your-config.yaml' to re-upload it.
W1114 20:55:10.703433   38960 preflight.go:56] [reset] WARNING: Changes made to this host by 'kubeadm init' or 'kubeadm join' will be reverted.
[reset] Are you sure you want to proceed? [y/N]: 

(5)重新生成 join 命令

  • 初始化时生成的 kubeadm join 命令,有效期是 24 小时,超时后命令中的token 就失效了,如果 24小时后有节点加入集群, 我们需要执行以下命令,重新生成可用的 token
kubeadm token create --print-join-command

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

相关文章:

  • 【剑斩OFFER】算法的暴力美学——二维前缀和
  • 网站开发教程全集哪些网站做的好看
  • 2025IPTV 源码优化版实测:双架构兼容 + 可视化运维
  • 建设一个网站步骤揭阳专业网站建设
  • ftp下的内部网站建设竞价培训课程
  • 技术观察 | 语音增强技术迎来新突破!TFCM模型如何攻克“保真”与“降噪”的难题?
  • FPGA系统架构设计实践5_IP的封装优化
  • UDP服务端绑定INADDR_ANY后,客户端该用什么IP访问?
  • 不同传感器前中后融合方案简介
  • 《C++在LLM系统中的核心赋能与技术深耕》
  • sward V2.1.5 版本发布,支持文档导出为html\PDF,社区版新增多种账号集成与认证
  • 东莞建站网站模板怎么做电脑网站后台
  • 物联网赋能互联网医院:构建智慧医疗新生态
  • node.js+npm的环境配置以及添加镜像(保姆级教程)
  • Java 大视界 -- 基于 Java 的大数据联邦学习在跨行业数据协同创新中的实践突破
  • 企业做网站电话约见客户的对话北京网站建设 一流
  • Android Studio + Gemini 移动开发领域的一次范式转移
  • 基于多源政策信号解析与量化因子的“12月降息预期降温”重构及黄金敏感性分析
  • LinuxC语言文件i/o笔记(第十七天)
  • Spring AI Evaluation Testing(评估测试)
  • 太仓营销型网站建设四平网站建设怎么选
  • 记一次慢接口优化:载体详情页从90秒到800毫秒的性能提升实战
  • 微软Visual Studio 2026正式登场,AI融入开发核心操作体验更流畅
  • 微软vcpkg包管理工具如何使用?
  • 提供小企业网站建设织梦网站默认密码忘记
  • 基于XTOM蓝光扫描的复杂中小尺寸零件3D形貌重建与全尺寸误差分析
  • Qt 自定义菜单栏 / 工具栏按钮 QToolButton + InstantPopup 详细解析
  • 2025年AI生成PPT工具深度评测:技术对比与实战分析
  • 智慧园区:科技赋能下的安全便捷生活新范式
  • 华为WATCH 5:连接心与心,让生活更美好