生产级K8s集群避坑指南:二进制安装中的20个关键检查点
·
生产级Kubernetes集群二进制安装深度避坑指南
1. 集群规划与系统准备
在构建生产级Kubernetes集群时,合理的规划是成功的第一步。以下是关键检查点:
1.1 节点角色划分
- 控制平面节点:建议至少3个master节点实现高可用
- 工作节点:根据业务负载需求确定数量
- 特殊节点:可考虑专用etcd节点或存储节点
1.2 系统要求检查表
| 检查项 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU核心 | 2核 | 4核+ |
| 内存 | 2GB | 8GB+ |
| 磁盘 | 20GB | 100GB+ |
| 操作系统 | CentOS 7.9+/Ubuntu 20.04+ | 最新稳定版 |
| 内核版本 | 4.19+ | 5.4+ |
1.3 网络规划要点
- Pod网络CIDR:确保不与现有网络冲突(如172.16.0.0/12)
- Service网络CIDR:通常使用10.96.0.0/12
- 节点网络:规划好物理网络拓扑
- 网络插件选择:Calico/Cilium等生产级方案
重要提示:生产环境务必避免使用重叠的IP地址空间,提前做好网络规划文档。
2. 系统配置关键检查点
2.1 内核参数调优
# 必须配置的内核参数
cat > /etc/sysctl.d/k8s.conf <<EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
EOF
sysctl --system
常见坑点:
- 未正确设置
nf_conntrack_max可能导致连接跟踪表满 vm.overcommit_memory配置不当可能引发OOM
2.2 资源限制调整
# 调整系统资源限制
cat >> /etc/security/limits.conf <<EOF
* soft nofile 655360
* hard nofile 131072
* soft nproc 655350
* hard nproc 655350
* soft memlock unlimited
* hard memlock unlimited
EOF
2.3 防火墙与SELinux
# 禁用防火墙(生产环境应根据实际情况配置规则)
systemctl disable --now firewalld
# SELinux配置
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
3. 证书管理关键实践
3.1 证书有效期管理
重要检查点:
- CA证书通常设置10年有效期
- 前端证书建议1年有效期
- kubelet证书采用自动轮换机制
# 检查证书过期时间
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates
3.2 证书备份策略
建议的备份目录结构:
/etc/kubernetes/
├── archive
│ ├── 2023-01-01
│ │ ├── apiserver.crt
│ │ └── apiserver.key
│ └── 2023-02-01
└── pki
├── current -> ../archive/2023-02-01
└── symlinks
4. 运行时选择与配置
4.1 Containerd vs Docker对比
| 特性 | Containerd | Docker |
|---|---|---|
| 性能 | 更高 | 中等 |
| 资源占用 | 更低 | 较高 |
| 稳定性 | 生产验证 | 生产验证 |
| 功能完整性 | 需要额外组件 | 完整套件 |
| Kubernetes集成 | 原生支持 | 需要适配 |
4.2 Containerd生产配置
# /etc/containerd/config.toml关键配置
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
[plugins."io.containerd.grpc.v1.cri".containerd]
snapshotter = "overlayfs"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
5. 高可用架构实现
5.1 负载均衡方案对比
方案一:HAProxy + Keepalived
# HAProxy关键配置示例
frontend k8s-api
bind *:9443
mode tcp
option tcplog
default_backend k8s-api-servers
backend k8s-api-servers
mode tcp
balance roundrobin
server k8s-master1 172.16.1.31:6443 check
server k8s-master2 172.16.1.32:6443 check
server k8s-master3 172.16.1.33:6443 check
方案二:Nginx反向代理
stream {
upstream kube_apiserver {
server 172.16.1.31:6443;
server 172.16.1.32:6443;
server 172.16.1.33:6443;
}
server {
listen 127.0.0.1:8443;
proxy_pass kube_apiserver;
}
}
5.2 etcd集群配置
# etcd关键配置参数
name: 'k8s-master01'
data-dir: /var/lib/etcd
listen-peer-urls: 'https://172.16.1.31:2380'
listen-client-urls: 'https://172.16.1.31:2379,http://127.0.0.1:2379'
initial-cluster: 'k8s-master01=https://172.16.1.31:2380,k8s-master02=https://172.16.1.32:2380,k8s-master03=https://172.16.1.33:2380'
initial-cluster-token: 'etcd-k8s-cluster'
6. 关键组件配置细节
6.1 kube-apiserver关键参数
# 必须关注的安全参数
--authorization-mode=Node,RBAC
--enable-admission-plugins=NodeRestriction
--service-account-key-file=/etc/kubernetes/pki/sa.pub
--service-account-signing-key-file=/etc/kubernetes/pki/sa.key
--service-account-issuer=https://kubernetes.default.svc.cluster.local
6.2 kubelet资源预留配置
# /etc/kubernetes/kubelet-conf.yml关键配置
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
evictionHard:
memory.available: "100Mi"
nodefs.available: "10%"
nodefs.inodesFree: "5%"
imagefs.available: "15%"
systemReserved:
cpu: "500m"
memory: "1Gi"
kubeReserved:
cpu: "500m"
memory: "1Gi"
7. 网络插件选择与配置
7.1 Calico生产配置
# 自定义资源定义
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
name: default
spec:
calicoNetwork:
ipPools:
- name: default-ipv4-ippool
cidr: 172.16.0.0/12
encapsulation: VXLANCrossSubnet
natOutgoing: Enabled
7.2 Cilium高级功能
# 启用Hubble网络观测
helm install cilium cilium/cilium \
--namespace kube-system \
--set hubble.relay.enabled=true \
--set hubble.ui.enabled=true
8. 存储方案实现
8.1 NFS动态供给配置
# StorageClass示例
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage
provisioner: cluster.local/nfs-subdir-external-provisioner
parameters:
archiveOnDelete: "false"
9. 监控与日志
9.1 关键监控指标
| 组件 | 关键指标 |
|---|---|
| API Server | 请求延迟、错误率 |
| etcd | 写入延迟、存储大小 |
| kubelet | Pod启动时间、运行时操作计数 |
| 节点 | CPU/Memory/Disk压力 |
9.2 日志收集建议
# 使用systemd journal的持久化配置
mkdir /var/log/journal
systemd-tmpfiles --create --prefix /var/log/journal
systemctl restart systemd-journald
10. 安全加固措施
10.1 Pod安全策略
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
spec:
privileged: false
allowPrivilegeEscalation: false
requiredDropCapabilities:
- ALL
volumes:
- 'configMap'
- 'emptyDir'
- 'projected'
- 'secret'
- 'downwardAPI'
- 'persistentVolumeClaim'
hostNetwork: false
hostIPC: false
hostPID: false
10.2 网络策略示例
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
11. 维护与排错
11.1 常见问题排查流程
-
API Server不可用:
- 检查kube-apiserver日志
- 验证etcd集群健康状态
- 检查网络连接和防火墙规则
-
Pod网络异常:
- 检查CNI插件日志
- 验证节点路由表
- 测试跨节点网络连通性
-
证书过期处理:
# 证书续期步骤 kubeadm certs renew all systemctl restart kubelet
11.2 关键日志位置
| 组件 | 日志位置 |
|---|---|
| kube-apiserver | journalctl -u kube-apiserver |
| kubelet | /var/log/messages 或 journalctl -u kubelet |
| containerd | journalctl -u containerd |
| 网络插件 | /var/log/calico/ 或 /var/log/cilium/ |
12. 升级与备份策略
12.1 集群升级路径
- 先升级kubeadm工具
- 逐个升级控制平面节点
- 最后升级工作节点
# 控制平面升级示例
kubeadm upgrade plan
kubeadm upgrade apply v1.28.0
12.2 关键数据备份
# etcd快照备份
ETCDCTL_API=3 etcdctl \
--endpoints=https://172.16.1.31:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /backup/etcd-snapshot.db
13. 性能优化建议
13.1 API Server调优
# 关键性能参数
--max-requests-inflight=1500
--max-mutating-requests-inflight=500
--watch-cache-sizes=1000
13.2 etcd性能优化
# etcd启动参数优化
--quota-backend-bytes=8589934592 # 8GB
--max-request-bytes=1572864 # 1.5MB
--snapshot-count=10000
14. 扩展功能集成
14.1 负载均衡器方案
# MetalLB Layer2配置
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: production
namespace: metallb-system
spec:
addresses:
- 172.16.1.100-172.16.1.150
14.2 Ingress控制器选择
Nginx Ingress生产配置:
controller:
config:
use-forwarded-headers: "true"
compute-full-forwarded-for: "true"
use-proxy-protocol: "true"
metrics:
enabled: true
replicaCount: 3
resources:
requests:
cpu: 100m
memory: 128Mi
15. 灾备与恢复
15.1 集群恢复流程
- 恢复etcd数据
- 恢复关键证书和kubeconfig
- 重建控制平面
- 加入工作节点
# etcd恢复示例
ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-snapshot.db \
--data-dir /var/lib/etcd-restore
15.2 关键配置备份清单
- /etc/kubernetes/pki/*
- /etc/kubernetes/*.conf
- /var/lib/kubelet/config.yaml
- /var/lib/etcd/
- 网络插件配置
16. 自动化与GitOps
16.1 集群配置即代码
# 使用kubectl和git管理配置
kubectl get all -A -o yaml > cluster-state.yaml
git add cluster-state.yaml
git commit -m "Cluster state snapshot"
16.2 自动化工具链
| 工具 | 用途 |
|---|---|
| Ansible | 节点配置管理 |
| Terraform | 基础设施编排 |
| ArgoCD | GitOps持续交付 |
| Flux | 配置同步 |
17. 合规与审计
17.1 安全审计配置
# 审计策略示例
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
resources:
- group: ""
resources: ["secrets", "configmaps"]
17.2 CIS基准检查
# 使用kube-bench检查
docker run --rm --pid=host -v /etc:/etc:ro -v /var:/var:ro aquasec/kube-bench:latest master
18. 成本优化
18.1 资源请求与限制
# Pod资源规范示例
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
18.2 集群自动伸缩
# Cluster Autoscaler配置示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: cluster-autoscaler
spec:
template:
spec:
containers:
- command:
- ./cluster-autoscaler
- --v=4
- --stderrthreshold=info
- --cloud-provider=aws
- --nodes=1:10:my-asg-name
19. 长期维护策略
19.1 组件版本管理
| 组件 | 版本策略 |
|---|---|
| Kubernetes | 保持N-2版本内 |
| etcd | 与K8s版本兼容矩阵匹配 |
| CNI插件 | 使用稳定版本 |
19.2 定期维护任务
- 每月检查证书有效期
- 季度安全补丁更新
- 年度大版本升级规划
- 持续监控资源使用趋势
20. 终极检查清单
在集群上线前,请逐一验证以下项目:
- [ ] 所有节点时间同步正常
- [ ] 证书有效期至少剩余90天
- [ ] 关键组件有多个副本
- [ ] 网络策略已正确配置
- [ ] 监控系统覆盖所有关键指标
- [ ] 备份方案经过验证
- [ ] 灾难恢复流程文档化
- [ ] 安全审计日志已启用
- [ ] 资源配额和限制已设置
- [ ] 文档完整且团队熟悉运维流程
通过以上20个关键检查点的详细配置和验证,您可以构建出一个稳定、安全且高性能的生产级Kubernetes集群。记住,生产环境的稳定性来自于严谨的规划和持续的维护,而不是偶然的运气。
更多推荐
所有评论(0)