活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

企业级K8s容器云平台搭建全流程详解从环境准备到集群部署再到应用管理的完整实践指南与常见问题解决方案

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-18 14:30:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

Kubernetes(简称K8s)作为目前最流行的容器编排系统,已经成为企业构建云原生应用的标准平台。它提供了自动化部署、扩展和管理容器化应用程序的能力,极大地简化了微服务架构下的运维工作。本文将详细介绍如何从零开始搭建一个企业级的Kubernetes容器云平台,包括环境准备、集群部署和应用管理的全流程,并提供常见问题的解决方案,帮助读者构建一个高可用、安全、可扩展的生产级K8s环境。

环境准备

硬件规划

在搭建企业级K8s集群之前,首先需要进行合理的硬件规划。根据企业规模和业务需求,硬件配置会有所不同,但以下是一些基本建议:

控制平面节点(Master节点):

• CPU:至少4核,建议8核或以上
• 内存:至少8GB,建议16GB或以上
• 存储:至少100GB SSD,建议使用高性能SSD
• 网络:千兆以太网或更高速率

工作节点(Worker节点):

• CPU:至少2核,建议4核或以上
• 内存:至少4GB,建议8GB或以上
• 存储:至少100GB,根据容器镜像和存储需求调整
• 网络:千兆以太网或更高速率

高可用性考虑:

• 控制平面节点至少3个,避免单点故障
• 工作节点根据业务需求扩展,通常至少3个
• 考虑使用负载均衡器分发API服务器请求

软件依赖

在开始安装之前,需要确保所有节点满足以下软件依赖:

操作系统:

• 推荐使用稳定的Linux发行版,如Ubuntu 20.04/22.04 LTS、CentOS 7/8、RHEL 7/8等
• 确保系统已更新到最新补丁级别

容器运行时:

• Docker(推荐版本19.03或以上)
• containerd(推荐版本1.4.0或以上)
• CRI-O(推荐版本1.20或以上)

其他软件包:

• conntrack
• socat
• ebtables
• ipset
• curl
• wget
• git

以下是在Ubuntu系统上安装依赖的示例代码:
  1. # 更新系统包
  2. sudo apt update && sudo apt upgrade -y
  3. # 安装基础软件包
  4. sudo apt install -y apt-transport-https ca-certificates curl software-properties-common conntrack socat ebtables ipset wget git
  5. # 安装Docker(以Ubuntu为例)
  6. # 添加Docker官方GPG密钥
  7. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  8. # 添加Docker仓库
  9. sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  10. # 安装Docker
  11. sudo apt update
  12. sudo apt install -y docker-ce docker-ce-cli containerd.io
  13. # 配置Docker
  14. sudo mkdir -p /etc/docker
  15. cat <<EOF | sudo tee /etc/docker/daemon.json
  16. {
  17.   "exec-opts": ["native.cgroupdriver=systemd"],
  18.   "log-driver": "json-file",
  19.   "log-opts": {
  20.     "max-size": "100m"
  21.   },
  22.   "storage-driver": "overlay2"
  23. }
  24. EOF
  25. # 重启Docker
  26. sudo systemctl enable docker
  27. sudo systemctl daemon-reload
  28. sudo systemctl restart docker
  29. # 将当前用户添加到docker组
  30. sudo usermod -aG docker $USER
  31. # 重新登录以使组更改生效
复制代码

网络规划

网络是Kubernetes集群中的关键部分,需要仔细规划:

节点网络:

• 为每个节点分配静态IP地址
• 确保节点之间可以相互通信
• 规划好子网划分,避免IP冲突

Pod网络:

• 选择合适的Pod网络CIDR,如10.244.0.0/16
• 选择网络插件,如Calico、Flannel、Weave Net等

服务网络:

• 规划Service CIDR,如10.96.0.0/12
• 考虑使用Ingress控制器暴露服务

以下是一个网络规划示例:
  1. # 网络规划示例
  2. 节点网络: 192.168.1.0/24
  3.   - master-01: 192.168.1.10
  4.   - master-02: 192.168.1.11
  5.   - master-03: 192.168.1.12
  6.   - worker-01: 192.168.1.20
  7.   - worker-02: 192.168.1.21
  8.   - worker-03: 192.168.1.22
  9.   - lb: 192.168.1.30 (负载均衡器)
  10. Pod网络: 10.244.0.0/16
  11. Service网络: 10.96.0.0/12
复制代码

主机名和DNS配置

为了确保集群中的节点能够正确识别彼此,需要配置主机名和DNS解析:
  1. # 设置主机名(在每个节点上执行)
  2. sudo hostnamectl set-hostname master-01  # 在第一个主节点上
  3. sudo hostnamectl set-hostname master-02  # 在第二个主节点上
  4. sudo hostnamectl set-hostname master-03  # 在第三个主节点上
  5. sudo hostnamectl set-hostname worker-01  # 在第一个工作节点上
  6. sudo hostnamectl set-hostname worker-02  # 在第二个工作节点上
  7. sudo hostnamectl set-hostname worker-03  # 在第三个工作节点上
  8. # 编辑/etc/hosts文件,添加所有节点的解析
  9. cat <<EOF | sudo tee -a /etc/hosts
  10. 192.168.1.10   master-01
  11. 192.168.1.11   master-02
  12. 192.168.1.12   master-03
  13. 192.168.1.20   worker-01
  14. 192.168.1.21   worker-02
  15. 192.168.1.22   worker-03
  16. 192.168.1.30   lb
  17. EOF
复制代码

系统配置

在安装Kubernetes之前,还需要进行一些系统级别的配置:
  1. # 禁用swap
  2. sudo swapoff -a
  3. sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
  4. # 配置内核参数
  5. cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
  6. br_netfilter
  7. EOF
  8. cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
  9. net.bridge.bridge-nf-call-ip6tables = 1
  10. net.bridge.bridge-nf-call-iptables = 1
  11. net.ipv4.ip_forward = 1
  12. EOF
  13. sudo sysctl --system
  14. # 加载内核模块
  15. sudo modprobe br_netfilter
  16. # 安装kubeadm, kubelet和kubectl
  17. # 添加Kubernetes官方GPG密钥
  18. curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
  19. # 添加Kubernetes仓库
  20. cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
  21. deb https://apt.kubernetes.io/ kubernetes-xenial main
  22. EOF
  23. # 更新包列表并安装
  24. sudo apt update
  25. sudo apt install -y kubelet kubeadm kubectl
  26. sudo apt-mark hold kubelet kubeadm kubectl
  27. # 启动kubelet
  28. sudo systemctl enable kubelet
  29. sudo systemctl start kubelet
复制代码

集群部署

初始化控制平面

在第一个主节点上初始化Kubernetes控制平面:
  1. # 初始化控制平面(在第一个主节点master-01上执行)
  2. sudo kubeadm init --control-plane-endpoint "lb:6443" \
  3.   --upload-certs \
  4.   --pod-network-cidr=10.244.0.0/16 \
  5.   --service-cidr=10.96.0.0/12 \
  6.   --apiserver-advertise-address=192.168.1.10
复制代码

初始化完成后,会显示加入集群的命令和证书密钥,请妥善保存这些信息。

配置kubectl:
  1. # 配置kubectl(在第一个主节点上)
  2. mkdir -p $HOME/.kube
  3. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  4. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  5. # 验证集群状态
  6. kubectl get nodes
复制代码

部署网络插件

选择并部署一个网络插件,这里以Calico为例:
  1. # 安装Calico网络插件
  2. kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
  3. # 等待Calico部署完成
  4. kubectl get pods -n kube-system
复制代码

加入其他控制平面节点

使用之前保存的命令加入其他控制平面节点:
  1. # 在master-02和master-03上执行
  2. sudo kubeadm join lb:6443 --token <token> \
  3.   --discovery-token-ca-cert-hash sha256:<hash> \
  4.   --control-plane --certificate-key <certificate-key>
复制代码

加入工作节点

使用之前保存的命令加入工作节点:
  1. # 在所有工作节点上执行
  2. sudo kubeadm join lb:6443 --token <token> \
  3.   --discovery-token-ca-cert-hash sha256:<hash>
复制代码

验证集群状态
  1. # 查看所有节点状态
  2. kubectl get nodes
  3. # 查看所有系统组件状态
  4. kubectl get pods -n kube-system
  5. # 查看集群信息
  6. kubectl cluster-info
复制代码

配置负载均衡器

为了实现API服务器的高可用,需要配置负载均衡器。可以使用Nginx、HAProxy或云服务商提供的负载均衡器。以下是一个使用Nginx的示例:
  1. # 安装Nginx(在负载均衡器节点上)
  2. sudo apt install -y nginx
  3. # 配置Nginx
  4. cat <<EOF | sudo tee /etc/nginx/nginx.conf
  5. user nginx;
  6. worker_processes auto;
  7. error_log /var/log/nginx/error.log;
  8. pid /run/nginx.pid;
  9. events {
  10.     worker_connections 1024;
  11. }
  12. stream {
  13.     upstream kubernetes_api_servers {
  14.         server 192.168.1.10:6443;
  15.         server 192.168.1.11:6443;
  16.         server 192.168.1.12:6443;
  17.     }
  18.     server {
  19.         listen 6443;
  20.         proxy_pass kubernetes_api_servers;
  21.         proxy_timeout 30s;
  22.         proxy_connect_timeout 5s;
  23.     }
  24. }
  25. EOF
  26. # 启动Nginx
  27. sudo systemctl enable nginx
  28. sudo systemctl start nginx
复制代码

安装附加组件

Helm是Kubernetes的包管理器,可以简化应用的部署和管理:
  1. # 下载Helm安装脚本
  2. curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
  3. # 验证安装
  4. helm version
复制代码

Metrics Server用于收集和提供资源使用指标:
  1. # 安装Metrics Server
  2. kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
  3. # 验证安装
  4. kubectl top nodes
复制代码

Kubernetes Dashboard是一个基于Web的UI,用于管理集群:
  1. # 安装Dashboard
  2. kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml
  3. # 创建服务账户和集群角色绑定
  4. cat <<EOF | kubectl apply -f -
  5. apiVersion: v1
  6. kind: ServiceAccount
  7. metadata:
  8.   name: admin-user
  9.   namespace: kubernetes-dashboard
  10. ---
  11. apiVersion: rbac.authorization.k8s.io/v1
  12. kind: ClusterRoleBinding
  13. metadata:
  14.   name: admin-user
  15. roleRef:
  16.   apiGroup: rbac.authorization.k8s.io
  17.   kind: ClusterRole
  18.   name: cluster-admin
  19. subjects:
  20. - kind: ServiceAccount
  21.   name: admin-user
  22.   namespace: kubernetes-dashboard
  23. EOF
  24. # 获取访问令牌
  25. kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
  26. # 启动代理访问Dashboard
  27. kubectl proxy
复制代码

Ingress控制器用于管理外部访问服务的规则:
  1. # 安装Nginx Ingress控制器
  2. kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.1/deploy/static/provider/cloud/deploy.yaml
  3. # 验证安装
  4. kubectl get pods -n ingress-nginx
复制代码

应用管理

部署应用

创建一个简单的Nginx部署示例:
  1. # nginx-deployment.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5.   name: nginx-deployment
  6.   labels:
  7.     app: nginx
  8. spec:
  9.   replicas: 3
  10.   selector:
  11.     matchLabels:
  12.       app: nginx
  13.   template:
  14.     metadata:
  15.       labels:
  16.         app: nginx
  17.     spec:
  18.       containers:
  19.       - name: nginx
  20.         image: nginx:1.21
  21.         ports:
  22.         - containerPort: 80
  23.         resources:
  24.           requests:
  25.             memory: "64Mi"
  26.             cpu: "250m"
  27.           limits:
  28.             memory: "128Mi"
  29.             cpu: "500m"
  30. ---
  31. apiVersion: v1
  32. kind: Service
  33. metadata:
  34.   name: nginx-service
  35. spec:
  36.   selector:
  37.     app: nginx
  38.   ports:
  39.     - protocol: TCP
  40.       port: 80
  41.       targetPort: 80
  42.   type: ClusterIP
复制代码

部署应用:
  1. # 部署应用
  2. kubectl apply -f nginx-deployment.yaml
  3. # 查看部署状态
  4. kubectl get deployment,pod,svc
复制代码

使用Helm部署应用更加灵活和可管理:
  1. # 添加Helm仓库
  2. helm repo add bitnami https://charts.bitnami.com/bitnami
  3. # 搜索应用
  4. helm search repo bitnami/wordpress
  5. # 安装应用
  6. helm install my-wordpress bitnami/wordpress
  7. # 查看发布状态
  8. helm list
复制代码

配置管理

ConfigMap用于存储非机密的配置数据:
  1. # game-config.yaml
  2. apiVersion: v1
  3. kind: ConfigMap
  4. metadata:
  5.   name: game-config
  6. data:
  7.   # 类属性键;每一个键都映射到一个简单的值
  8.   player_initial_lives: "3"
  9.   ui_properties_file_name: "user-interface.properties"
  10.   # 类文件键
  11.   game.properties: |
  12.     enemy.types=aliens,monsters
  13.     player.maximum.lives=5   
  14.     enemy.allowed.maxiumum=4
  15.    
  16.   user-interface.properties: |
  17.     color.good=purple
  18.     color.bad=yellow
  19.     allow.textmode=true
复制代码

应用ConfigMap:
  1. # 创建ConfigMap
  2. kubectl apply -f game-config.yaml
  3. # 查看ConfigMap
  4. kubectl get configmap game-config -o yaml
复制代码

Secret用于存储敏感数据,如密码、令牌等:
  1. # mysql-secret.yaml
  2. apiVersion: v1
  3. kind: Secret
  4. metadata:
  5.   name: mysql-secret
  6. type: Opaque
  7. data:
  8.   # 需要使用base64编码的值
  9.   # echo -n "password" | base64
  10.   mysql-root-password: cGFzc3dvcmQ=
  11.   mysql-user-password: dXNlci1wYXNzd29yZA==
复制代码

应用Secret:
  1. # 创建Secret
  2. kubectl apply -f mysql-secret.yaml
  3. # 查看Secret
  4. kubectl get secret mysql-secret -o yaml
复制代码

存储管理

持久卷(PV)是集群中的一块存储,由管理员配置或使用存储类动态配置:
  1. # pv.yaml
  2. apiVersion: v1
  3. kind: PersistentVolume
  4. metadata:
  5.   name: pv-example
  6. spec:
  7.   capacity:
  8.     storage: 10Gi
  9.   volumeMode: Filesystem
  10.   accessModes:
  11.     - ReadWriteOnce
  12.   persistentVolumeReclaimPolicy: Retain
  13.   storageClassName: fast
  14.   mountOptions:
  15.     - hard
  16.     - nfsvers=4.1
  17.   nfs:
  18.     path: /data
  19.     server: nfs-server.example.com
复制代码

持久卷声明(PVC)是用户对存储的请求:
  1. # pvc.yaml
  2. apiVersion: v1
  3. kind: PersistentVolumeClaim
  4. metadata:
  5.   name: pvc-example
  6. spec:
  7.   accessModes:
  8.     - ReadWriteOnce
  9.   volumeMode: Filesystem
  10.   resources:
  11.     requests:
  12.       storage: 8Gi
  13.   storageClassName: fast
复制代码

存储类为管理员提供了描述存储”类”的方法:
  1. # storageclass.yaml
  2. apiVersion: storage.k8s.io/v1
  3. kind: StorageClass
  4. metadata:
  5.   name: fast
  6. provisioner: kubernetes.io/gce-pd
  7. parameters:
  8.   type: pd-ssd
  9. reclaimPolicy: Retain
  10. allowVolumeExpansion: true
  11. mountOptions:
  12.   - debug
  13. volumeBindingMode: Immediate
复制代码

应用扩缩容
  1. # 扩容部署
  2. kubectl scale deployment nginx-deployment --replicas=5
  3. # 缩容部署
  4. kubectl scale deployment nginx-deployment --replicas=2
复制代码

水平Pod自动扩缩容(HPA)根据CPU使用率或其他指标自动调整Pod数量:
  1. # hpa.yaml
  2. apiVersion: autoscaling/v2
  3. kind: HorizontalPodAutoscaler
  4. metadata:
  5.   name: nginx-hpa
  6. spec:
  7.   scaleTargetRef:
  8.     apiVersion: apps/v1
  9.     kind: Deployment
  10.     name: nginx-deployment
  11.   minReplicas: 2
  12.   maxReplicas: 10
  13.   metrics:
  14.   - type: Resource
  15.     resource:
  16.       name: cpu
  17.       target:
  18.         type: Utilization
  19.         averageUtilization: 50
  20.   - type: Resource
  21.     resource:
  22.       name: memory
  23.       target:
  24.         type: Utilization
  25.         averageUtilization: 70
复制代码

应用HPA:
  1. # 创建HPA
  2. kubectl apply -f hpa.yaml
  3. # 查看HPA状态
  4. kubectl get hpa
复制代码

滚动更新和回滚
  1. # 更新部署的镜像版本
  2. kubectl set image deployment/nginx-deployment nginx=nginx:1.22
  3. # 查看更新状态
  4. kubectl rollout status deployment/nginx-deployment
  5. # 查看更新历史
  6. kubectl rollout history deployment/nginx-deployment
复制代码
  1. # 回滚到上一个版本
  2. kubectl rollout undo deployment/nginx-deployment
  3. # 回滚到指定版本
  4. kubectl rollout undo deployment/nginx-deployment --to-revision=2
复制代码

健康检查

存活探针用于确定容器是否正在运行:
  1. # liveness-probe.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5.   name: liveness-app
  6. spec:
  7.   replicas: 1
  8.   selector:
  9.     matchLabels:
  10.       app: liveness
  11.   template:
  12.     metadata:
  13.       labels:
  14.         app: liveness
  15.     spec:
  16.       containers:
  17.       - name: liveness
  18.         image: busybox
  19.         args:
  20.         - /bin/sh
  21.         - -c
  22.         - touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
  23.         livenessProbe:
  24.           exec:
  25.             command:
  26.             - cat
  27.             - /tmp/healthy
  28.           initialDelaySeconds: 5
  29.           periodSeconds: 5
复制代码

就绪探针用于确定容器是否准备好接收流量:
  1. # readiness-probe.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5.   name: readiness-app
  6. spec:
  7.   replicas: 1
  8.   selector:
  9.     matchLabels:
  10.       app: readiness
  11.   template:
  12.     metadata:
  13.       labels:
  14.         app: readiness
  15.     spec:
  16.       containers:
  17.       - name: readiness
  18.         image: nginx:1.21
  19.         ports:
  20.         - containerPort: 80
  21.         readinessProbe:
  22.           httpGet:
  23.             path: /
  24.             port: 80
  25.           initialDelaySeconds: 5
  26.           periodSeconds: 10
复制代码

日志和监控
  1. # 查看Pod日志
  2. kubectl logs <pod-name>
  3. # 查看前一个容器的日志
  4. kubectl logs <pod-name> --previous
  5. # 跟踪日志
  6. kubectl logs -f <pod-name>
  7. # 查看指定容器的日志
  8. kubectl logs <pod-name> -c <container-name>
复制代码
  1. # 使用Helm安装Prometheus Operator
  2. helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
  3. helm repo update
  4. # 创建命名空间
  5. kubectl create namespace monitoring
  6. # 安装Prometheus Operator
  7. helm install prometheus prometheus-community/kube-prometheus-stack -n monitoring
  8. # 验证安装
  9. kubectl get pods -n monitoring
  10. # 获取Grafana密码
  11. kubectl get secret --namespace monitoring prometheus-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
复制代码

常见问题解决方案

节点NotReady问题

问题现象:节点状态显示为NotReady。

可能原因:

1. 网络插件未正确安装或配置
2. kubelet服务未运行
3. 系统资源不足
4. 防火墙阻止了节点间的通信

解决方案:
  1. # 检查kubelet状态
  2. sudo systemctl status kubelet
  3. # 如果kubelet未运行,启动它
  4. sudo systemctl start kubelet
  5. # 检查系统日志
  6. journalctl -u kubelet
  7. # 检查网络插件状态
  8. kubectl get pods -n kube-system | grep -E 'calico|flannel|weave'
  9. # 如果网络插件有问题,重新安装
  10. kubectl delete -f <network-plugin-yaml-file>
  11. kubectl apply -f <network-plugin-yaml-file>
  12. # 检查防火墙设置
  13. sudo ufw status
  14. sudo iptables -L
  15. # 如果需要,开放必要的端口
  16. sudo ufw allow 6443/tcp
  17. sudo ufw allow 10250/tcp
  18. sudo ufw allow 30000:32767/tcp
复制代码

Pod处于Pending状态

问题现象:Pod长时间处于Pending状态。

可能原因:

1. 集群资源不足
2. 节点存在污点(Taints)导致Pod无法调度
3. PVC未绑定
4. 调度器问题

解决方案:
  1. # 查看Pod详细信息
  2. kubectl describe pod <pod-name>
  3. # 检查事件部分以获取更多信息
  4. kubectl get events --sort-by=.metadata.creationTimestamp
  5. # 检查节点资源使用情况
  6. kubectl top nodes
  7. # 如果资源不足,考虑添加更多节点或调整资源请求
  8. kubectl describe node <node-name>
  9. # 检查节点污点
  10. kubectl describe node <node-name> | grep Taints
  11. # 如果需要,移除污点
  12. kubectl taint nodes <node-name> <taint-key>-
  13. # 检查PVC状态
  14. kubectl get pvc
  15. kubectl describe pvc <pvc-name>
  16. # 如果是PVC问题,检查PV状态
  17. kubectl get pv
复制代码

镜像拉取失败

问题现象:Pod因镜像拉取失败而无法启动。

可能原因:

1. 镜像名称或标签错误
2. 镜像仓库认证问题
3. 网络问题导致无法访问镜像仓库
4. 镜像不存在

解决方案:
  1. # 查看Pod详细信息
  2. kubectl describe pod <pod-name>
  3. # 检查镜像名称和标签是否正确
  4. kubectl get pod <pod-name> -o yaml | grep image:
  5. # 如果是私有仓库,创建镜像拉取密钥
  6. kubectl create secret docker-registry <secret-name> \
  7.   --docker-server=<your-registry-server> \
  8.   --docker-username=<your-name> \
  9.   --docker-password=<your-pword> \
  10.   --docker-email=<your-email>
  11. # 将密钥添加到服务账户
  12. kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "<secret-name>"}]}'
  13. # 或者直接在Pod定义中指定imagePullSecrets
复制代码

Service无法访问

问题现象:创建的Service无法访问。

可能原因:

1. Service的selector与Pod的标签不匹配
2. 网络策略阻止了访问
3. kube-proxy组件问题
4. Service类型配置错误

解决方案:
  1. # 检查Service详细信息
  2. kubectl describe svc <service-name>
  3. # 验证selector是否匹配Pod标签
  4. kubectl get pods --selector=<selector-key>=<selector-value>
  5. # 检查Endpoints是否正确创建
  6. kubectl get endpoints <service-name>
  7. # 如果Endpoints为空,检查selector是否正确
  8. # 检查kube-proxy状态
  9. kubectl get pods -n kube-system | grep kube-proxy
  10. # 如果kube-proxy有问题,重启它
  11. kubectl delete pod -n kube-system -l k8s-app=kube-proxy
  12. # 检查网络策略
  13. kubectl get networkpolicy
  14. # 如果需要,测试Pod到Service的连接
  15. kubectl run -i --tty --rm debug --image=busybox --restart=Never -- wget -O- <service-ip>:<port>
复制代码

证书过期问题

问题现象:集群组件因证书过期而无法正常工作。

可能原因:

1. Kubernetes证书默认有效期为一年
2. 未及时更新证书

解决方案:
  1. # 检查证书过期时间
  2. kubeadm alpha certs check-expiration
  3. # 更新所有证书
  4. kubeadm alpha certs renew all
  5. # 更新kubeconfig文件
  6. kubeadm init phase kubeconfig all
  7. # 重启控制平面组件
  8. sudo systemctl restart kube-apiserver
  9. sudo systemctl restart kube-controller-manager
  10. sudo systemctl restart kube-scheduler
  11. # 更新工作节点上的kubeconfig
  12. # 在每个工作节点上执行
  13. sudo cp /etc/kubernetes/admin.conf /etc/kubernetes/kubelet.conf
  14. sudo systemctl restart kubelet
复制代码

etcd集群问题

问题现象:etcd集群不稳定或无法访问。

可能原因:

1. etcd数据损坏
2. etcd成员间通信问题
3. 磁盘空间不足

解决方案:
  1. # 检查etcd Pod状态
  2. kubectl get pods -n kube-system | grep etcd
  3. # 检查etcd日志
  4. kubectl logs -n kube-system <etcd-pod-name>
  5. # 检查etcd集群成员状态
  6. kubectl exec -n kube-system <etcd-pod-name> -- 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 member list
  7. # 检查etcd集群健康状态
  8. kubectl exec -n kube-system <etcd-pod-name> -- 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 endpoint health
  9. # 如果需要,进行etcd备份
  10. kubectl exec -n kube-system <etcd-pod-name> -- 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 /tmp/etcd-snapshot.db
  11. # 从备份恢复etcd
  12. # 首先停止etcd服务
  13. sudo systemctl stop etcd
  14. # 然后恢复数据
  15. sudo ETCDCTL_API=3 etcdctl snapshot restore /tmp/etcd-snapshot.db \
  16.   --data-dir=/var/lib/etcd \
  17.   --name=master-01 \
  18.   --initial-cluster=master-01=https://192.168.1.10:2380,master-02=https://192.168.1.11:2380,master-03=https://192.168.1.12:2380 \
  19.   --initial-cluster-token=etcd-cluster-1 \
  20.   --initial-advertise-peer-urls=https://192.168.1.10:2380
  21. # 最后启动etcd服务
  22. sudo systemctl start etcd
复制代码

资源配额问题

问题现象:Pod因资源配额限制而无法创建。

可能原因:

1. 命名空间中的资源使用已达到配额限制
2. Pod请求的资源超过了可用配额

解决方案:
  1. # 检查命名空间的资源配额
  2. kubectl get resourcequota -n <namespace>
  3. # 检查资源使用情况
  4. kubectl describe resourcequota <resourcequota-name> -n <namespace>
  5. # 如果需要,增加资源配额
  6. kubectl edit resourcequota <resourcequota-name> -n <namespace>
  7. # 或者调整Pod的资源请求
  8. kubectl edit deployment <deployment-name> -n <namespace>
复制代码

网络策略问题

问题现象:Pod之间无法通信,尽管网络配置正确。

可能原因:

1. 网络策略阻止了Pod间的通信
2. 网络插件不支持网络策略

解决方案:
  1. # 检查网络策略
  2. kubectl get networkpolicy -n <namespace>
  3. # 检查网络策略详细信息
  4. kubectl describe networkpolicy <networkpolicy-name> -n <namespace>
  5. # 如果需要,修改网络策略以允许通信
  6. kubectl edit networkpolicy <networkpolicy-name> -n <namespace>
  7. # 或者创建新的网络策略
  8. cat <<EOF | kubectl apply -f -
  9. apiVersion: networking.k8s.io/v1
  10. kind: NetworkPolicy
  11. metadata:
  12.   name: allow-all
  13.   namespace: <namespace>
  14. spec:
  15.   podSelector: {}
  16.   policyTypes:
  17.   - Ingress
  18.   - Egress
  19.   ingress:
  20.   - {}
  21.   egress:
  22.   - {}
  23. EOF
复制代码

总结

本文详细介绍了企业级Kubernetes容器云平台搭建的全流程,从环境准备、集群部署到应用管理的各个方面,并提供了常见问题的解决方案。通过遵循这些步骤和最佳实践,企业可以构建一个高可用、安全、可扩展的生产级K8s环境,为业务应用提供强大的容器编排和管理能力。

Kubernetes作为一个复杂的系统,其部署和运维需要深入的技术知识和丰富的实践经验。在实际操作中,可能会遇到各种各样的问题,需要结合具体情况进行排查和解决。建议企业在生产环境中使用成熟的Kubernetes发行版或托管服务,如Rancher、OpenShift、EKS、GKE、AKE等,以降低运维复杂度。

随着云原生技术的不断发展,Kubernetes生态系统也在持续演进。作为运维和开发人员,我们需要不断学习和实践,跟上技术发展的步伐,充分利用Kubernetes的强大功能,为企业数字化转型提供坚实的技术支撑。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则