1. Kubernetes v1.31.14 集群部署概述
Kubernetes作为当前容器编排领域的事实标准,其集群部署一直是运维和开发团队的核心技能。v1.31.14作为长期支持版本(LTS)的一个补丁更新,主要修复了之前版本中发现的关键安全漏洞和稳定性问题。这个版本特别适合需要稳定运行生产环境的企业用户。
在实际生产环境中,一个标准的Kubernetes集群通常包含以下核心组件:
- 控制平面(Control Plane):包括API Server、Controller Manager、Scheduler和etcd
- 工作节点(Worker Nodes):运行实际工作负载的机器
- 网络插件:如Calico、Flannel等
- 存储插件:根据业务需求选择
重要提示:生产环境部署前务必确认硬件资源满足最低要求,控制平面节点建议4核CPU/16GB内存起,工作节点根据业务负载调整
2. 部署前环境准备
2.1 系统要求检查
所有节点需要满足以下基本条件:
- 操作系统:Ubuntu 20.04+/CentOS 7+/RHEL 8+等主流Linux发行版
- 容器运行时:containerd 1.6+或Docker CE 20.10+
- 网络:节点间互通,禁用Swap
- 硬件:2GB以上内存,双核以上CPU
验证命令示例:
# 检查内存和Swap free -h # 检查CPU lscpu # 检查内核版本 uname -r2.2 基础环境配置
- 主机名解析:
sudo hostnamectl set-hostname <hostname> echo "<ip> <hostname>" | sudo tee -a /etc/hosts- 防火墙配置(以firewalld为例):
sudo systemctl stop firewalld sudo systemctl disable firewalld- SELinux禁用(如使用):
sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config3. 使用kubeadm部署集群
3.1 安装依赖组件
在所有节点执行:
# 添加Kubernetes仓库 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 # 安装kubelet/kubeadm/kubectl sudo apt-get update sudo apt-get install -y kubelet=1.31.14-00 kubeadm=1.31.14-00 kubectl=1.31.14-00 sudo apt-mark hold kubelet kubeadm kubectl3.2 初始化控制平面
在主节点执行:
sudo kubeadm init \ --kubernetes-version v1.31.14 \ --pod-network-cidr=10.244.0.0/16 \ --apiserver-advertise-address=<主节点IP> \ --upload-certs成功后会输出加入集群的命令,类似:
kubeadm join <control-plane-host>:<control-plane-port> --token <token> \ --discovery-token-ca-cert-hash sha256:<hash> \ --control-plane --certificate-key <key>3.3 配置kubectl
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config验证集群状态:
kubectl get nodes # 应看到主节点状态为NotReady(等待网络插件安装)4. 网络插件安装与配置
4.1 安装Calico网络插件
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml4.2 验证网络状态
watch kubectl get pods -n kube-system # 等待所有Pod变为Running状态 kubectl get nodes # 节点状态应变为Ready5. 工作节点加入集群
在每个工作节点执行初始化时输出的join命令:
sudo kubeadm join <control-plane-host>:<control-plane-port> --token <token> \ --discovery-token-ca-cert-hash sha256:<hash>验证节点加入:
kubectl get nodes # 应看到所有节点状态为Ready6. 集群验证与测试
6.1 基础功能测试
部署测试应用:
kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=NodePort kubectl get svc nginx访问测试:
curl http://<任意节点IP>:<NodePort>6.2 核心组件健康检查
kubectl get componentstatus # 所有组件应显示Healthy7. 生产环境关键配置
7.1 证书自动续期配置
编辑kubeadm-config:
kubectl -n kube-system edit cm kubeadm-config添加:
apiServer: extraArgs: feature-gates: "RotateKubeletServerCertificate=true" controllerManager: extraArgs: feature-gates: "RotateKubeletServerCertificate=true" cluster-signing-duration: 87600h0m0s7.2 资源配额与限制
示例命名空间配置:
apiVersion: v1 kind: ResourceQuota metadata: name: compute-resources spec: hard: requests.cpu: "20" requests.memory: 100Gi limits.cpu: "40" limits.memory: 200Gi8. 常见问题排查
8.1 节点NotReady状态排查
- 检查kubelet状态:
systemctl status kubelet journalctl -xeu kubelet- 检查网络插件:
kubectl get pods -n kube-system kubectl logs <网络插件pod名称> -n kube-system8.2 Pod创建失败排查
- 查看Pod事件:
kubectl describe pod <pod名称>- 检查资源配额:
kubectl describe quota9. 集群维护与升级
9.1 版本升级准备
- 备份关键数据:
# etcd备份 sudo docker run --rm -v /var/lib/etcd:/var/lib/etcd \ -v $(pwd):/backup \ --network host \ k8s.gcr.io/etcd:3.5.6-0 \ etcdctl snapshot save /backup/etcd-snapshot-$(date +%Y%m%d).db9.2 控制平面升级
sudo apt-get update sudo apt-get install -y kubeadm=1.31.14-00 sudo kubeadm upgrade plan sudo kubeadm upgrade apply v1.31.14 sudo apt-get install -y kubelet=1.31.14-00 kubectl=1.31.14-00 sudo systemctl restart kubelet10. 安全加固建议
- RBAC配置:
kubectl apply -f - <<EOF apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: restricted-user rules: - apiGroups: [""] resources: ["pods", "pods/log"] verbs: ["get", "list", "watch"] EOF- 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 runAsUser: rule: 'MustRunAsNonRoot' seLinux: rule: 'RunAsAny' supplementalGroups: rule: 'MustRunAs' ranges: - min: 1 max: 65535 fsGroup: rule: 'MustRunAs' ranges: - min: 1 max: 6553511. 监控与日志方案
11.1 基础监控部署
# 部署Metrics Server kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml验证:
kubectl top nodes kubectl top pods11.2 日志收集方案
使用Fluentd+Elasticsearch:
kubectl apply -f https://raw.githubusercontent.com/fluent/fluentd-kubernetes-daemonset/master/fluentd-daemonset-elasticsearch.yaml12. 存储方案配置
12.1 本地存储配置
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer12.2 NFS存储配置
# 安装NFS客户端工具 sudo apt-get install -y nfs-common创建StorageClass:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-storage provisioner: k8s-sigs.io/nfs-subdir-external-provisioner parameters: archiveOnDelete: "false"13. 高可用方案实现
13.1 控制平面高可用
使用kubeadm配置:
sudo kubeadm init \ --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" \ --upload-certs \ --pod-network-cidr=10.244.0.0/1613.2 etcd集群配置
独立etcd集群示例:
apiVersion: etcd.database.coreos.com/v1beta2 kind: EtcdCluster metadata: name: etcd-cluster spec: size: 3 version: "3.5.6" pod: etcdEnv: - name: ETCD_QUOTA_BACKEND_BYTES value: "8589934592" # 8GB resources: requests: cpu: 1000m memory: 1Gi14. 性能调优指南
14.1 kubelet参数优化
sudo vi /etc/default/kubelet添加:
KUBELET_EXTRA_ARGS="--max-pods=110 --kube-api-qps=100 --kube-api-burst=100"14.2 内核参数调优
# 增加连接跟踪表大小 echo "net.netfilter.nf_conntrack_max=1048576" | sudo tee -a /etc/sysctl.conf # 增加文件描述符限制 echo "fs.file-max=2097152" | sudo tee -a /etc/sysctl.conf sudo sysctl -p15. 备份与恢复策略
15.1 完整集群备份
# 备份所有资源 kubectl get all --all-namespaces -o yaml > all-resources.yaml # 备份etcd 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.db15.2 灾难恢复步骤
- 恢复etcd:
ETCDCTL_API=3 etcdctl snapshot restore snapshot.db \ --data-dir /var/lib/etcd-restore- 重建控制平面:
sudo kubeadm init --skip-phases=etcd \ --ignore-preflight-errors=DirAvailable--var-lib-etcd