从理论到实战用MinikubeKind深度复现Kubernetes核心场景为什么我们需要动手复现K8s面试场景在技术面试中Kubernetes相关问题常常让候选人感到头疼——不是因为这些概念难以理解而是纸上谈兵无法真正检验一个人的实战能力。想象一下当面试官问请解释滚动更新的工作原理时你能在脑海中构建出完整的流程吗当被问到Service和Endpoint的关系时你是否能立即在终端中展示它们之间的关联这就是为什么我们需要将Kubernetes面试题转化为可操作的实验。通过Minikube和Kind这两个轻量级工具我们可以在本地快速搭建Kubernetes环境亲手复现那些在面试中经常被问到的经典场景。这种方法不仅能帮助你深入理解Kubernetes的核心概念还能将这些知识转化为肌肉记忆让你在面试中游刃有余。1. 环境准备与工具选择1.1 Minikube vs Kind如何选择你的实验平台Minikube和Kind都是本地运行Kubernetes集群的优秀工具但它们的设计目标和适用场景有所不同特性MinikubeKind架构单节点虚拟机多节点容器Docker内部启动速度较慢需要启动VM快基于容器资源消耗较高较低多节点支持有限完善适用场景开发测试、学习CI/CD、多节点测试对于大多数学习场景Minikube是更好的选择因为它提供了更接近生产环境的体验。而Kind更适合需要快速启动、轻量级的环境或者测试多节点场景。安装Minikube的推荐方式# 对于macOS用户 brew install minikube # 对于Linux用户 curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube1.2 集群初始化与网络插件选择启动Minikube时网络插件的选择会影响后续实验的效果。以下是常见的网络插件及其特点flannel简单易用适合学习和开发环境calico功能丰富支持网络策略接近生产环境cilium基于eBPF性能优异适合高级场景建议第一次使用时选择calico插件minikube start --network-plugincni --cnicalico注意如果遇到镜像拉取问题可以尝试添加--image-mirror-countrycn参数使用国内镜像源验证集群状态kubectl get nodes kubectl get pods -n kube-system如果一切正常你应该能看到控制平面组件和calico相关的Pod都处于Running状态。2. 工作负载管理实战2.1 Deployment的完整生命周期让我们从创建一个简单的Nginx Deployment开始apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.19.10 ports: - containerPort: 80应用这个配置kubectl apply -f nginx-deployment.yaml观察Deployment的创建过程# 查看Deployment状态 kubectl get deployment nginx-deployment -w # 查看ReplicaSetDeployment创建的 kubectl get replicasets -l appnginx # 查看PodReplicaSet创建的 kubectl get pods -l appnginx --watch这个简单的命令链展示了Kubernetes的核心控制循环Deployment管理ReplicaSetReplicaSet管理Pod。在面试中理解这三者的关系至关重要。2.2 滚动更新与回滚的完整流程现在让我们实践面试中最常被问到的场景之一滚动更新。触发更新修改镜像版本kubectl set image deployment/nginx-deployment nginxnginx:1.21.6观察更新过程kubectl rollout status deployment/nginx-deployment查看更新历史kubectl rollout history deployment/nginx-deployment模拟更新失败进行回滚# 故意设置一个不存在的镜像版本 kubectl set image deployment/nginx-deployment nginxnginx:does-not-exist # 观察Pod创建失败 kubectl get pods -l appnginx # 回滚到上一个版本 kubectl rollout undo deployment/nginx-deployment # 确认回滚成功 kubectl get pods -l appnginx -o jsonpath{.items[*].spec.containers[*].image}深入理解滚动更新机制滚动更新不是简单的替换所有Pod而是遵循以下策略根据maxSurge参数默认25%计算可以创建的多余Pod数量根据maxUnavailable参数默认25%计算可以同时不可用的Pod数量逐步用新版本的Pod替换旧版本的Pod可以通过以下命令查看当前的更新策略kubectl get deployment nginx-deployment -o jsonpath{.spec.strategy}2.3 有状态应用StatefulSet实战与Deployment不同StatefulSet为每个Pod维护一个持久标识符适合运行有状态应用如数据库。让我们创建一个简单的StatefulSetapiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: serviceName: nginx replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.19.10 ports: - containerPort: 80应用并观察StatefulSet的行为kubectl apply -f statefulset.yaml kubectl get pods -l appnginx你会注意到Pod名称是有序的web-0, web-1, web-2这与Deployment创建的随机名称Pod形成鲜明对比。StatefulSet的核心特性稳定的、唯一的网络标识符稳定的持久化存储有序的、优雅的部署和扩展有序的、自动的滚动更新3. 服务发现与网络实战3.1 Service深度解析Service是Kubernetes中实现服务发现的核心组件。让我们为之前的Deployment创建一个ServiceapiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80应用后我们可以深入探索Service的工作原理# 查看Service详情 kubectl get svc nginx-service -o wide # 查看Service对应的Endpoint kubectl get endpoints nginx-service # 查看kube-proxy生成的iptables规则 minikube ssh -- sudo iptables-save | grep nginx-serviceService类型对比类型用途外部访问ClusterIP集群内部服务访问默认不可访问NodePort通过节点端口暴露服务节点IP:端口LoadBalancer使用云提供商的负载均衡器自动分配外部IPExternalName为外部服务创建CNAME记录依赖外部DNS3.2 Ingress实战七层路由Ingress提供了HTTP/HTTPS路由功能。要使用Ingress我们需要先安装Ingress控制器minikube addons enable ingress然后创建一个简单的Ingress资源apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: nginx.example.com http: paths: - path: / pathType: Prefix backend: service: name: nginx-service port: number: 80应用后我们可以测试Ingress功能# 获取Ingress IP kubectl get ingress example-ingress # 临时修改本地hosts文件 echo $(minikube ip) nginx.example.com | sudo tee -a /etc/hosts # 测试访问 curl http://nginx.example.comIngress vs ServiceService提供四层TCP/UDP负载均衡Ingress提供七层HTTP/HTTPS路由功能Ingress需要Ingress控制器实现而Service由kube-proxy实现3.3 网络策略实战网络策略(NetworkPolicy)允许你控制Pod之间的网络流量。让我们创建一个策略只允许特定Pod访问我们的Nginx服务apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: access-nginx spec: podSelector: matchLabels: app: nginx ingress: - from: - podSelector: matchLabels: access: true应用后只有带有accesstrue标签的Pod才能访问Nginx服务。可以通过以下命令测试# 创建一个测试Pod kubectl run access-test --rm -it --imagealpine --labelsaccesstrue -- sh # 在Pod内测试访问 wget -qO- http://nginx-service # 创建另一个没有access标签的测试Pod kubectl run no-access-test --rm -it --imagealpine -- sh # 在Pod内测试访问应该失败 wget -qO- http://nginx-service4. 存储与配置管理实战4.1 PersistentVolume与PersistentVolumeClaim有状态应用需要持久化存储。Kubernetes通过PV和PVC抽象存储资源# 首先创建一个PV apiVersion: v1 kind: PersistentVolume metadata: name: example-pv spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce hostPath: path: /mnt/data # 然后创建一个PVC apiVersion: v1 kind: PersistentVolumeClaim metadata: name: example-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi应用后可以在Pod中使用这个PVCapiVersion: v1 kind: Pod metadata: name: pv-pod spec: containers: - name: nginx image: nginx volumeMounts: - mountPath: /usr/share/nginx/html name: storage volumes: - name: storage persistentVolumeClaim: claimName: example-pvc4.2 ConfigMap与Secret实战将配置与镜像分离是云原生应用的重要原则。ConfigMap和Secret分别用于管理非敏感和敏感的配置数据。创建ConfigMap# 从字面值创建 kubectl create configmap game-config --from-literallevelhard --from-literaltypeaction # 从文件创建 echo player_initial_lives: 3 game.properties kubectl create configmap game-config-2 --from-filegame.properties创建Secret# 从字面值创建不推荐会留在shell历史中 kubectl create secret generic db-secret --from-literalusernameadmin --from-literalpasswordsecret # 从文件创建更安全 echo -n admin ./username.txt echo -n secret ./password.txt kubectl create secret generic db-secret-file --from-file./username.txt --from-file./password.txt在Pod中使用apiVersion: v1 kind: Pod metadata: name: configmap-pod spec: containers: - name: test-container image: alpine command: [/bin/sh, -c, env] envFrom: - configMapRef: name: game-config - secretRef: name: db-secret5. 高级场景复现5.1 资源限制与配额管理Kubernetes允许你为容器设置资源请求和限制apiVersion: v1 kind: Pod metadata: name: limited-pod spec: containers: - name: stress image: polinux/stress resources: requests: memory: 100Mi cpu: 500m limits: memory: 200Mi cpu: 1 command: [stress] args: [--vm, 1, --vm-bytes, 150M, --vm-hang, 1]资源配额(ResourceQuota)示例apiVersion: v1 kind: ResourceQuota metadata: name: mem-cpu-demo spec: hard: requests.cpu: 1 requests.memory: 1Gi limits.cpu: 2 limits.memory: 2Gi5.2 HPA自动扩缩容Horizontal Pod Autoscaler可以根据CPU利用率自动调整Pod数量# 首先创建一个metrics-server收集资源指标 minikube addons enable metrics-server # 创建一个有资源请求的Deployment kubectl create deployment php-apache --imagek8s.gcr.io/hpa-example kubectl set resources deploy/php-apache --requestscpu200m # 创建HPA kubectl autoscale deployment php-apache --cpu-percent50 --min1 --max10 # 生成负载测试自动扩缩容 kubectl run -i --tty load-generator --rm --imagebusybox --restartNever -- /bin/sh -c while sleep 0.01; do wget -q -O- http://php-apache; done # 观察HPA状态 kubectl get hpa -w5.3 自定义资源定义(CRD)入门CRD允许你扩展Kubernetes APIapiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: websites.example.com spec: group: example.com versions: - name: v1 served: true storage: true schema: openAPIV3Schema: type: object properties: spec: type: object properties: url: type: string framework: type: string scope: Namespaced names: plural: websites singular: website kind: Website shortNames: - ws创建后你可以像使用内置资源一样使用自定义资源kubectl get crd kubectl create website my-blog --urlhttps://example.com --frameworkWordPress6. 排错技巧与面试准备6.1 常见问题排查流程当遇到Kubernetes问题时可以按照以下步骤排查检查资源状态kubectl get resource -o wide kubectl describe resource name查看Pod日志kubectl logs pod-name [-c container-name] kubectl logs -f pod-name # 实时日志进入Pod调试kubectl exec -it pod-name -- /bin/sh检查事件kubectl get events --sort-by.metadata.creationTimestamp检查网络连接kubectl run -it --rm --imagenicolaka/netshoot debug-pod -- /bin/bash # 在netshoot容器中使用curl, dig, nslookup等工具测试网络6.2 面试高频问题实战演练让我们动手复现几个面试高频问题问题1如何查看Pod使用的镜像kubectl get pods pod-name -o jsonpath{.spec.containers[*].image}问题2如何找出运行中的Pod所在的节点kubectl get pods -o wide # 或者 kubectl get pod pod-name -o jsonpath{.spec.nodeName}问题3如何查看Service对应的Pod# 方法1通过Service的selector找到Pod kubectl get pods -l service-selector # 方法2通过Endpoint查看 kubectl get endpoints service-name问题4如何在不删除Pod的情况下将其从Service中移除# 修改Pod的标签使其不匹配Service的selector kubectl label pods pod-name label-key-6.3 性能优化与最佳实践Pod资源请求与限制设置建议始终设置资源请求(request)帮助调度器做出更好的决策对于生产环境设置资源限制(limit)防止单个Pod占用过多资源监控实际使用情况根据数据调整请求和限制镜像优化建议使用多阶段构建减小镜像大小使用特定版本标签而非latest定期扫描镜像中的漏洞部署策略选择策略适用场景优点缺点滚动更新大多数无状态应用零停机渐进式更新版本回滚需要时间蓝绿部署关键业务应用快速回滚版本验证需要双倍资源金丝雀发布新功能逐步发布风险可控用户体验平滑需要额外的流量管理机制7. 真实场景综合演练7.1 三阶段部署实战让我们模拟一个真实的三阶段部署流程开发环境使用最新代码的快速迭代kubectl create deployment dev --imagemyapp:latest --replicas1 -n dev测试环境稳定版本的功能测试kubectl create deployment test --imagemyapp:v1.2.3 --replicas2 -n test生产环境金丝雀发布策略# 初始部署 kubectl create deployment prod --imagemyapp:v1.2.2 --replicas5 -n prod # 金丝雀发布新版本 kubectl set image deployment/prod myappmyapp:v1.2.3 --record kubectl rollout pause deployment/prod # 监控新版本表现 kubectl get pods -n prod -l appmyapp --watch # 根据情况继续或回滚 kubectl rollout resume deployment/prod # 或 kubectl rollout undo deployment/prod7.2 多环境配置管理使用Kustomize管理不同环境的配置差异base/ ├── deployment.yaml ├── kustomization.yaml └── service.yaml overlays/ ├── dev │ ├── kustomization.yaml │ └── replica.yaml └── prod ├── kustomization.yaml └── resource.yaml应用不同环境的配置kubectl apply -k overlays/dev kubectl apply -k overlays/prod7.3 CI/CD流水线集成将Kubernetes部署集成到CI/CD流水线中# 简化版的CI/CD脚本示例 #!/bin/bash # 构建镜像 docker build -t myapp:$CI_COMMIT_SHA . # 推送镜像 docker push myapp:$CI_COMMIT_SHA # 部署到Kubernetes kubectl set image deployment/myapp myappmyapp:$CI_COMMIT_SHA # 健康检查 kubectl rollout status deployment/myapp --timeout2m8. 安全与RBAC实战8.1 服务账户与RBAC配置创建服务账户和角色绑定# 创建服务账户 apiVersion: v1 kind: ServiceAccount metadata: name: ci-deployer # 创建角色 apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: deployer-role rules: - apiGroups: [apps] resources: [deployments] verbs: [get, list, watch, create, update, patch] # 绑定角色到服务账户 apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: deployer-binding subjects: - kind: ServiceAccount name: ci-deployer roleRef: kind: Role name: deployer-role apiGroup: rbac.authorization.k8s.io8.2 安全上下文配置限制Pod的安全权限apiVersion: v1 kind: Pod metadata: name: security-context-demo spec: securityContext: runAsUser: 1000 runAsGroup: 3000 fsGroup: 2000 containers: - name: sec-ctx-demo image: busybox command: [sh, -c, sleep 1h] securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL]8.3 网络策略实战进阶创建更复杂的网络策略apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: advanced-policy spec: podSelector: matchLabels: role: db policyTypes: - Ingress - Egress ingress: - from: - namespaceSelector: matchLabels: project: myproject - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 6379 egress: - to: - ipBlock: cidr: 10.0.0.0/24 ports: - protocol: TCP port: 59789. 监控与日志收集9.1 Prometheus与Grafana部署部署监控栈# 添加Prometheus社区chart仓库 helm repo add prometheus-community https://prometheus-community.github.io/helm-charts # 安装kube-prometheus-stack helm install prometheus prometheus-community/kube-prometheus-stack访问Grafanakubectl port-forward svc/prometheus-grafana 3000:80 # 用户名: admin # 密码: prom-operator9.2 日志收集方案使用EFK(ElasticsearchFluentdKibana)栈收集日志# 安装Elasticsearch helm install elasticsearch elastic/elasticsearch # 安装Fluentd helm install fluentd fluent/fluentd --set elasticsearch.hostelasticsearch-master # 安装Kibana helm install kibana elastic/kibana --set elasticsearch.hosts[0]http://elasticsearch-master:92009.3 自定义指标与告警创建Prometheus自定义告警规则apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: custom-rules spec: groups: - name: example rules: - alert: HighPodMemory expr: sum(container_memory_working_set_bytes{pod!}) by (pod) / sum(container_spec_memory_limit_bytes{pod!}) by (pod) 0.9 for: 5m labels: severity: critical annotations: summary: High memory usage in Pod {{ $labels.pod }}10. 集群维护与升级10.1 节点维护操作安全排空节点# 标记节点为不可调度 kubectl cordon node-name # 排空节点驱逐所有Pod kubectl drain node-name --ignore-daemonsets # 维护完成后恢复节点 kubectl uncordon node-name10.2 集群升级策略Minikube集群升级步骤# 升级Minikube二进制 minikube update # 升级Kubernetes版本 minikube stop minikube delete minikube start --kubernetes-versionv1.22.010.3 备份与恢复使用velero进行集群备份# 安装velero velero install \ --provider aws \ --bucket my-backup \ --secret-file ./credentials-velero \ --use-restic # 创建备份 velero backup create my-backup --include-namespacesdefault # 恢复备份 velero restore create --from-backup my-backup
别再死记硬背了!用Minikube+Kind手把手复现K8s面试题里的经典场景
发布时间:2026/6/15 10:43:10
从理论到实战用MinikubeKind深度复现Kubernetes核心场景为什么我们需要动手复现K8s面试场景在技术面试中Kubernetes相关问题常常让候选人感到头疼——不是因为这些概念难以理解而是纸上谈兵无法真正检验一个人的实战能力。想象一下当面试官问请解释滚动更新的工作原理时你能在脑海中构建出完整的流程吗当被问到Service和Endpoint的关系时你是否能立即在终端中展示它们之间的关联这就是为什么我们需要将Kubernetes面试题转化为可操作的实验。通过Minikube和Kind这两个轻量级工具我们可以在本地快速搭建Kubernetes环境亲手复现那些在面试中经常被问到的经典场景。这种方法不仅能帮助你深入理解Kubernetes的核心概念还能将这些知识转化为肌肉记忆让你在面试中游刃有余。1. 环境准备与工具选择1.1 Minikube vs Kind如何选择你的实验平台Minikube和Kind都是本地运行Kubernetes集群的优秀工具但它们的设计目标和适用场景有所不同特性MinikubeKind架构单节点虚拟机多节点容器Docker内部启动速度较慢需要启动VM快基于容器资源消耗较高较低多节点支持有限完善适用场景开发测试、学习CI/CD、多节点测试对于大多数学习场景Minikube是更好的选择因为它提供了更接近生产环境的体验。而Kind更适合需要快速启动、轻量级的环境或者测试多节点场景。安装Minikube的推荐方式# 对于macOS用户 brew install minikube # 对于Linux用户 curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube1.2 集群初始化与网络插件选择启动Minikube时网络插件的选择会影响后续实验的效果。以下是常见的网络插件及其特点flannel简单易用适合学习和开发环境calico功能丰富支持网络策略接近生产环境cilium基于eBPF性能优异适合高级场景建议第一次使用时选择calico插件minikube start --network-plugincni --cnicalico注意如果遇到镜像拉取问题可以尝试添加--image-mirror-countrycn参数使用国内镜像源验证集群状态kubectl get nodes kubectl get pods -n kube-system如果一切正常你应该能看到控制平面组件和calico相关的Pod都处于Running状态。2. 工作负载管理实战2.1 Deployment的完整生命周期让我们从创建一个简单的Nginx Deployment开始apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.19.10 ports: - containerPort: 80应用这个配置kubectl apply -f nginx-deployment.yaml观察Deployment的创建过程# 查看Deployment状态 kubectl get deployment nginx-deployment -w # 查看ReplicaSetDeployment创建的 kubectl get replicasets -l appnginx # 查看PodReplicaSet创建的 kubectl get pods -l appnginx --watch这个简单的命令链展示了Kubernetes的核心控制循环Deployment管理ReplicaSetReplicaSet管理Pod。在面试中理解这三者的关系至关重要。2.2 滚动更新与回滚的完整流程现在让我们实践面试中最常被问到的场景之一滚动更新。触发更新修改镜像版本kubectl set image deployment/nginx-deployment nginxnginx:1.21.6观察更新过程kubectl rollout status deployment/nginx-deployment查看更新历史kubectl rollout history deployment/nginx-deployment模拟更新失败进行回滚# 故意设置一个不存在的镜像版本 kubectl set image deployment/nginx-deployment nginxnginx:does-not-exist # 观察Pod创建失败 kubectl get pods -l appnginx # 回滚到上一个版本 kubectl rollout undo deployment/nginx-deployment # 确认回滚成功 kubectl get pods -l appnginx -o jsonpath{.items[*].spec.containers[*].image}深入理解滚动更新机制滚动更新不是简单的替换所有Pod而是遵循以下策略根据maxSurge参数默认25%计算可以创建的多余Pod数量根据maxUnavailable参数默认25%计算可以同时不可用的Pod数量逐步用新版本的Pod替换旧版本的Pod可以通过以下命令查看当前的更新策略kubectl get deployment nginx-deployment -o jsonpath{.spec.strategy}2.3 有状态应用StatefulSet实战与Deployment不同StatefulSet为每个Pod维护一个持久标识符适合运行有状态应用如数据库。让我们创建一个简单的StatefulSetapiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: serviceName: nginx replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.19.10 ports: - containerPort: 80应用并观察StatefulSet的行为kubectl apply -f statefulset.yaml kubectl get pods -l appnginx你会注意到Pod名称是有序的web-0, web-1, web-2这与Deployment创建的随机名称Pod形成鲜明对比。StatefulSet的核心特性稳定的、唯一的网络标识符稳定的持久化存储有序的、优雅的部署和扩展有序的、自动的滚动更新3. 服务发现与网络实战3.1 Service深度解析Service是Kubernetes中实现服务发现的核心组件。让我们为之前的Deployment创建一个ServiceapiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80应用后我们可以深入探索Service的工作原理# 查看Service详情 kubectl get svc nginx-service -o wide # 查看Service对应的Endpoint kubectl get endpoints nginx-service # 查看kube-proxy生成的iptables规则 minikube ssh -- sudo iptables-save | grep nginx-serviceService类型对比类型用途外部访问ClusterIP集群内部服务访问默认不可访问NodePort通过节点端口暴露服务节点IP:端口LoadBalancer使用云提供商的负载均衡器自动分配外部IPExternalName为外部服务创建CNAME记录依赖外部DNS3.2 Ingress实战七层路由Ingress提供了HTTP/HTTPS路由功能。要使用Ingress我们需要先安装Ingress控制器minikube addons enable ingress然后创建一个简单的Ingress资源apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: nginx.example.com http: paths: - path: / pathType: Prefix backend: service: name: nginx-service port: number: 80应用后我们可以测试Ingress功能# 获取Ingress IP kubectl get ingress example-ingress # 临时修改本地hosts文件 echo $(minikube ip) nginx.example.com | sudo tee -a /etc/hosts # 测试访问 curl http://nginx.example.comIngress vs ServiceService提供四层TCP/UDP负载均衡Ingress提供七层HTTP/HTTPS路由功能Ingress需要Ingress控制器实现而Service由kube-proxy实现3.3 网络策略实战网络策略(NetworkPolicy)允许你控制Pod之间的网络流量。让我们创建一个策略只允许特定Pod访问我们的Nginx服务apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: access-nginx spec: podSelector: matchLabels: app: nginx ingress: - from: - podSelector: matchLabels: access: true应用后只有带有accesstrue标签的Pod才能访问Nginx服务。可以通过以下命令测试# 创建一个测试Pod kubectl run access-test --rm -it --imagealpine --labelsaccesstrue -- sh # 在Pod内测试访问 wget -qO- http://nginx-service # 创建另一个没有access标签的测试Pod kubectl run no-access-test --rm -it --imagealpine -- sh # 在Pod内测试访问应该失败 wget -qO- http://nginx-service4. 存储与配置管理实战4.1 PersistentVolume与PersistentVolumeClaim有状态应用需要持久化存储。Kubernetes通过PV和PVC抽象存储资源# 首先创建一个PV apiVersion: v1 kind: PersistentVolume metadata: name: example-pv spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce hostPath: path: /mnt/data # 然后创建一个PVC apiVersion: v1 kind: PersistentVolumeClaim metadata: name: example-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi应用后可以在Pod中使用这个PVCapiVersion: v1 kind: Pod metadata: name: pv-pod spec: containers: - name: nginx image: nginx volumeMounts: - mountPath: /usr/share/nginx/html name: storage volumes: - name: storage persistentVolumeClaim: claimName: example-pvc4.2 ConfigMap与Secret实战将配置与镜像分离是云原生应用的重要原则。ConfigMap和Secret分别用于管理非敏感和敏感的配置数据。创建ConfigMap# 从字面值创建 kubectl create configmap game-config --from-literallevelhard --from-literaltypeaction # 从文件创建 echo player_initial_lives: 3 game.properties kubectl create configmap game-config-2 --from-filegame.properties创建Secret# 从字面值创建不推荐会留在shell历史中 kubectl create secret generic db-secret --from-literalusernameadmin --from-literalpasswordsecret # 从文件创建更安全 echo -n admin ./username.txt echo -n secret ./password.txt kubectl create secret generic db-secret-file --from-file./username.txt --from-file./password.txt在Pod中使用apiVersion: v1 kind: Pod metadata: name: configmap-pod spec: containers: - name: test-container image: alpine command: [/bin/sh, -c, env] envFrom: - configMapRef: name: game-config - secretRef: name: db-secret5. 高级场景复现5.1 资源限制与配额管理Kubernetes允许你为容器设置资源请求和限制apiVersion: v1 kind: Pod metadata: name: limited-pod spec: containers: - name: stress image: polinux/stress resources: requests: memory: 100Mi cpu: 500m limits: memory: 200Mi cpu: 1 command: [stress] args: [--vm, 1, --vm-bytes, 150M, --vm-hang, 1]资源配额(ResourceQuota)示例apiVersion: v1 kind: ResourceQuota metadata: name: mem-cpu-demo spec: hard: requests.cpu: 1 requests.memory: 1Gi limits.cpu: 2 limits.memory: 2Gi5.2 HPA自动扩缩容Horizontal Pod Autoscaler可以根据CPU利用率自动调整Pod数量# 首先创建一个metrics-server收集资源指标 minikube addons enable metrics-server # 创建一个有资源请求的Deployment kubectl create deployment php-apache --imagek8s.gcr.io/hpa-example kubectl set resources deploy/php-apache --requestscpu200m # 创建HPA kubectl autoscale deployment php-apache --cpu-percent50 --min1 --max10 # 生成负载测试自动扩缩容 kubectl run -i --tty load-generator --rm --imagebusybox --restartNever -- /bin/sh -c while sleep 0.01; do wget -q -O- http://php-apache; done # 观察HPA状态 kubectl get hpa -w5.3 自定义资源定义(CRD)入门CRD允许你扩展Kubernetes APIapiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: websites.example.com spec: group: example.com versions: - name: v1 served: true storage: true schema: openAPIV3Schema: type: object properties: spec: type: object properties: url: type: string framework: type: string scope: Namespaced names: plural: websites singular: website kind: Website shortNames: - ws创建后你可以像使用内置资源一样使用自定义资源kubectl get crd kubectl create website my-blog --urlhttps://example.com --frameworkWordPress6. 排错技巧与面试准备6.1 常见问题排查流程当遇到Kubernetes问题时可以按照以下步骤排查检查资源状态kubectl get resource -o wide kubectl describe resource name查看Pod日志kubectl logs pod-name [-c container-name] kubectl logs -f pod-name # 实时日志进入Pod调试kubectl exec -it pod-name -- /bin/sh检查事件kubectl get events --sort-by.metadata.creationTimestamp检查网络连接kubectl run -it --rm --imagenicolaka/netshoot debug-pod -- /bin/bash # 在netshoot容器中使用curl, dig, nslookup等工具测试网络6.2 面试高频问题实战演练让我们动手复现几个面试高频问题问题1如何查看Pod使用的镜像kubectl get pods pod-name -o jsonpath{.spec.containers[*].image}问题2如何找出运行中的Pod所在的节点kubectl get pods -o wide # 或者 kubectl get pod pod-name -o jsonpath{.spec.nodeName}问题3如何查看Service对应的Pod# 方法1通过Service的selector找到Pod kubectl get pods -l service-selector # 方法2通过Endpoint查看 kubectl get endpoints service-name问题4如何在不删除Pod的情况下将其从Service中移除# 修改Pod的标签使其不匹配Service的selector kubectl label pods pod-name label-key-6.3 性能优化与最佳实践Pod资源请求与限制设置建议始终设置资源请求(request)帮助调度器做出更好的决策对于生产环境设置资源限制(limit)防止单个Pod占用过多资源监控实际使用情况根据数据调整请求和限制镜像优化建议使用多阶段构建减小镜像大小使用特定版本标签而非latest定期扫描镜像中的漏洞部署策略选择策略适用场景优点缺点滚动更新大多数无状态应用零停机渐进式更新版本回滚需要时间蓝绿部署关键业务应用快速回滚版本验证需要双倍资源金丝雀发布新功能逐步发布风险可控用户体验平滑需要额外的流量管理机制7. 真实场景综合演练7.1 三阶段部署实战让我们模拟一个真实的三阶段部署流程开发环境使用最新代码的快速迭代kubectl create deployment dev --imagemyapp:latest --replicas1 -n dev测试环境稳定版本的功能测试kubectl create deployment test --imagemyapp:v1.2.3 --replicas2 -n test生产环境金丝雀发布策略# 初始部署 kubectl create deployment prod --imagemyapp:v1.2.2 --replicas5 -n prod # 金丝雀发布新版本 kubectl set image deployment/prod myappmyapp:v1.2.3 --record kubectl rollout pause deployment/prod # 监控新版本表现 kubectl get pods -n prod -l appmyapp --watch # 根据情况继续或回滚 kubectl rollout resume deployment/prod # 或 kubectl rollout undo deployment/prod7.2 多环境配置管理使用Kustomize管理不同环境的配置差异base/ ├── deployment.yaml ├── kustomization.yaml └── service.yaml overlays/ ├── dev │ ├── kustomization.yaml │ └── replica.yaml └── prod ├── kustomization.yaml └── resource.yaml应用不同环境的配置kubectl apply -k overlays/dev kubectl apply -k overlays/prod7.3 CI/CD流水线集成将Kubernetes部署集成到CI/CD流水线中# 简化版的CI/CD脚本示例 #!/bin/bash # 构建镜像 docker build -t myapp:$CI_COMMIT_SHA . # 推送镜像 docker push myapp:$CI_COMMIT_SHA # 部署到Kubernetes kubectl set image deployment/myapp myappmyapp:$CI_COMMIT_SHA # 健康检查 kubectl rollout status deployment/myapp --timeout2m8. 安全与RBAC实战8.1 服务账户与RBAC配置创建服务账户和角色绑定# 创建服务账户 apiVersion: v1 kind: ServiceAccount metadata: name: ci-deployer # 创建角色 apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: deployer-role rules: - apiGroups: [apps] resources: [deployments] verbs: [get, list, watch, create, update, patch] # 绑定角色到服务账户 apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: deployer-binding subjects: - kind: ServiceAccount name: ci-deployer roleRef: kind: Role name: deployer-role apiGroup: rbac.authorization.k8s.io8.2 安全上下文配置限制Pod的安全权限apiVersion: v1 kind: Pod metadata: name: security-context-demo spec: securityContext: runAsUser: 1000 runAsGroup: 3000 fsGroup: 2000 containers: - name: sec-ctx-demo image: busybox command: [sh, -c, sleep 1h] securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL]8.3 网络策略实战进阶创建更复杂的网络策略apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: advanced-policy spec: podSelector: matchLabels: role: db policyTypes: - Ingress - Egress ingress: - from: - namespaceSelector: matchLabels: project: myproject - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 6379 egress: - to: - ipBlock: cidr: 10.0.0.0/24 ports: - protocol: TCP port: 59789. 监控与日志收集9.1 Prometheus与Grafana部署部署监控栈# 添加Prometheus社区chart仓库 helm repo add prometheus-community https://prometheus-community.github.io/helm-charts # 安装kube-prometheus-stack helm install prometheus prometheus-community/kube-prometheus-stack访问Grafanakubectl port-forward svc/prometheus-grafana 3000:80 # 用户名: admin # 密码: prom-operator9.2 日志收集方案使用EFK(ElasticsearchFluentdKibana)栈收集日志# 安装Elasticsearch helm install elasticsearch elastic/elasticsearch # 安装Fluentd helm install fluentd fluent/fluentd --set elasticsearch.hostelasticsearch-master # 安装Kibana helm install kibana elastic/kibana --set elasticsearch.hosts[0]http://elasticsearch-master:92009.3 自定义指标与告警创建Prometheus自定义告警规则apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: custom-rules spec: groups: - name: example rules: - alert: HighPodMemory expr: sum(container_memory_working_set_bytes{pod!}) by (pod) / sum(container_spec_memory_limit_bytes{pod!}) by (pod) 0.9 for: 5m labels: severity: critical annotations: summary: High memory usage in Pod {{ $labels.pod }}10. 集群维护与升级10.1 节点维护操作安全排空节点# 标记节点为不可调度 kubectl cordon node-name # 排空节点驱逐所有Pod kubectl drain node-name --ignore-daemonsets # 维护完成后恢复节点 kubectl uncordon node-name10.2 集群升级策略Minikube集群升级步骤# 升级Minikube二进制 minikube update # 升级Kubernetes版本 minikube stop minikube delete minikube start --kubernetes-versionv1.22.010.3 备份与恢复使用velero进行集群备份# 安装velero velero install \ --provider aws \ --bucket my-backup \ --secret-file ./credentials-velero \ --use-restic # 创建备份 velero backup create my-backup --include-namespacesdefault # 恢复备份 velero restore create --from-backup my-backup