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节点的内网IPimage-repository:指定阿里云镜像仓库地址(国内无法访问k8s.gcr.io)kubernetes-version:K8s版本,与上面安装的软件版本一致service-cidr:集群Service网段pod-network-cidr:集群Pod网段cri-socket:指定cri-socket接口,使用unix:///var/run/cri-dockerd.sockignore-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无法安装成功,可能是由于镜像无法拉取:
解决方案:
- 使用离线镜像包
- 下载后在每个节点上导入镜像:
ls *.tar |xargs -i docker load -i {}
- 重新部署:
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,可以检查以下几点:
- 检查kubelet服务状态:
systemctl status kubelet
journalctl -u kubelet -n 100
- 检查网络插件是否正常:
kubectl get pods -n kube-system
- 检查节点资源使用情况:
kubectl describe node <node-name>
6.6 Pod无法启动
当Pod无法正常启动时,可以按以下步骤排查:
- 查看Pod状态和事件:
kubectl describe pod <pod-name>
- 查看Pod日志:
kubectl logs <pod-name>
- 检查资源配额:
kubectl get resourcequota
总结
通过以上步骤,我们成功搭建了一套3台服务器的K8s集群。在整个搭建过程中,需要注意以下几个关键点:
- 环境准备:确保所有服务器的硬件和系统配置符合要求
- 系统配置:正确关闭防火墙、SELinux和Swap分区
- 时间同步:确保所有服务器时间一致
- 软件安装:正确安装Docker、cri-dockerd和K8s相关组件
- 网络配置:配置正确的网络参数,确保容器间通信正常
- 初始化顺序:先初始化Master节点,再加入Worker节点
- 网络插件:部署Calico网络插件,确保集群内部网络通信
成功搭建K8s集群后,可以开始部署各种应用和服务,享受容器化部署带来的便利。
最佳实践和建议
安全加固
- 使用RBAC授权:启用基于角色的访问控制
- 定期更新:及时应用安全补丁和版本升级
- 网络策略:使用网络策略限制Pod间的通信
- 资源限制:为容器设置资源请求和限制
性能优化
- 节点标签:合理使用节点标签进行调度
- 污点和容忍:使用污点和容忍机制控制Pod调度
- 监控和日志:部署监控和日志收集系统
备份和恢复
- etcd备份:定期备份etcd数据
- 资源配置备份:备份重要的资源配置文件
扩展阅读
附录:常用命令和技巧
常用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

浙公网安备 33010602011771号