活动公告

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

k8s容器管理入门教程新手也能快速掌握的容器编排实战指南带你从零开始学习

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-25 13:10:00 | 显示全部楼层 |阅读模式

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

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

x
1. 什么是Kubernetes和容器编排?

Kubernetes(常简称为K8s)是一个开源的容器编排平台,用于自动化容器化应用程序的部署、扩展和管理。它最初由Google设计并捐赠给Cloud Native Computing Foundation(CNCF)来维护。

1.1 容器编排的概念

容器编排是指自动化部署、管理、扩展和连接容器的过程。在没有编排工具的情况下,管理多个容器会变得非常复杂,特别是在需要处理容器故障、扩展应用、更新版本等场景时。

容器编排工具提供了以下核心功能:

• 自动化部署和复制容器
• 水平扩展和负载均衡
• 健康检查和自我修复
• 服务发现和路由
• 配置管理和密钥管理
• 存储编排
• 批处理执行

1.2 为什么选择Kubernetes?

Kubernetes已成为容器编排的事实标准,原因如下:

• 开源和社区支持:拥有活跃的开发社区和广泛的生态系统
• 可移植性:可以在公有云、私有云、混合云和裸金属环境中运行
• 自动化:自动处理许多手动任务,如容器部署、扩展和故障恢复
• 自我修复:能够自动重启失败的容器、替换和重新调度容器
• 服务发现和负载均衡:可以使用DNS名称或自己的IP地址暴露容器
• 存储编排:自动挂载所选存储系统
• 批量执行:管理批处理和CI工作负载
• 水平扩展:通过简单的命令或基于CPU使用情况自动扩展应用程序

2. Kubernetes架构和核心组件

理解Kubernetes的架构对于有效使用它至关重要。Kubernetes由主节点(Master Node)和工作节点(Worker Node)组成。

2.1 控制平面组件(Master节点)

控制平面负责管理集群的全局状态,并做出全局决策。

API服务器是Kubernetes控制平面的前端,它暴露了Kubernetes API。所有组件(包括用户、控制器、节点等)都通过API服务器进行交互。
  1. # 查看API服务器状态
  2. kubectl get componentstatuses
复制代码

etcd是一个一致的、高可用的键值存储,用于持久化存储Kubernetes集群的所有数据。
  1. # 查看etcd集群成员状态
  2. kubectl get -n kube-system pods -l component=etcd
复制代码

调度器负责监视新创建的、未分配节点的Pod,并选择一个节点让它们在上面运行。
  1. # 查看调度器Pod
  2. kubectl get -n kube-system pods -l component=kube-scheduler
复制代码

控制器管理器运行控制器进程,这些控制器负责维护集群的期望状态。
  1. # 查看控制器管理器Pod
  2. kubectl get -n kube-system pods -l component=kube-controller-manager
复制代码

云控制器管理器嵌入了特定于云平台的控制逻辑,允许将集群与云提供商的API集成。

2.2 节点组件(Worker节点)

节点组件在每个节点上运行,维护运行的Pod并提供Kubernetes运行时环境。

kubelet是主要的节点代理,它确保容器在Pod中运行。
  1. # 查看节点上的kubelet状态
  2. systemctl status kubelet
复制代码

kube-proxy维护节点上的网络规则,实现Kubernetes服务概念。
  1. # 查看kube-proxy Pod
  2. kubectl get -n kube-system pods -l k8s-app=kube-proxy
复制代码

容器运行时负责运行容器,如Docker、containerd、CRI-O等。
  1. # 查看容器运行时状态
  2. docker info  # 如果使用Docker
复制代码

3. 安装和设置Kubernetes环境

对于初学者,有几种方式可以设置Kubernetes环境进行学习和实验。

3.1 使用Minikube

Minikube是一个工具,可以在本地轻松运行单节点Kubernetes集群。

在Linux上安装Minikube:
  1. # 下载Minikube
  2. curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
  3. sudo install minikube-linux-amd64 /usr/local/bin/minikube
复制代码

在macOS上安装Minikube:
  1. # 使用Homebrew安装
  2. brew install minikube
复制代码

在Windows上安装Minikube:
  1. # 使用Chocolatey安装
  2. choco install minikube
复制代码
  1. # 启动Minikube集群
  2. minikube start
  3. # 查看集群状态
  4. minikube status
  5. # 查看Kubernetes版本
  6. kubectl version --short
复制代码

3.2 使用Kind

Kind(Kubernetes in Docker)是另一个工具,可以使用Docker容器作为”节点”运行本地Kubernetes集群。

在Linux上安装Kind:
  1. # 下载Kind
  2. curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
  3. chmod +x ./kind
  4. sudo mv ./kind /usr/local/bin/kind
复制代码

在macOS上安装Kind:
  1. # 使用Homebrew安装
  2. brew install kind
复制代码
  1. # 创建Kind集群
  2. kind create cluster
  3. # 查看集群信息
  4. kubectl cluster-info --context kind-kind
  5. # 删除Kind集群
  6. kind delete cluster
复制代码

3.3 使用云提供商的Kubernetes服务

如果你想在真实环境中学习,可以考虑使用云提供商的托管Kubernetes服务:

• Google Kubernetes Engine (GKE)
• Amazon Elastic Kubernetes Service (EKS)
• Azure Kubernetes Service (AKS)

4. Kubernetes基本对象和资源

Kubernetes中的所有内容都被表示为RESTful对象,这些对象可以通过kubectl工具进行操作。以下是Kubernetes中最基本的对象和资源。

4.1 Pod

Pod是Kubernetes中最小的可部署单元,表示一个或多个紧密耦合的容器。
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: nginx-pod
  5.   labels:
  6.     app: nginx
  7. spec:
  8.   containers:
  9.   - name: nginx
  10.     image: nginx:1.21
  11.     ports:
  12.     - containerPort: 80
复制代码
  1. # 创建Pod
  2. kubectl apply -f nginx-pod.yaml
  3. # 查看Pod
  4. kubectl get pods
  5. # 查看Pod详细信息
  6. kubectl describe pod nginx-pod
  7. # 查看Pod日志
  8. kubectl logs nginx-pod
  9. # 在Pod中执行命令
  10. kubectl exec -it nginx-pod -- /bin/bash
  11. # 删除Pod
  12. kubectl delete pod nginx-pod
复制代码

4.2 Deployment

Deployment是一个更高级别的概念,它管理Pod的副本集,并提供声明式更新。
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: nginx-deployment
  5.   labels:
  6.     app: nginx
  7. spec:
  8.   replicas: 3
  9.   selector:
  10.     matchLabels:
  11.       app: nginx
  12.   template:
  13.     metadata:
  14.       labels:
  15.         app: nginx
  16.     spec:
  17.       containers:
  18.       - name: nginx
  19.         image: nginx:1.21
  20.         ports:
  21.         - containerPort: 80
复制代码
  1. # 创建Deployment
  2. kubectl apply -f nginx-deployment.yaml
  3. # 查看Deployment
  4. kubectl get deployments
  5. # 查看Deployment详细信息
  6. kubectl describe deployment nginx-deployment
  7. # 扩展Deployment
  8. kubectl scale deployment nginx-deployment --replicas=5
  9. # 更新Deployment(更新镜像版本)
  10. kubectl set image deployment/nginx-deployment nginx=nginx:1.22
  11. # 回滚Deployment
  12. kubectl rollout undo deployment/nginx-deployment
  13. # 查看Deployment的更新状态
  14. kubectl rollout status deployment/nginx-deployment
  15. # 删除Deployment
  16. kubectl delete deployment nginx-deployment
复制代码

4.3 Service

Service定义了一组Pod的逻辑集合和访问它们的策略。

• ClusterIP:在集群内部暴露服务,默认类型
• NodePort:在每个节点的IP上静态端口暴露服务
• LoadBalancer:使用云提供商的负载均衡器暴露服务
• ExternalName:通过返回带有该名称的CNAME记录,将服务映射到外部名称
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: nginx-service
  5. spec:
  6.   selector:
  7.     app: nginx
  8.   ports:
  9.     - protocol: TCP
  10.       port: 80
  11.       targetPort: 80
  12.   type: ClusterIP
复制代码
  1. # 创建Service
  2. kubectl apply -f nginx-service.yaml
  3. # 查看Service
  4. kubectl get services
  5. # 查看Service详细信息
  6. kubectl describe service nginx-service
  7. # 删除Service
  8. kubectl delete service nginx-service
复制代码

4.4 Namespace

Namespace提供了一种机制,将单个集群中的资源划分为多个虚拟集群。
  1. apiVersion: v1
  2. kind: Namespace
  3. metadata:
  4.   name: development
复制代码
  1. # 创建Namespace
  2. kubectl apply -f development-namespace.yaml
  3. # 查看所有Namespace
  4. kubectl get namespaces
  5. # 在特定Namespace中创建资源
  6. kubectl apply -f nginx-deployment.yaml -n development
  7. # 查看特定Namespace中的资源
  8. kubectl get pods -n development
  9. # 设置当前上下文的默认Namespace
  10. kubectl config set-context --current --namespace=development
  11. # 删除Namespace
  12. kubectl delete namespace development
复制代码

4.5 ConfigMap和Secret

ConfigMap和Secret用于将配置数据与容器镜像分离。
  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4.   name: app-config
  5. data:
  6.   APP_ENV: "development"
  7.   APP_DEBUG: "true"
复制代码
  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4.   name: app-secret
  5. type: Opaque
  6. data:
  7.   DB_PASSWORD: cGFzc3dvcmQxMjM=  # base64编码的"password123"
复制代码
  1. # 创建ConfigMap
  2. kubectl apply -f app-config.yaml
  3. # 创建Secret
  4. kubectl apply -f app-secret.yaml
  5. # 查看ConfigMap
  6. kubectl get configmaps
  7. # 查看Secret
  8. kubectl get secrets
  9. # 在Pod中使用ConfigMap
  10. apiVersion: v1
  11. kind: Pod
  12. metadata:
  13.   name: configmap-pod
  14. spec:
  15.   containers:
  16.     - name: test-container
  17.       image: busybox
  18.       command: ["sh", "-c", "echo $APP_ENV && echo $APP_DEBUG"]
  19.       envFrom:
  20.         - configMapRef:
  21.             name: app-config
  22. # 在Pod中使用Secret
  23. apiVersion: v1
  24. kind: Pod
  25. metadata:
  26.   name: secret-pod
  27. spec:
  28.   containers:
  29.     - name: test-container
  30.       image: busybox
  31.       command: ["sh", "-c", "echo $DB_PASSWORD"]
  32.       env:
  33.         - name: DB_PASSWORD
  34.           valueFrom:
  35.             secretKeyRef:
  36.               name: app-secret
  37.               key: DB_PASSWORD
复制代码

5. 使用kubectl管理Kubernetes资源

kubectl是Kubernetes的命令行工具,用于与Kubernetes API服务器交互。

5.1 基本kubectl命令
  1. # 查看集群信息
  2. kubectl cluster-info
  3. # 查看Kubernetes版本
  4. kubectl version
  5. # 查看当前上下文
  6. kubectl config current-context
  7. # 查看所有上下文
  8. kubectl config get-contexts
  9. # 切换上下文
  10. kubectl config use-context <context-name>
  11. # 查看节点
  12. kubectl get nodes
  13. # 查看节点详细信息
  14. kubectl describe node <node-name>
  15. # 查看所有资源
  16. kubectl get all
  17. # 查看特定类型的资源
  18. kubectl get pods,deployments,services
  19. # 查看带有标签的资源
  20. kubectl get pods -l app=nginx
  21. # 查看所有命名空间中的资源
  22. kubectl get pods --all-namespaces
复制代码

5.2 应用和更新资源
  1. # 应用配置文件
  2. kubectl apply -f <filename.yaml>
  3. # 应用目录中的所有配置文件
  4. kubectl apply -f <directory>
  5. # 从URL应用配置
  6. kubectl apply -f https://example.com/config.yaml
  7. # 从标准输入应用配置
  8. cat <<EOF | kubectl apply -f -
  9. apiVersion: v1
  10. kind: Pod
  11. metadata:
  12.   name: busybox-sleep
  13. spec:
  14.   containers:
  15.   - name: busybox
  16.     image: busybox
  17.     args:
  18.     - sleep
  19.     - "1000"
  20. EOF
复制代码

5.3 编辑资源
  1. # 使用默认编辑器编辑资源
  2. kubectl edit deployment <deployment-name>
  3. # 使用特定编辑器编辑资源
  4. KUBE_EDITOR="nano" kubectl edit deployment <deployment-name>
复制代码

5.4 调试和故障排除
  1. # 查看Pod日志
  2. kubectl logs <pod-name>
  3. # 查看Pod中特定容器的日志
  4. kubectl logs <pod-name> -c <container-name>
  5. # 跟踪Pod日志
  6. kubectl logs -f <pod-name>
  7. # 查看前一个容器的日志
  8. kubectl logs <pod-name> --previous
  9. # 在Pod中执行命令
  10. kubectl exec -it <pod-name> -- /bin/bash
  11. # 查看Pod事件
  12. kubectl describe pod <pod-name>
  13. # 查看节点事件
  14. kubectl describe node <node-name>
  15. # 查看集群事件
  16. kubectl get events
复制代码

6. 实战示例:部署一个应用程序到Kubernetes

让我们通过一个完整的示例来演示如何将一个简单的Web应用程序部署到Kubernetes。

6.1 创建应用程序

首先,我们创建一个简单的Node.js应用程序。
  1. // app.js
  2. const express = require('express');
  3. const app = express();
  4. const port = process.env.PORT || 3000;
  5. app.get('/', (req, res) => {
  6.   res.send('Hello from Kubernetes!');
  7. });
  8. app.listen(port, () => {
  9.   console.log(`App listening on port ${port}`);
  10. });
复制代码
  1. {
  2.   "name": "k8s-demo-app",
  3.   "version": "1.0.0",
  4.   "description": "A simple Node.js app for Kubernetes demo",
  5.   "main": "app.js",
  6.   "scripts": {
  7.     "start": "node app.js"
  8.   },
  9.   "dependencies": {
  10.     "express": "^4.17.1"
  11.   }
  12. }
复制代码
  1. # 使用官方Node.js运行时作为基础镜像
  2. FROM node:14-alpine
  3. # 在容器中创建工作目录
  4. WORKDIR /usr/src/app
  5. # 复制package.json和package-lock.json
  6. COPY package*.json ./
  7. # 安装应用依赖
  8. RUN npm install
  9. # 复制应用程序代码
  10. COPY . .
  11. # 暴露端口
  12. EXPOSE 3000
  13. # 定义启动命令
  14. CMD [ "npm", "start" ]
复制代码

6.2 构建和推送Docker镜像
  1. # 构建Docker镜像
  2. docker build -t your-dockerhub-username/k8s-demo-app:v1 .
  3. # 登录到Docker Hub
  4. docker login
  5. # 推送镜像到Docker Hub
  6. docker push your-dockerhub-username/k8s-demo-app:v1
复制代码

6.3 创建Kubernetes部署文件
  1. # deployment.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5.   name: k8s-demo-app
  6.   labels:
  7.     app: k8s-demo-app
  8. spec:
  9.   replicas: 3
  10.   selector:
  11.     matchLabels:
  12.       app: k8s-demo-app
  13.   template:
  14.     metadata:
  15.       labels:
  16.         app: k8s-demo-app
  17.     spec:
  18.       containers:
  19.       - name: k8s-demo-app
  20.         image: your-dockerhub-username/k8s-demo-app:v1
  21.         ports:
  22.         - containerPort: 3000
  23.         env:
  24.         - name: PORT
  25.           value: "3000"
复制代码
  1. # service.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5.   name: k8s-demo-app-service
  6. spec:
  7.   selector:
  8.     app: k8s-demo-app
  9.   ports:
  10.     - protocol: TCP
  11.       port: 80
  12.       targetPort: 3000
  13.   type: LoadBalancer
复制代码

6.4 部署应用程序
  1. # 部署应用程序
  2. kubectl apply -f deployment.yaml
  3. kubectl apply -f service.yaml
  4. # 检查部署状态
  5. kubectl get deployments
  6. kubectl get pods
  7. kubectl get services
  8. # 获取Service的外部IP(如果是云环境)
  9. kubectl get service k8s-demo-app-service -o wide
  10. # 如果使用Minikube,获取Service URL
  11. minikube service k8s-demo-app-service --url
复制代码

6.5 扩展应用程序
  1. # 扩展应用程序到5个副本
  2. kubectl scale deployment k8s-demo-app --replicas=5
  3. # 检查扩展后的Pod数量
  4. kubectl get pods -l app=k8s-demo-app
复制代码

6.6 更新应用程序
  1. // 更新app.js
  2. const express = require('express');
  3. const app = express();
  4. const port = process.env.PORT || 3000;
  5. app.get('/', (req, res) => {
  6.   res.send('Hello from Kubernetes! (v2)');
  7. });
  8. app.listen(port, () => {
  9.   console.log(`App listening on port ${port}`);
  10. });
复制代码
  1. # 构建新版本镜像
  2. docker build -t your-dockerhub-username/k8s-demo-app:v2 .
  3. # 推送镜像
  4. docker push your-dockerhub-username/k8s-demo-app:v2
复制代码
  1. # 更新Deployment以使用新镜像
  2. kubectl set image deployment/k8s-demo-app k8s-demo-app=your-dockerhub-username/k8s-demo-app:v2
  3. # 检查更新状态
  4. kubectl rollout status deployment/k8s-demo-app
  5. # 查看更新历史
  6. kubectl rollout history deployment/k8s-demo-app
复制代码

6.7 回滚更新
  1. # 回滚到前一个版本
  2. kubectl rollout undo deployment/k8s-demo-app
  3. # 回滚到特定版本
  4. kubectl rollout undo deployment/k8s-demo-app --to-revision=1
  5. # 检查回滚状态
  6. kubectl rollout status deployment/k8s-demo-app
复制代码

7. 常用的Kubernetes操作和管理技巧

7.1 标签和选择器

标签是附加到对象(如Pod、Deployment等)的键值对,用于组织和选择对象子集。
  1. # 添加标签
  2. kubectl label pods <pod-name> environment=production
  3. # 查看带有特定标签的资源
  4. kubectl get pods -l environment=production
  5. # 更新标签
  6. kubectl label pods <pod-name> environment=development --overwrite
  7. # 删除标签
  8. kubectl label pods <pod-name> environment-
复制代码

7.2 注解

注解是用于存储非标识性元数据的键值对,可以存储比标签更大的数据。
  1. # 添加注解
  2. kubectl annotate pods <pod-name> description='This is a production pod'
  3. # 查看注解
  4. kubectl describe pod <pod-name>
复制代码

7.3 健康检查

Kubernetes支持两种健康检查:存活探针(Liveness Probe)和就绪探针(Readiness Probe)。
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: liveness-app
  5. spec:
  6.   replicas: 1
  7.   selector:
  8.     matchLabels:
  9.       app: liveness-app
  10.   template:
  11.     metadata:
  12.       labels:
  13.         app: liveness-app
  14.     spec:
  15.       containers:
  16.       - name: liveness-app
  17.         image: busybox
  18.         args:
  19.         - /bin/sh
  20.         - -c
  21.         - touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
  22.         livenessProbe:
  23.           exec:
  24.             command:
  25.             - cat
  26.             - /tmp/healthy
  27.           initialDelaySeconds: 5
  28.           periodSeconds: 5
复制代码
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: readiness-app
  5. spec:
  6.   replicas: 1
  7.   selector:
  8.     matchLabels:
  9.       app: readiness-app
  10.   template:
  11.     metadata:
  12.       labels:
  13.         app: readiness-app
  14.     spec:
  15.       containers:
  16.       - name: readiness-app
  17.         image: nginx:1.21
  18.         ports:
  19.         - containerPort: 80
  20.         readinessProbe:
  21.           httpGet:
  22.             path: /
  23.             port: 80
  24.           initialDelaySeconds: 5
  25.           periodSeconds: 10
复制代码

7.4 资源限制和请求

资源限制和请求用于管理Pod的CPU和内存使用。
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: resource-pod
  5. spec:
  6.   containers:
  7.   - name: resource-app
  8.     image: busybox
  9.     command: ["sh", "-c", "echo Hello Kubernetes! && sleep 3600"]
  10.     resources:
  11.       requests:
  12.         memory: "64Mi"
  13.         cpu: "250m"
  14.       limits:
  15.         memory: "128Mi"
  16.         cpu: "500m"
复制代码

7.5 持久化存储

持久化存储用于保存应用程序数据,即使Pod被重新创建。
  1. # PersistentVolume
  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: manual
  14.   hostPath:
  15.     path: /mnt/data
复制代码
  1. # PersistentVolumeClaim
  2. apiVersion: v1
  3. kind: PersistentVolumeClaim
  4. metadata:
  5.   name: pvc-example
  6. spec:
  7.   accessModes:
  8.     - ReadWriteOnce
  9.   resources:
  10.     requests:
  11.       storage: 10Gi
  12.   storageClassName: manual
复制代码
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: pod-with-pvc
  5. spec:
  6.   containers:
  7.   - name: app
  8.     image: nginx
  9.     ports:
  10.     - containerPort: 80
  11.     volumeMounts:
  12.     - name: persistent-storage
  13.       mountPath: /usr/share/nginx/html
  14.   volumes:
  15.   - name: persistent-storage
  16.     persistentVolumeClaim:
  17.       claimName: pvc-example
复制代码

7.6 配置管理
  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4.   name: app-config
  5. data:
  6.   APP_COLOR: "blue"
  7.   APP_MODE: "production"
复制代码
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: configmap-env-pod
  5. spec:
  6.   containers:
  7.   - name: app
  8.     image: busybox
  9.     command: ["sh", "-c", "echo $APP_COLOR && echo $APP_MODE && sleep 3600"]
  10.     envFrom:
  11.     - configMapRef:
  12.         name: app-config
复制代码
  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4.   name: nginx-config
  5. data:
  6.   default.conf: |
  7.     server {
  8.       listen       80;
  9.       server_name  localhost;
  10.       location / {
  11.         root   /usr/share/nginx/html;
  12.         index  index.html index.htm;
  13.       }
  14.       error_page   500 502 503 504  /50x.html;
  15.       location = /50x.html {
  16.         root   /usr/share/nginx/html;
  17.       }
  18.     }
复制代码
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: configmap-volume-pod
  5. spec:
  6.   containers:
  7.   - name: nginx
  8.     image: nginx
  9.     ports:
  10.     - containerPort: 80
  11.     volumeMounts:
  12.     - name: nginx-config-volume
  13.       mountPath: /etc/nginx/conf.d/
  14.   volumes:
  15.   - name: nginx-config-volume
  16.     configMap:
  17.       name: nginx-config
复制代码

8. 故障排除和最佳实践

8.1 常见问题和解决方案

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

可能原因:

• 集群中没有足够的资源(CPU或内存)
• 没有满足Pod调度约束的节点
• 持久化卷挂载失败

解决方案:
  1. # 检查Pod事件
  2. kubectl describe pod <pod-name>
  3. # 检查集群资源使用情况
  4. kubectl top nodes
  5. # 检查是否有未绑定的PersistentVolumeClaim
  6. kubectl get pvc
复制代码

问题:Pod不断重启,状态变为CrashLoopBackOff。

可能原因:

• 应用程序错误
• 配置问题
• 资源不足

解决方案:
  1. # 查看Pod日志
  2. kubectl logs <pod-name>
  3. # 查看前一个容器的日志
  4. kubectl logs <pod-name> --previous
  5. # 检查资源限制
  6. kubectl describe pod <pod-name>
复制代码

问题:无法拉取容器镜像。

可能原因:

• 镜像名称或标签错误
• 没有权限访问私有仓库
• 网络问题

解决方案:
  1. # 检查Pod配置
  2. kubectl describe pod <pod-name>
  3. # 手动拉取镜像测试
  4. docker pull <image-name>
  5. # 创建Secret以访问私有仓库
  6. kubectl create secret docker-registry <secret-name> --docker-server=<server> --docker-username=<username> --docker-password=<password> --docker-email=<email>
  7. # 在Deployment中使用Secret
  8. apiVersion: apps/v1
  9. kind: Deployment
  10. metadata:
  11.   name: private-repo-app
  12. spec:
  13.   template:
  14.     spec:
  15.       containers:
  16.       - name: app
  17.         image: your-registry.com/your-image
  18.       imagePullSecrets:
  19.       - name: <secret-name>
复制代码

8.2 Kubernetes最佳实践
  1. # 安全上下文示例
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: security-context-pod
  6. spec:
  7.   securityContext:
  8.     runAsUser: 1000
  9.     runAsGroup: 3000
  10.     fsGroup: 2000
  11.   containers:
  12.   - name: secure-app
  13.     image: busybox
  14.     command: ["sh", "-c", "sleep 3600"]
  15.     securityContext:
  16.       allowPrivilegeEscalation: false
  17.       readOnlyRootFilesystem: true
  18.       runAsNonRoot: true
  19.       capabilities:
  20.         drop:
  21.         - ALL
复制代码
  1. # 资源配额示例
  2. apiVersion: v1
  3. kind: ResourceQuota
  4. metadata:
  5.   name: compute-resources
  6.   namespace: development
  7. spec:
  8.   hard:
  9.     pods: "10"
  10.     requests.cpu: "4"
  11.     requests.memory: 8Gi
  12.     limits.cpu: "10"
  13.     limits.memory: 16Gi
复制代码
  1. # 限制范围示例
  2. apiVersion: v1
  3. kind: LimitRange
  4. metadata:
  5.   name: resource-limits
  6.   namespace: development
  7. spec:
  8.   limits:
  9.   - default:
  10.       memory: 512Mi
  11.       cpu: "1"
  12.     defaultRequest:
  13.       memory: 256Mi
  14.       cpu: "0.5"
  15.     type: Container
复制代码
  1. # 网络策略示例
  2. apiVersion: networking.k8s.io/v1
  3. kind: NetworkPolicy
  4. metadata:
  5.   name: app-network-policy
  6.   namespace: development
  7. spec:
  8.   podSelector:
  9.     matchLabels:
  10.       app: secure-app
  11.   policyTypes:
  12.   - Ingress
  13.   - Egress
  14.   ingress:
  15.   - from:
  16.     - namespaceSelector:
  17.         matchLabels:
  18.           name: development
  19.     ports:
  20.     - protocol: TCP
  21.       port: 80
  22.   egress:
  23.   - to:
  24.     - namespaceSelector:
  25.         matchLabels:
  26.           name: development
  27.     ports:
  28.     - protocol: TCP
  29.       port: 80
复制代码

9. 进阶学习资源

9.1 官方文档和教程

• Kubernetes官方文档
• Kubernetes任务
• Kubernetes教程

9.2 在线课程和培训

• Kubernetes Certified Administrator (CKA)
• Kubernetes Application Developer (CKAD)
• Udemy Kubernetes课程
• Coursera Kubernetes课程

9.3 社区资源

• Kubernetes GitHub仓库
• Kubernetes官方博客
• Kubernetes社区论坛
• Cloud Native Computing Foundation

9.4 实践项目

• KubernetesByExample
• Kubernetes the Hard Way
• Kubernetes Patterns

结论

Kubernetes已经成为现代云原生应用程序部署和管理的事实标准。通过本教程,你已经学习了Kubernetes的基本概念、架构、核心组件以及如何使用Kubernetes部署和管理应用程序。

记住,学习Kubernetes是一个持续的过程。随着你对Kubernetes的理解加深,你可以探索更高级的主题,如自定义资源定义(CRDs)、操作符模式、服务网格等。继续实践和学习,你将能够充分利用Kubernetes的强大功能来构建和管理可扩展、弹性的云原生应用程序。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

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

本版积分规则