温馨提示×

centos k8s安装全攻略

小樊
44
2026-01-08 05:57:07
栏目: 智能运维

CentOS 上搭建 Kubernetes 集群全流程

一 环境规划与前置条件

  • 节点规划:至少 1 台 Master + 1 台 Worker;推荐每节点 CPU ≥ 2 核、内存 ≥ 2GB、磁盘 ≥ 20GB,同属一个二层/三层网络,主机名与 /etc/hosts 解析正确。生产环境 Master 建议 4 核 8GB 或更高
  • 系统版本:以 CentOS 7/8 为主,内核建议 ≥ 3.10;时间同步(如 ntp/chrony)必配。
  • 容器运行时:Kubernetes v1.24+ 移除对 Docker 的直接支持,推荐使用 containerd;若使用 Docker,需通过 cri-dockerd 适配。
  • 网络要点:规划 Service CIDRPod CIDR,两者不可重叠;确保节点间 6443/10250/2379-2380 等端口放通(或临时关闭防火墙用于测试)。

二 系统初始化与内核参数

  • 所有节点执行:更新系统、关闭 Swap、设置主机名、配置解析、时间同步。
# 更新与基础
sudo yum update -y
sudo hostnamectl set-hostname k8s-master   # Worker 改为 k8s-node1 等
echo "10.0.0.10 k8s-master" | sudo tee -a /etc/hosts  # 按实际 IP 填写
sudo timedatectl set-ntp true

# 关闭 Swap(临时与永久)
sudo swapoff -a
sudo sed -i '/swap/s/^/#/' /etc/fstab

# SELinux(两种做法其一:宽容模式;其二:禁用并重启)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 或:sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config && sudo reboot

# 内核网络参数
sudo modprobe overlay
sudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
EOF
sudo sysctl --system
  • 防火墙(测试环境可临时关闭;生产按白名单放通端口)
# 关闭防火墙
sudo systemctl stop firewalld && sudo systemctl disable firewalld

# 或仅放通必要端口
sudo firewall-cmd --permanent --add-port=6443/tcp
sudo firewall-cmd --permanent --add-port=2379-2380/tcp
sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=10251/tcp
sudo firewall-cmd --permanent --add-port=10252/tcp
sudo firewall-cmd --reload
  • 可选:内核日志与 rp_filter 优化
cat <<EOF | sudo tee /etc/sysctl.d/99-k8s-extra.conf
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter     = 1
EOF
sudo sysctl --system

说明:关闭 Swap、设置内核桥接与转发、加载 overlay/br_netfilter 是 kube-proxy 与 CNI 正常工作的前提。

三 安装容器运行时 Containerd

  • 安装与生成默认配置(containerd 作为 CRI 运行时)
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y containerd.io

sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

# 使用 systemd cgroup 驱动(与 kubelet 保持一致)
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

# 可选:使用国内镜像仓库加速 pause 等基础镜像
sudo sed -i 's@registry.k8s.io/pause@registry.aliyuncs.com/google_containers/pause@' /etc/containerd/config.toml

sudo systemctl enable --now containerd
sudo systemctl status containerd
  • 验证运行时
sudo ctr version
sudo crictl --runtime-endpoint=unix:///var/run/containerd/containerd.sock version

说明:自 v1.24 起官方推荐 containerd;确保 containerd 与 kubelet 使用相同的 cgroup 驱动(systemd)

四 安装 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-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
  • 安装指定版本(示例:v1.27.0;可按需调整)
sudo yum install -y kubelet-1.27.0 kubeadm-1.27.0 kubectl-1.27.0
sudo systemctl enable --now kubelet
  • 说明:kubelet 启动但会不断重启直至集群初始化完成,属正常现象。

五 初始化 Master 与安装 CNI 网络

  • 预拉取镜像(国内镜像加速,避免卡在 init)
sudo kubeadm config images pull \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.27.0
  • 初始化控制平面(示例网段,按实际规划修改)
sudo kubeadm init \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.27.0 \
  --service-cidr=20.1.0.0/16 \
  --pod-network-cidr=20.2.0.0/16 \
  --cri-socket unix:///run/containerd/containerd.sock
  • 配置 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 网络插件(二选一,注意与 Pod CIDR 一致)
# Calico
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# 或 Flannel(若使用 Flannel,Pod CIDR 常用 10.244.0.0/16)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  • 验证
kubectl get nodes
kubectl get pods -A

说明:初始化成功后按提示保存 kubeadm join 命令;CNI 未就绪时节点会处于 NotReady

六 加入 Worker 节点与公网访问

  • Worker 加入集群(使用 Master 输出的 join 命令)
# 示例(请使用实际输出)
sudo kubeadm join 10.0.0.10:6443 \
  --token <TOKEN> \
  --discovery-token-ca-cert-hash sha256:<HASH>
  • 若 Token 过期,Master 上重新生成
kubeadm token create --print-join-command
  • 公网访问与暴露服务
    • 方式 A(云上):为 Service type=LoadBalancer 配置云厂商 LB;或部署 MetalLB(裸金属/自有网络)。
    • 方式 B(通用):Service type=NodePort,通过节点公网 IP + NodePort 访问。
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc nginx
# 访问地址:http://<任一节点公网IP>:<NodePort>

说明:暴露到公网前务必配置 TLS/Ingress/防火墙 与访问控制。

七 常见问题与排障

  • 镜像拉取失败:使用国内镜像仓库并预拉取;或手动拉取
sudo kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
# 或 ctr 手动拉取
sudo ctr -n k8s.io image pull registry.aliyuncs.com/google_containers/pause:3.9
  • 节点 NotReady:检查 kubelet、容器运行时、CNI 与网络连通性
sudo journalctl -u kubelet -f
kubectl get pods -n kube-system
  • Token 过期:在 Master 重新生成 join 命令
kubeadm token create --print-join-command
  • 控制平面组件 CrashLoopBackOff:核对 镜像版本cgroup 驱动一致性证书/时间同步

八 生产环境加固与优化建议

  • 安全与合规:启用 RBAC、最小权限、密钥管理(Secrets/KMS)、网络策略(Calico NetworkPolicy)、审计日志;对外暴露面最小化。
  • 高可用:控制平面至少 3 台 Master(奇数),定期 etcd 快照备份,对外入口使用 LB/Ingress Controller
  • 资源与可观测:为 kubelet 配置 kubeReserved/systemReserved,部署 Metrics Server + Prometheus/Grafana,设置资源 Requests/LimitsHPA
  • 网络与存储:合理设置 Pod/Service CIDR、MTU 与跨节点路由;持久化存储对接云盘/对象存储或 CSI。

0