作为一名长期奋战在云原生一线的工程师,我经历过无数次Kubernetes集群的部署与维护。今天要分享的是一套经过生产环境验证的标准安装流程,特别适合刚接触K8s的团队快速搭建开发测试环境。不同于官方文档的抽象描述,这里每个步骤都附带了我踩坑后总结的实战经验。
在生产环境中,我建议采用以下配置作为基准线(开发环境可适当降低):
| 节点类型 | vCPU | 内存 | 存储 | 数量 |
|---|---|---|---|---|
| Master | 4核 | 8GB | 100GB | 奇数台(3/5) |
| Worker | 8核 | 16GB | 200GB | 按需扩展 |
关键经验:Master节点必须保持奇数台以实现选举容错,小规模环境3台足够,大规模集群建议5台
CentOS 7作为最稳定的企业级Linux发行版,需要做以下关键配置:
bash复制# 关闭Swap(必须步骤)
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 禁用SELinux(避免权限问题)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
# 加载内核模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
# 设置内核参数
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
vm.swappiness = 0
EOF
sysctl --system
当前主流选择有Docker和containerd两种方案:
| 特性 | Docker | containerd |
|---|---|---|
| 资源占用 | 较高 | 较低 |
| 稳定性 | 良好 | 优秀 |
| K8s兼容性 | 1.20+版本逐步废弃 | 官方推荐 |
| 管理复杂度 | 简单 | 需要额外工具 |
这里选择containerd作为运行时(Kubernetes 1.24+默认):
bash复制# 安装containerd
yum install -y containerd.io
containerd config default > /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
systemctl enable --now containerd
# 配置crictl工具
cat <<EOF | sudo tee /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
使用阿里云镜像源加速安装:
bash复制cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
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
# 安装指定版本(生产环境建议锁定版本)
yum install -y kubelet-1.23.8 kubeadm-1.23.8 kubectl-1.23.8
systemctl enable --now kubelet
创建定制化的kubeadm配置文件:
yaml复制apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
nodeRegistration:
criSocket: unix:///run/containerd/containerd.sock
kubeletExtraArgs:
cgroup-driver: systemd
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.23.8
controlPlaneEndpoint: "192.168.1.80:6443"
networking:
podSubnet: "10.244.0.0/16"
serviceSubnet: "10.96.0.0/12"
imageRepository: registry.aliyuncs.com/google_containers
执行初始化命令(关键参数说明):
--upload-certs:自动分发证书--control-plane-endpoint:高可用入口--pod-network-cidr:匹配后续CNI插件bash复制kubeadm init --config=kubeadm-config.yaml
主流CNI插件性能对比:
| 插件 | 网络模式 | 性能 | 易用性 | 适用场景 |
|---|---|---|---|---|
| Flannel | Overlay | 中等 | 简单 | 中小集群 |
| Calico | BGP/Overlay | 高 | 复杂 | 生产环境 |
| Cilium | eBPF | 极高 | 中等 | 高性能需求 |
这里选择Calico作为网络插件:
bash复制kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
在Master节点获取加入命令:
bash复制kubeadm token create --print-join-command
在Worker节点执行输出命令,需包含以下关键参数:
--discovery-token-ca-cert-hash:证书指纹验证--node-labels:添加节点标签执行全面验证:
bash复制# 节点状态检查
kubectl get nodes -o wide
# 组件健康状态
kubectl get cs
# DNS测试
kubectl run -it --rm --restart=Never busybox --image=busybox -- nslookup kubernetes.default
# 网络连通性测试
kubectl run -it --rm --restart=Never testpod --image=alpine -- ping 10.244.1.1
修改kubeadm配置实现证书自动续期:
yaml复制apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
controllerManager:
extraArgs:
experimental-cluster-signing-duration: 87600h
feature-gates: RotateKubeletServerCertificate=true
scheduler:
extraArgs:
feature-gates: RotateKubeletServerCertificate=true
部署基础监控组件:
bash复制# 安装Metrics Server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 验证资源监控
kubectl top nodes
kubectl top pods -A
bash复制# 检查kubelet日志
journalctl -u kubelet -f
# 检查容器运行时状态
crictl ps -a
# 检查网络插件状态
kubectl get pods -n kube-system | grep flannel/calico
kubectl describe pod <pod-name>crictl pull <image>kubectl describe quotakubectl get networkpolicybash复制# /var/lib/kubelet/config.yaml
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
evictionHard:
memory.available: "500Mi"
nodefs.available: "10%"
kubeReserved:
cpu: "500m"
memory: "1Gi"
systemReserved:
cpu: "500m"
memory: "1Gi"
bash复制# /etc/sysctl.d/10-k8s-optimize.conf
net.core.somaxconn = 32768
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
fs.inotify.max_user_instances = 524288
fs.file-max = 2097152
经过这些优化配置,我们的Kubernetes集群已经具备生产级稳定性。在实际运维中,建议定期执行kubeadm upgrade进行版本升级,并通过etcd备份确保集群状态安全。对于有状态服务,还需要额外配置存储类和持久卷策略。