最近在帮客户部署一套生产级Kubernetes集群,选用了官方推荐的kubeadm工具安装最新的v1.30.3版本。kubeadm作为CNCF官方维护的集群引导工具,经过多年迭代已经非常成熟稳定。相比手动部署,它能自动处理证书生成、配置验证等复杂流程,特别适合需要快速搭建符合生产标准的K8s环境。
这次安装的是当前最新的稳定版v1.30.3,包含了最近合并的CVE补丁和调度器优化。下面我会完整记录从环境准备到集群初始化的全流程,重点说明几个关键配置项的优化原理,以及我在实际部署中遇到的典型问题解决方案。
生产环境建议至少准备3台节点(1 master + 2 worker),配置参考:
注意:所有节点需要时间同步(chrony/NTP)和唯一hostname,否则kubeadm init会报错
编辑/etc/sysctl.conf添加:
bash复制# 避免swap影响kubelet
vm.swappiness = 0
# 提升连接跟踪表大小
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.tcp_tw_reuse = 1
# 容器网络需要
fs.inotify.max_user_watches = 1048576
执行sysctl -p生效。这些参数主要解决容器网络转发、文件监控限制等问题。
v1.30.3默认仍使用docker作为运行时(containerd需额外配置),安装后需要修改daemon.json:
json复制{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
关键点是将cgroup驱动改为systemd以匹配kubelet,否则启动时会报cgroup不一致错误。
在所有节点执行:
bash复制# 添加K8s源
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list
# 安装三件套
apt-get update && apt-get install -y kubelet=1.30.3-00 kubeadm=1.30.3-00 kubectl=1.30.3-00
使用自定义配置文件init-config.yaml:
yaml复制apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
nodeRegistration:
criSocket: "unix:///var/run/dockershim.sock"
kubeletExtraArgs:
cgroup-driver: "systemd"
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: "1.30.3"
controlPlaneEndpoint: "LOAD_BALANCER_DNS:6443"
networking:
podSubnet: "10.244.0.0/16"
serviceSubnet: "10.96.0.0/12"
apiServer:
extraArgs:
advertise-address: "MASTER_IP"
执行初始化:
bash复制kubeadm init --config=init-config.yaml --upload-certs
关键参数说明:
controlPlaneEndpoint: 高可用必填,指向负载均衡器podSubnet: 需要与后续安装的CNI插件匹配upload-certs: 自动分发证书到其他master节点初始化完成后会输出join命令,形式如下:
bash复制kubeadm join 10.0.0.1:6443 --token xxxx \
--discovery-token-ca-cert-hash sha256:xxxx
如果token过期(默认24h),可在master上重新生成:
bash复制kubeadm token create --print-join-command
下载flannel的kube-flannel.yml后,需要确认网段与init-config.yaml中的podSubnet一致:
bash复制kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
v1.30.3默认已包含CoreDNS,检查状态:
bash复制kubectl get pods -n kube-system -l k8s-app=kube-dns
如果需要自定义配置,可以编辑configmap:
bash复制kubectl edit configmap coredns -n kube-system
kubeadm默认证书有效期为1年,启用自动续期:
bash复制kubeadm alpha certs renew all
# 并修改kube-controller-manager配置
kubectl edit deploy -n kube-system kube-controller-manager
# 添加 --experimental-cluster-signing-duration=87600h
多master节点需要:
kubeadm join时添加--control-plane参数bash复制kubectl get pods -n kube-system -l component=etcd
典型错误:
code复制failed to load Kubelet config file /var/lib/kubelet/config.yaml
解决方法:
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf中的配置路径可能原因:
bash复制kubectl logs -n kube-system coredns-xxxx
kubectl describe pod -n kube-system coredns-xxxx
检查方向:
bash复制journalctl -u kubelet -f
创建测试pod:
bash复制kubectl run nginx --image=nginx --restart=Never
kubectl expose pod nginx --port=80
检查服务发现和网络连通性。
使用kubemark工具模拟负载:
bash复制kubectl create -f https://k8s.io/examples/application/nginx-rs.yaml
kubectl scale --replicas=100 rs/nginx
观察调度器性能和节点资源使用情况。
kubeadm支持跨版本升级,但建议逐步进行:
1.30.x → 1.31.x → 1.32.x
升级命令:
bash复制kubeadm upgrade plan
kubeadm upgrade apply v1.31.0
建议监控:
配置示例:
bash复制kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
kubectl top nodes
创建自定义ServiceAccount:
yaml复制apiVersion: v1
kind: ServiceAccount
metadata:
name: limited-user
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
启用PSP(需API Server开启对应feature gate):
yaml复制apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
spec:
privileged: false
runAsUser:
rule: 'MustRunAsNonRoot'
手动备份:
bash复制ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save snapshot.db
关键文件包括:
建议使用velero进行应用级备份:
bash复制velero install --provider aws --plugins velero/velero-plugin-for-aws:v1.0.0 \
--bucket my-backup --secret-file ./credentials-velero