1. Kubernetes 集群部署全流程解析
在容器编排领域,Kubernetes 已成为事实标准。最近在帮客户部署生产环境时,我重新梳理了从零搭建 K8s 集群的完整流程。不同于简单的单机测试环境,生产级部署需要考虑网络插件选型、高可用配置等实际问题。下面分享我的实操记录,重点说明安装过程中的关键决策点和避坑指南。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与依赖安装
2.1 系统要求与前置检查
推荐使用 Ubuntu 20.04 LTS 或 CentOS 8 作为基础系统,确保内核版本不低于 4.x。在每台节点执行以下检查项:
bash复制# 检查swap状态(必须关闭)
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
# 检查防火墙规则(生产环境需按需调整)
sudo ufw disable
# 或针对K8s端口放行
sudo ufw allow 6443/tcp
sudo ufw allow 2379-2380/tcp
关键提示:如果使用云服务器,还需在安全组中放行以下端口:6443 (API Server), 10250 (kubelet), 8472 (Flannel VXLAN) 等。
2.2 容器运行时安装
虽然Docker已不再是唯一选择,但在稳定性方面仍是我的首选。安装时需注意版本兼容性:
bash复制# Ubuntu示例
sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl enable --now docker
# 验证安装
docker run --rm hello-world
对于containerd用户,需要额外配置cgroup驱动:
bash复制cat <<EOF | sudo tee /etc/containerd/config.toml
version = 2
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
EOF
3. Kubernetes 组件安装与初始化
3.1 使用kubeadm部署控制平面
以下是在主节点上的初始化命令示例:
bash复制sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet=1.23.5-00 kubeadm=1.23.5-00 kubectl=1.23.5-00
sudo apt-mark hold kubelet kubeadm kubectl
# 关键初始化命令
sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.1.100 \
--control-plane-endpoint=cluster-endpoint:6443 \
--upload-certs
参数说明:
--pod-network-cidr:必须与后续安装的网络插件匹配--apiserver-advertise-address:指定API Server监听地址--control-plane-endpoint:高可用集群的负载均衡端点
3.2 工作节点加入集群
在主节点初始化完成后,会输出类似以下的加入命令:
bash复制kubeadm join 192.168.1.100:6443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1234...cdef
常见问题:如果token过期(默认24小时),可在主节点执行
kubeadm token create --print-join-command生成新命令。
4. 网络插件部署与验证
4.1 Flannel网络插件安装
执行以下命令部署Flannel(与初始化时指定的pod-network-cidr对应):
bash复制kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
验证安装:
bash复制kubectl get pods -n kube-system -l app=flannel
4.2 网络连通性测试
创建测试Pod验证跨节点通信:
bash复制# 创建测试Deployment
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: net-test
spec:
replicas: 2
selector:
matchLabels:
app: net-test
template:
metadata:
labels:
app: net-test
spec:
containers:
- name: busybox
image: busybox:1.28
command: ["sh", "-c", "while true; do sleep 3600; done"]
EOF
# 验证Pod分布
kubectl get pods -o wide
# 进入Pod测试网络
kubectl exec -it net-test-xxxxx -- ping net-test-yyyyy
5. 生产环境关键配置
5.1 高可用控制平面
对于生产环境,建议至少部署3个控制平面节点。初始化第一个节点后,在其他控制节点执行:
bash复制kubeadm join cluster-endpoint:6443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1234...cdef \
--control-plane \
--certificate-key xxxx...
5.2 网络插件性能调优
对于Flannel,可通过修改DaemonSet配置提升性能:
yaml复制# kube-flannel.yml部分配置
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan",
"DirectRouting": true,
"Port": 8472
}
}
6. 故障排查手册
6.1 常见错误与解决方案
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| kubelet无法启动 | cgroup驱动不匹配 | 检查docker/containerd配置中的SystemdCgroup参数 |
| Pod一直Pending | 网络插件未安装 | 检查kube-system命名空间下的网络插件Pod状态 |
| 节点NotReady | 容器运行时异常 | 执行journalctl -u kubelet查看详细日志 |
6.2 诊断命令速查
bash复制# 查看集群状态
kubectl get nodes -o wide
# 检查组件健康状态
kubectl get componentstatuses
# 查看事件日志
kubectl get events --sort-by='.metadata.creationTimestamp'
# 诊断网络问题
kubectl run -it --rm debug --image=nicolaka/netshoot --restart=Never
7. 性能优化实践
7.1 kubelet资源配置
在/var/lib/kubelet/config.yaml中添加:
yaml复制apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
evictionHard:
memory.available: "500Mi"
nodefs.available: "10%"
kubeReserved:
cpu: "500m"
memory: "500Mi"
systemReserved:
cpu: "500m"
memory: "500Mi"
7.2 内核参数调优
bash复制# /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
fs.inotify.max_user_watches = 1048576
vm.swappiness = 0
8. 版本升级策略
采用kubeadm的滚动升级方案:
bash复制# 主节点升级步骤
sudo apt-get update
sudo apt-get install -y kubeadm=1.24.0-00
sudo kubeadm upgrade plan
sudo kubeadm upgrade apply v1.24.0
# 工作节点升级
sudo apt-get update
sudo apt-get install -y kubelet=1.24.0-00 kubectl=1.24.0-00
sudo systemctl restart kubelet
9. 安全加固建议
9.1 RBAC基础配置
bash复制# 创建只读用户
kubectl create clusterrolebinding view-user \
--clusterrole=view \
--user=developer
9.2 Pod安全策略
yaml复制apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
spec:
privileged: false
allowPrivilegeEscalation: false
requiredDropCapabilities:
- ALL
volumes:
- 'configMap'
- 'emptyDir'
- 'secret'
10. 监控与日志方案
10.1 基础监控部署
bash复制# 安装Metrics Server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 验证
kubectl top nodes
10.2 日志收集架构
推荐使用Fluentd+Elasticsearch方案:
bash复制# 安装Elasticsearch
kubectl apply -f https://download.elastic.co/downloads/eck/2.3.0/crds.yaml
kubectl apply -f https://download.elastic.co/downloads/eck/2.3.0/operator.yaml
在部署生产环境时,我发现合理设置kubelet的--max-pods参数(默认110)能有效避免节点资源耗尽。对于内存密集型应用,建议将该值降低至50-80之间,同时配合Pod资源限制使用。
