0

0

CentOS容器编排如何配置_CentOS部署Kubernetes集群

爱谁谁

爱谁谁

发布时间:2025-09-16 11:56:01

|

550人浏览过

|

来源于php中文网

原创

答案:在centos上部署kubernetes集群的关键前置准备包括禁用selinux、关闭防火墙、禁用swap、配置内核参数及设置hosts解析。这些步骤确保系统安全策略、网络通信和资源管理符合kubernetes运行要求,是集群稳定部署的基础。

centos容器编排如何配置_centos部署kubernetes集群

要在CentOS上配置容器编排,尤其是部署Kubernetes集群,核心在于系统环境的精心准备、容器运行时的选择与安装,以及Kubernetes组件的正确部署与初始化。这不仅仅是执行一系列命令,更需要理解每个步骤背后的逻辑,确保集群能够稳定、高效地运行。

解决方案

在CentOS系统上部署Kubernetes集群,通常遵循以下步骤,这其中包含了许多细节,需要耐心和细致:

  1. 系统初始化与优化:

    • 更新系统:
      sudo yum update -y
    • 禁用SELinux: 编辑
      /etc/selinux/config
      文件,将
      SELINUX=enforcing
      改为
      SELINUX=disabled
      ,然后重启系统或运行
      sudo setenforce 0
      。SELinux有时会无故阻碍Kubernetes组件间的通信。
    • 禁用防火墙
      sudo systemctl stop firewalld && sudo systemctl disable firewalld
      。为了集群内部通信的顺畅,通常会禁用防火墙,或者精确配置规则,但初期禁用更省心。
    • 禁用Swap分区:
      sudo swapoff -a
      并注释掉
      /etc/fstab
      中所有
      swap
      行。Kubernetes的
      kubelet
      组件在检测到Swap开启时会拒绝启动。
    • 配置内核参数: 允许
      br_netfilter
      模块,使Linux桥接流量能够被
      iptables
      处理,这是Kubernetes网络模型所必需的。
      sudo modprobe br_netfilter
      echo '1' | sudo tee /proc/sys/net/bridge/bridge-nf-call-iptables
      echo '1' | sudo tee /proc/sys/net/bridge/bridge-nf-call-ip6tables
      echo 'net.bridge.bridge-nf-call-iptables = 1' | sudo tee -a /etc/sysctl.d/k8s.conf
      echo 'net.bridge.bridge-nf-call-ip6tables = 1' | sudo tee -a /etc/sysctl.d/k8s.conf
      sudo sysctl --system
    • 配置
      /etc/hosts
      添加所有节点的主机名和IP地址映射,确保节点间可以通过主机名互相解析。
  2. 安装容器运行时(Containerd):

    • 安装必要工具
      sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    • 添加Docker官方repo(Containerd通常随Docker安装包提供):
      sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    • 安装Containerd:
      sudo yum install -y containerd.io
    • 配置Containerd: 生成默认配置文件并修改
      SystemdCgroup
      true
      sudo mkdir -p /etc/containerd
      sudo containerd config default | sudo tee /etc/containerd/config.toml
      # 修改 config.toml 文件,找到 [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
      # 将 SystemdCgroup = false 改为 SystemdCgroup = true
      # 可以用 sed 命令简化:
      sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
    • 启动Containerd:
      sudo systemctl enable --now containerd
  3. 安装Kubernetes组件(kubeadm, kubelet, kubectl):

    • 添加Kubernetes YUM仓库:
      cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
      [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

      (这里使用了阿里云镜像,国内访问更快)

    • 安装组件:
      sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
    • 启动Kubelet:
      sudo systemctl enable --now kubelet
      (Kubelet会持续尝试启动,直到集群初始化完成)
  4. 初始化Kubernetes主节点(仅在主节点执行):

    • 拉取镜像:
      sudo kubeadm config images pull
      (如果网络不佳,可能需要配置镜像加速器或使用国内镜像源)
    • 初始化集群:
      sudo kubeadm init \
        --apiserver-advertise-address=<Master节点IP地址> \
        --pod-network-cidr=<Pod网络的CIDR,例如10.244.0.0/16,取决于你选择的CNI插件> \
        --kubernetes-version v1.28.0 # 根据实际情况调整版本

      初始化成功后,会输出

      kubeadm join
      命令,以及配置
      kubectl
      的方法。

    • 配置kubectl:
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
    • 安装网络插件(CNI): 例如Flannel。
      kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

      (注意:根据你

      kubeadm init
      时指定的
      --pod-network-cidr
      选择合适的CNI插件及其配置)

  5. 加入工作节点(在所有工作节点执行):

    • 在主节点初始化成功后,会得到一个
      kubeadm join
      命令,将其复制到工作节点上执行。
    • 如果Token过期或丢失,可以在主节点上生成新的:
      sudo kubeadm token create --print-join-command

在CentOS上部署Kubernetes集群,有哪些关键的系统前置准备工作?

部署Kubernetes集群,系统前置准备工作是基石,它直接决定了集群的稳定性和性能。我的经验告诉我,很多初学者在这一步上踩坑,往往导致后续部署失败或集群运行异常。

首先,禁用SELinux是几乎成了惯例。SELinux的安全机制非常严格,它可能阻止Kubernetes组件,尤其是

kubelet
和容器运行时之间进行必要的通信,导致各种奇怪的权限错误。虽然理论上可以通过精确配置SELinux策略来允许这些操作,但在实际操作中,为了快速部署和减少不必要的复杂性,暂时禁用它是一个普遍且有效的选择。当然,生产环境中应该考虑更安全的替代方案或定制策略。

其次,禁用防火墙(或至少配置精确的规则)也是不可或缺的。Kubernetes集群内部有大量的网络通信,包括Pod到Pod、Pod到Service、API Server到各个组件等等。如果防火墙规则过于严格,这些通信就会被阻断,导致集群无法正常工作。例如,

kube-proxy
需要访问API Server,
kubelet
需要与
containerd
通信,并且需要通过端口暴露Pod服务。全面禁用防火墙虽然简单粗暴,但能有效避免初期因网络策略不当引发的问题。

拍我AI
拍我AI

AI视频生成平台PixVerse的国内版本

下载

再者,禁用Swap分区是Kubernetes官方明确要求的。

kubelet
在检测到系统开启了Swap时会拒绝启动,或者即使启动了也可能导致Pod性能下降或不稳定。Kubernetes倾向于将节点视为可支配的计算资源,它希望对内存资源有完全的控制权,Swap的存在会干扰其调度和资源管理。所以,无论是通过
swapoff -a
临时关闭,还是修改
/etc/fstab
永久禁用,都是必须执行的步骤。

最后,配置内核参数,特别是启用

br_netfilter
模块并设置
net.bridge.bridge-nf-call-iptables
为1,这对于Kubernetes的网络模型至关重要。Kubernetes使用CNI(Container Network Interface)插件来管理Pod网络,这些插件通常依赖于Linux桥接和
iptables
来实现Pod间的通信和Service负载均衡。没有这些内核参数,Pod之间的网络隔离和通信可能会出现问题,Service的虚拟IP也无法正常工作。我曾经就遇到过Pod无法跨节点通信的问题,排查下来就是这个内核参数没有正确设置。

这些前置准备工作,看似琐碎,实则环环相扣,是确保Kubernetes集群健康运行的基石。

CentOS部署Kubernetes时,选择Docker还是Containerd作为容器运行时更合适?

这是一个很有意思的问题,尤其是在Kubernetes社区经历了从Docker到Containerd的“运行时之争”之后。从我的实践经验和社区趋势来看,Containerd无疑是目前更推荐的选择

早期,Docker是容器技术的代名词,Kubernetes也理所当然地将其作为默认的容器运行时。但随着Kubernetes生态的成熟,Docker作为一个包含大量上层工具(如

docker build
docker compose
等)的完整平台,其内部的
containerd
部分才是Kubernetes真正需要的。Docker的架构是“Docker Client -> Docker Daemon -> containerd -> runc”,而Kubernetes通过CRI(Container Runtime Interface)直接与
containerd
通信,绕过了Docker Daemon的很多非核心功能。

选择Containerd的理由很直接:

  1. 轻量与高效: Containerd是专门为Kubernetes设计的CRI运行时,它更轻量、更专注于容器生命周期管理的核心功能。这意味着更少的资源占用和更快的操作响应速度。
  2. 稳定性与兼容性: Kubernetes社区已经将Containerd作为首选和默认的CRI运行时,这意味着它得到了更好的测试和维护,与Kubernetes的兼容性也更强。
  3. 减少抽象层: 直接使用Containerd减少了中间的抽象层,降低了潜在的故障点。当出现问题时,排查起来也相对更容易,因为你不需要去考虑Docker Daemon本身的复杂性。
  4. 未来趋势: 随着Kubernetes的发展,直接与CRI兼容的运行时(如Containerd、CRI-O)将是主流,它们提供了更贴合Kubernetes需求的接口和更优化的性能。

当然,这并不是说Docker不好。Docker仍然是开发和本地测试的优秀工具。但对于生产级别的Kubernetes集群,追求极致的稳定、高效和与Kubernetes的深度集成,Containerd是更明智的选择。在CentOS上安装Containerd,通常也比安装完整的Docker-CE更直接,只需要安装

containerd.io
包并进行简单的配置即可。在配置时,务必注意将Containerd的cgroup驱动设置为
systemd
,与
kubelet
保持一致,这是避免集群启动失败的一个常见陷阱。

使用kubeadm在CentOS上初始化Kubernetes主节点时,常会遇到哪些问题及如何排查?

使用

kubeadm init
命令来初始化Kubernetes主节点,是部署过程中最关键的一步,也常常是问题的高发区。我见过不少人卡在这里,反复尝试,最终发现是某个前置条件没满足。

一个最常见的问题是镜像拉取失败

kubeadm init
会尝试从
k8s.gcr.io
(或
registry.k8s.io
)拉取核心组件镜像,如
kube-apiserver
kube-controller-manager
等。在中国大陆,由于网络限制,直接拉取这些镜像往往会超时或失败。这时候,你需要配置一个国内的镜像加速器,或者在
kubeadm init
命令中指定
--image-repository
参数,指向一个国内可访问的镜像源,例如阿里云的
registry.aliyuncs.com/google_containers
。排查时,可以先手动尝试
sudo crictl pull <image_name>
(如果安装了crictl)或查看
kubeadm config images pull
的输出。

其次,网络配置问题也频繁出现。这包括

--pod-network-cidr
参数与实际CNI插件不匹配,或者主机防火墙、SELinux未正确禁用。如果
kubeadm init
完成后,
kubectl get nodes
显示节点状态为
NotReady
,或者
kubectl get pods -A
发现核心组件(如
coredns
)一直处于
Pending
CrashLoopBackOff
状态,这很可能就是网络问题。排查时,首先检查
kubelet
的日志:
sudo journalctl -u kubelet -f
,看是否有关于网络插件或API Server连接的错误。同时,确保
--pod-network-cidr
与你后续安装的CNI插件(如Flannel的默认CIDR是
10.244.0.0/16
)一致。

Cgroup驱动不匹配是另一个隐蔽的问题。

kubelet
和容器运行时(Containerd)需要使用相同的cgroup驱动(
systemd
cgroupfs
)。如果Containerd的配置文件中
SystemdCgroup
设置为
false
,而
kubelet
默认使用
systemd
,就会导致
kubelet
无法正常启动。排查时,查看
kubelet
日志会发现类似“failed to find cgroupfs mount point”或“cgroup driver mismatch”的错误。解决办法是修改Containerd的
config.toml
文件,将
SystemdCgroup = true
,然后重启Containerd和kubelet。

最后,资源不足也是常见问题。如果你的CentOS虚拟机内存太小(例如低于2GB),

kubeadm init
可能会因为资源限制而失败。虽然
kubeadm
会给出警告,但有时会被忽略。确保每个节点至少有2GB内存和2个CPU核心,是运行Kubernetes的基本要求。

排查这些问题时,始终牢记

sudo journalctl -u kubelet -f
是你的好帮手,它能实时输出
kubelet
的运行日志,是定位问题的关键线索。如果问题复杂,
kubeadm reset
后重新尝试,并仔细检查每一步的前置条件,往往能解决大部分问题。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

18

2026.02.03

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6607

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

842

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1092

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

2134

2024.03.01

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1923

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

656

2025.10.17

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.5万人学习

Git 教程
Git 教程

共21课时 | 4.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号