Kubernetes 集群部署指南 (v1.28.0)

Kubernetes 集群部署指南 (v1.28.0)

简介

本文档旨在提供一个详细的指南,帮助用户在CentOS 7.9环境中部署一个包含1个Master节点和2个Worker节点的Kubernetes v1.28.0集群。本指南涵盖了从环境准备到集群验证的完整过程,并提供了常见问题的解决方案。

Kubernetes是一个开源的容器编排平台,用于自动化应用程序的部署、扩展和管理。它将多个主机组合成一个集群,提供服务发现、负载均衡、存储编排、自我修复等特性。

目录

环境准备

1.1 服务器要求

  • 操作系统: CentOS 7.9 或更高版本(推荐使用CentOS 7.9 Minimal安装)
  • 硬件配置:
    • Master节点: 2核CPU, 4GB内存, 40GB存储(生产环境建议更高配置)
    • Worker节点: 2核CPU, 4GB内存, 40GB存储(根据实际工作负载调整)
  • 网络要求:
    • 所有节点能够互相通信
    • 访问外网以下载所需软件包和镜像
    • 建议使用静态IP地址
  • 端口要求:
    • Master节点: 6443, 2379-2380, 10250-10252, 10255
    • Worker节点: 10250, 10255, 30000-32767
  • 节点规划:
节点类型 主机名 IP地址 角色
Master k8s-master 192.168.9.86 集群控制平面
Worker1 k8s-worker1 192.168.9.87 工作节点
Worker2 k8s-worker2 192.168.9.88 工作节点

1.2 主机名配置

在各节点上执行对应的命令设置主机名:

# 在Master节点上执行
hostnamectl set-hostname k8s-master

# 在Worker节点1上执行
hostnamectl set-hostname k8s-worker1

# 在Worker节点2上执行
hostnamectl set-hostname k8s-worker2

1.3 hosts文件配置

在三台服务器上分别配置hosts文件,确保节点间可以通过主机名通信:

cat >> /etc/hosts << EOF
192.168.9.86 k8s-master
192.168.9.87 k8s-worker1
192.168.9.88 k8s-worker2
EOF

系统配置

2.1 关闭防火墙和SELinux

为了防止防火墙和SELinux干扰Kubernetes组件的正常运行,需要关闭它们:

# 关闭并禁用防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭 SELinux(安全增强Linux)
setenforce 0 # 临时关闭
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config # 永久关闭

验证防火墙和SELinux状态:

# 检查防火墙状态
systemctl status firewalld

# 检查SELinux状态
getenforce

2.2 关闭Swap分区

Kubernetes要求关闭Swap分区以保证性能:

# 临时关闭
swapoff -a

# 永久关闭(注释掉swap相关的行)
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab

验证Swap分区状态:

# 检查swap是否已关闭
free -m

# 检查fstab中swap配置是否已注释
cat /etc/fstab | grep swap

2.3 安装基础工具

安装必要的系统工具以便后续操作:

# 更新系统
yum update -y

# 安装基础工具包
yum install -y wget curl net-tools conntrack-tools telnet bind-utils yum-utils

工具说明:

  • wget: 用于下载文件
  • curl: 用于发送HTTP请求
  • net-tools: 包含ifconfig、netstat等网络工具
  • conntrack-tools: 用于连接跟踪
  • telnet: 用于测试端口连通性
  • bind-utils: 包含nslookup、dig等DNS工具
  • yum-utils: 包含yum-config-manager等工具

2.4 时间同步

保持集群中所有节点的时间同步非常重要:

# 安装ntp服务
yum install ntpdate -y

# 使用阿里云的时间服务同步时间
ntpdate ntp1.aliyun.com

如果提示没有匹配到 ntpdate,则可以使用 wlnmp 的软件源安装 wntp:

rpm -ivh http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm
yum install wntp -y

设置定时任务自动同步时间:

# 添加定时任务,每小时同步一次时间
echo "0 * * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1" >> /etc/crontab

2.5 配置网络

为了让 K8s 能够转发网络流量,需要修改 iptables 的配置:

# 修改 Linux 内核参数,添加网桥过滤和地址转发功能
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

验证网络配置:

# 检查内核参数是否生效
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

2.6 重启服务器

完成上述配置后,重启所有节点以确保配置生效:

reboot

软件安装

3.1 安装Docker

使用 Docker 作为运行容器的运行时组件。参考阿里云 Docker CE镜像

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils

# Step 2: 添加软件源信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# Step 3: 安装Docker(指定一个稳定版本)
sudo yum install docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io docker-buildx-plugin docker-compose-plugin

# Step 4: 开启Docker服务
systemctl enable docker && systemctl start docker

验证Docker安装:

# 检查Docker版本
docker --version

# 检查Docker服务状态
systemctl status docker

# 运行测试容器
docker run hello-world

配置Docker镜像加速以提高镜像拉取速度:

# 配置镜像下载加速器,国内使用阿里云镜像库会更快
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": [
    "https://registry.cn-hangzhou.aliyuncs.com",
    "https://docker.xuanyuan.me"
  ],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "200m"
  }
}
EOF

# 重启docker服务
systemctl restart docker

验证Docker配置:

# 检查配置是否生效
docker info | grep -i mirror

# 检查cgroup driver
docker info | grep -i cgroup

3.2 安装cri-dockerd(K8s 1.24+ 必需)

自 Kubernetes 1.24 起,移除了对 Docker 的直接支持(dockershim),需要通过 cri-dockerd 这个适配层来连接 Docker 与 K8s。

cri-dockerd 用于为 Docker 提供一个能够支持 K8s 容器运行时标准的工具:

# 1. 下载并安装 cri-dockerd RPM 包
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.12/cri-dockerd-0.3.12-3.el7.x86_64.rpm
rpm -ivh cri-dockerd-0.3.12-3.el7.x86_64.rpm

# 2. 修改服务配置文件,指定 pause 镜像(国内可访问)
# 编辑文件 /usr/lib/systemd/system/cri-docker.service
# 找到 ExecStart 行,修改为:
# ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9

# 更简便的方式是直接使用sed命令修改
sed -i 's|ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd://|ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9|' /usr/lib/systemd/system/cri-docker.service

# 3. 重新加载配置并启动服务
systemctl daemon-reload
systemctl enable cri-docker && systemctl start cri-docker

验证cri-dockerd安装:

# 检查cri-dockerd服务状态
systemctl status cri-docker

# 检查监听的socket
ls -l /var/run/cri-dockerd.sock

3.3 添加国内YUM源

由于国内无法访问 K8s 官方的镜像库,需要添加阿里云的镜像库。参考阿里云 Kubernetes镜像

cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF

3.4 安装kubeadm、kubelet和kubectl

安装指定版本1.28.0的Kubernetes组件:

# 安装指定版本1.28.0
yum install -y kubelet-1.28.0 kubeadm-1.28.0 kubectl-1.28.0

# 设置 kubelet 开机自启(暂不启动,等待初始化)
systemctl enable kubelet

# (可选)配置命令自动补全
echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc

验证安装:

# 检查版本
kubeadm version
kubectl version --client
kubelet --version

# 检查服务是否已启用
systemctl is-enabled kubelet

Master节点初始化

所有准备工作都完成后,可以在Master节点上执行以下初始化命令:

kubeadm init \
  --apiserver-advertise-address=192.168.9.86 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.28.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
  --cri-socket=unix:///var/run/cri-dockerd.sock \
  --ignore-preflight-errors=all

参数说明:

  • apiserver-advertise-address:集群广播地址,使用master节点的内网IP
  • image-repository:指定阿里云镜像仓库地址(国内无法访问k8s.gcr.io)
  • kubernetes-version:K8s版本,与上面安装的软件版本一致
  • service-cidr:集群Service网段
  • pod-network-cidr:集群Pod网段
  • cri-socket:指定cri-socket接口,使用unix:///var/run/cri-dockerd.sock
  • ignore-preflight-errors=all:忽略预检查错误

初始化过程可能需要几分钟时间,请耐心等待。如果初始化失败,可以根据错误信息进行排查,常见问题包括:

  • 网络连接问题导致镜像拉取失败
  • 端口被占用
  • 系统配置不符合要求

初始化完成后,会出现类似以下内容,需要立即执行3条命令:

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

验证Master节点状态:

# 检查节点状态(此时只有master节点)
kubectl get nodes

# 检查系统Pod状态
kubectl get pods -n kube-system

# 检查集群信息
kubectl cluster-info

同时,记录下最后一条"join"命令,用于Worker节点加入集群,格式如下:

kubeadm join 192.168.9.86:6443 --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash> \
  --cri-socket=unix:///var/run/cri-dockerd.sock

如果未保存join命令或token已过期,可以在Master节点上使用以下命令重新生成:

# 生成新的token和join命令
kubeadm token create --print-join-command

Worker节点加入集群

在两个Worker节点上执行之前记录的join命令:

kubeadm join 192.168.9.86:6443 --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash> \
  --cri-socket=unix:///var/run/cri-dockerd.sock

注意:

  • token有效期为24小时,过期后需要重新生成
  • 可以在Master节点上使用以下命令生成新的token:
kubeadm token create --print-join-command

在Worker节点上执行join命令后,可以在Master节点上验证节点是否成功加入:

# 查看所有节点状态
kubectl get nodes

# 查看节点详细信息
kubectl describe node k8s-worker1
kubectl describe node k8s-worker2

正常情况下,所有节点状态应该最终变为"Ready"。如果节点状态长时间不是"Ready",请参考常见问题解决部分。

网络插件部署

K8s网络插件是实现集群中容器间通信的关键组件。这里使用Calico网络插件:

4.1 下载Calico配置文件

# 下载Calico插件部署文件(v3.28.5版本)
wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.5/manifests/calico.yaml

4.2 修改配置

编辑calico.yaml文件,修改CALICO_IPV4POOL_CIDR参数:

# 使用vi编辑器修改
vi calico.yaml

找到并修改以下参数(约第4602行):

- name: CALICO_IPV4POOL_CIDR
  value: "10.244.0.0/16"

4.3 部署网络插件

kubectl apply -f calico.yaml

部署完成后,验证网络插件状态:

# 检查Calico相关Pod状态
kubectl get pods -n kube-system | grep calico

# 检查所有系统Pod状态
kubectl get pods -n kube-system

# 检查网络策略
kubectl get networkpolicy --all-namespaces

注意:

  • Calico部署会比较慢,需要等待几分钟
  • 确保CALICO_IPV4POOL_CIDR与kubeadm init中的--pod-network-cidr参数一致
  • 如果部署失败,请参考常见问题解决部分

验证集群状态

5.1 查看节点状态

kubectl get nodes

正常情况下,所有节点状态应为"Ready":

NAME           STATUS   ROLES           AGE   VERSION
k8s-master     Ready    control-plane   12h   v1.28.0
k8s-worker1    Ready    <none>          12h   v1.28.0
k8s-worker2    Ready    <none>          10h   v1.28.0

如果节点状态不是"Ready",可以使用describe命令查看详细信息:

kubectl describe node <node-name>

5.2 查看系统组件状态

kubectl get pods -n kube-system

确保所有系统Pod都处于Running状态。如果有Pod处于Pending、CrashLoopBackOff或其他异常状态,需要进一步排查。

5.3 测试集群功能

# 创建一个测试nginx deployment
kubectl create deployment nginx --image=nginx

# 查看pod状态
kubectl get pods

# 检查deployment详细信息
kubectl describe deployment nginx

# 暴露服务
kubectl expose deployment nginx --port=80 --type=NodePort

# 获取服务信息
kubectl get svc

# 测试服务访问
curl <node-ip>:<node-port>

5.4 验证网络策略

# 检查网络策略
kubectl get networkpolicy --all-namespaces

# 检查网络连通性
kubectl exec -it <pod-name> -- ping <other-pod-ip>

5.5 验证存储卷

# 创建持久化卷声明
kubectl apply -f - <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
EOF

# 检查PVC状态
kubectl get pvc

常见问题解决

6.1 Calico部署失败

如果Calico无法安装成功,可能是由于镜像无法拉取:

解决方案:

  1. 使用离线镜像包
  2. 下载后在每个节点上导入镜像:
ls *.tar |xargs -i docker load -i {}
  1. 重新部署:
kubectl delete -f calico.yaml
kubectl apply -f tigera-operator.yaml --server-side
kubectl apply -f custom-resources.yaml

6.2 Token过期

如果join命令中的token过期:

# 在Master节点上生成新的token
kubeadm token create --print-join-command

6.3 网络不通

确保所有节点之间的网络连通性:

# 测试节点间连通性
ping k8s-master
ping k8s-worker1
ping k8s-worker2

6.4 镜像拉取失败

配置镜像加速器,确保能正常拉取镜像。

6.5 节点NotReady状态

如果节点状态长时间处于NotReady,可以检查以下几点:

  1. 检查kubelet服务状态:
systemctl status kubelet
journalctl -u kubelet -n 100
  1. 检查网络插件是否正常:
kubectl get pods -n kube-system
  1. 检查节点资源使用情况:
kubectl describe node <node-name>

6.6 Pod无法启动

当Pod无法正常启动时,可以按以下步骤排查:

  1. 查看Pod状态和事件:
kubectl describe pod <pod-name>
  1. 查看Pod日志:
kubectl logs <pod-name>
  1. 检查资源配额:
kubectl get resourcequota

总结

通过以上步骤,我们成功搭建了一套3台服务器的K8s集群。在整个搭建过程中,需要注意以下几个关键点:

  1. 环境准备:确保所有服务器的硬件和系统配置符合要求
  2. 系统配置:正确关闭防火墙、SELinux和Swap分区
  3. 时间同步:确保所有服务器时间一致
  4. 软件安装:正确安装Docker、cri-dockerd和K8s相关组件
  5. 网络配置:配置正确的网络参数,确保容器间通信正常
  6. 初始化顺序:先初始化Master节点,再加入Worker节点
  7. 网络插件:部署Calico网络插件,确保集群内部网络通信

成功搭建K8s集群后,可以开始部署各种应用和服务,享受容器化部署带来的便利。

最佳实践和建议

安全加固

  1. 使用RBAC授权:启用基于角色的访问控制
  2. 定期更新:及时应用安全补丁和版本升级
  3. 网络策略:使用网络策略限制Pod间的通信
  4. 资源限制:为容器设置资源请求和限制

性能优化

  1. 节点标签:合理使用节点标签进行调度
  2. 污点和容忍:使用污点和容忍机制控制Pod调度
  3. 监控和日志:部署监控和日志收集系统

备份和恢复

  1. etcd备份:定期备份etcd数据
  2. 资源配置备份:备份重要的资源配置文件

扩展阅读

附录:常用命令和技巧

常用kubectl命令

# 查看集群信息
kubectl cluster-info

# 查看集群状态
kubectl get cs

# 查看所有资源
kubectl get all --all-namespaces

# 查看节点详细信息
kubectl describe node <node-name>

# 查看Pod详细信息
kubectl describe pod <pod-name>

# 查看Pod日志
kubectl logs <pod-name>

# 进入Pod容器
kubectl exec -it <pod-name> -- /bin/bash

# 查看资源使用情况
kubectl top nodes
kubectl top pods

日志查看和调试

# 查看系统组件日志
journalctl -u kubelet -f

# 查看Docker日志
journalctl -u docker -f

# 查看cri-dockerd日志
journalctl -u cri-docker -f

集群维护命令

# 安全地排出节点上的Pod
kubectl drain <node-name> --ignore-daemonsets

# 标记节点不可调度
kubectl cordon <node-name>

# 标记节点可调度
kubectl uncordon <node-name>

# 删除节点
kubectl delete node <node-name>

文档版本: v1.0
更新时间: 2025年
适用版本: Kubernetes v1.28.0

posted @ 2025-12-18 15:04  怀恋小时候  阅读(13)  评论(0)    收藏  举报