K8s系列第十五篇(终篇):K8s 集群优化实战:性能、稳定性与安全性优化

前言:在上一篇文章中,我们聚焦K8s运维的核心实战------故障排查,详细讲解了故障排查的核心思路、常用命令,通过6类生产环境高频故障的实战演练,手把手教你掌握"定位根源、快速解决"的排查方法,同时推荐了提升排查效率的第三方工具和生产环境最佳实践,结合前面学到的日志收集(EFK/ELK)、监控告警(Prometheus+Grafana)知识,形成了"监控→告警→排查→解决"的完整运维闭环,彻底解决了"遇到故障无从下手"的痛点。

重点回顾3点(衔接上一篇核心):

  1. 故障排查的核心思路是"从现象到本质、从上层到下层、从局部到整体",遵循"明确现象→定位范围→查看日志指标→验证解决"四步走;

  2. 常用排查命令需熟记,重点掌握Pod、Service、节点、核心组件的相关命令,是快速排查故障的基础;

  3. 生产环境中,需最大化利用日志和监控,做好故障预防和复盘,避免同类故障重复发生。

正如上一篇结尾预告,本节课是K8s系列的最后一篇文章,也是K8s运维的终极实战环节------集群优化。经过前面14篇的学习,我们已经掌握了K8s的基础入门、核心组件、应用部署、服务暴露、调度自愈、资源限制、日志收集、监控告警、故障排查等全流程技能,能够实现K8s集群的正常部署和日常运维,解决了"能用K8s"的问题。但在生产环境中,仅仅"能用"远远不够,还需要"用好"------确保集群具备高效的性能、稳定的运行状态、可靠的安全性,才能适配生产环境的高并发、高可用、高安全需求。

K8s集群优化的核心是"三位一体": 性能优化、稳定性优化、安全性优化。 性能优化聚焦"提升集群运行效率,降低资源消耗";稳定性优化聚焦"减少集群故障,确保服务持续可用";安全性优化聚焦"防范安全风险,保护集群和应用数据"。本文依然针对小白,延续系列"全程实操、命令可复制、场景化讲解"的风格,从这三个核心维度,手把手教你掌握K8s集群优化的实战方法,结合前面学到的知识,帮你搭建一个高效、稳定、安全的K8s集群,为你的K8s学习之旅画上圆满句号,同时适配生产环境需求和面试重点。

前置要求:已搭建好K8s集群,掌握前面14篇教程的核心知识点(Pod、Deployment、Service、监控、日志、故障排查等);熟悉Linux系统优化基础;已部署基础应用(如Nginx、Redis),用于优化效果验证;具备基本的资源管理和安全防护意识。

一、性能优化:提升效率,降低资源消耗

K8s集群的性能问题,主要体现在"资源利用率低、调度效率低、网络延迟高"三个方面。小白在部署集群后,很容易出现"CPU、内存浪费严重""Pod调度缓慢""应用访问卡顿"等问题,影响用户体验和集群运行效率。本节从"节点资源优化、Pod调度优化、网络优化、存储优化"四个维度,讲解性能优化的实操方法,帮你提升集群性能,降低资源消耗。

1.1 节点资源优化(核心:提高资源利用率)

节点是K8s集群的基础,节点资源(CPU、内存、磁盘)的利用效率,直接决定了集群的整体性能。常见问题:节点资源分配不合理、无用进程占用资源、磁盘IO性能不足。优化方法如下:

bash 复制代码
# 1. 查看节点资源使用情况,定位资源浪费问题
kubectl top node  # 查看所有节点CPU、内存使用率
kubectl get pods -n all --field-selector spec.nodeName=<节点名称>  # 查看节点上的Pod资源占用

# 2. 清理节点无用进程和资源,释放资源
# 登录节点,查看无用进程
ssh <节点IP>
ps -ef | grep -v kube | grep -v containerd  # 过滤非K8s相关的无用进程
kill -9 <无用进程ID>  # 终止无用进程

# 3. 优化节点磁盘IO(提升磁盘读写性能)
# 查看磁盘IO使用情况
iostat -x 1  # 查看磁盘IO使用率、响应时间
# 优化方法1:使用SSD磁盘(生产环境推荐,读写速度远高于机械硬盘)
# 优化方法2:清理磁盘碎片(针对机械硬盘)
ssh <节点IP>
fsck /dev/sda1  # 检查并修复磁盘碎片(需卸载磁盘,生产环境需谨慎)
# 优化方法3:限制磁盘IO占用过高的Pod(通过资源限制)
kubectl edit deployment <deployment名称> -n <命名空间>
# 添加磁盘IO限制(需容器运行时支持)
resources:
  limits:
    ephemeral-storage: 10Gi  # 临时存储限制
    storage: 20Gi  # 持久化存储限制

# 4. 节点资源预留(避免资源耗尽,影响K8s核心组件运行)
# 编辑kubelet配置文件,预留资源给节点系统和K8s组件
ssh <节点IP>
vim /etc/kubernetes/kubelet.conf
# 添加资源预留配置(在--kubelet-args中添加)
--system-reserved=cpu=100m,memory=1Gi  # 预留100m CPU、1Gi内存给系统
--kube-reserved=cpu=200m,memory=2Gi    # 预留200m CPU、2Gi内存给K8s组件
# 重启kubelet生效
systemctl restart kubelet

1.2 Pod调度优化(核心:提升调度效率,均衡节点负载)

Pod调度是K8s的核心功能之一,调度效率低、负载不均衡,会导致部分节点资源耗尽、部分节点资源闲置,影响集群整体性能。常见问题:Pod调度缓慢、节点负载不均、调度策略不合理。优化方法如下:

bash 复制代码
# 1. 查看Pod调度情况,定位调度问题
kubectl get pods -n all -o wide  # 查看Pod分布情况,判断是否负载均衡
kubectl describe pod <pod名称> -n <命名空间>  # 查看Pod调度过程,排查调度失败原因

# 2. 优化调度策略:使用节点亲和性,引导Pod调度到合适节点
# 编辑Deployment,添加节点亲和性配置
kubectl edit deployment <deployment名称> -n <命名空间>
# 在spec.template.spec中添加
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:  # 调度时必须满足
      nodeSelectorTerms:
      - matchExpressions:
        - key: node-role.kubernetes.io/worker  # 匹配worker节点
          operator: In
          values:
          - worker
    preferredDuringSchedulingIgnoredDuringExecution:  # 优先满足
    - weight: 100
      preference:
        matchExpressions:
        - key: cpu-usage
          operator: Lt
          values:
          - "60"  # 优先调度到CPU使用率低于60%的节点

# 3. 配置Pod反亲和性,避免单个节点部署过多同类Pod
# 在spec.template.spec.affinity中添加
podAntiAffinity:
  preferredDuringSchedulingIgnoredDuringExecution:
  - weight: 100
    podAffinityTerm:
      labelSelector:
        matchExpressions:
        - key: app
          operator: In
          values:
          - nginx  # 避免同一节点部署多个nginx Pod
      topologyKey: kubernetes.io/hostname

# 4. 优化调度器参数,提升调度效率
# 编辑kube-scheduler配置文件(默认在kube-system命名空间)
kubectl edit configmap kube-scheduler-config -n kube-system
# 调整调度器缓存时间、调度周期
apiVersion: kubescheduler.config.k8s.io/v1beta3
kind: KubeSchedulerConfiguration
clientConnection:
  kubeconfig: /etc/kubernetes/scheduler.conf
cacheTTL: 30s  # 调度缓存时间,默认10s,适当延长减少调度开销
leaderElection:
  leaderElect: true
schedulerName: default-scheduler
# 重启kube-scheduler生效
kubectl delete pod -n kube-system -l component=kube-scheduler

1.3 网络优化(核心:降低网络延迟,提升网络吞吐量)

K8s集群的网络通信(Pod之间、Pod与外部)是性能瓶颈之一,尤其是高并发场景下,网络延迟高、吞吐量低,会严重影响应用响应速度。常见问题:网络延迟高、Pod之间通信卡顿、外部访问缓慢。优化方法如下:

bash 复制代码
# 1. 查看网络延迟和吞吐量,定位网络问题
# 测试Pod之间的网络延迟
kubectl exec -it <pod1名称> -n <命名空间> -- ping <pod2 IP> -c 10  # 查看ping延迟
# 测试网络吞吐量
kubectl exec -it <pod名称> -n <命名空间> -- iperf3 -c <目标IP>  # 需安装iperf3

# 2. 替换网络插件(提升网络性能,生产环境推荐)
# 卸载默认的calico/flannel网络插件(以calico为例)
kubectl delete -f https://docs.projectcalico.org/v3.25/manifests/calico.yaml
# 安装高性能网络插件(如cilium,支持eBPF,性能优于calico/flannel)
helm repo add cilium https://helm.cilium.io/
helm install cilium cilium/cilium --version 1.14.0 -n kube-system \
  --set kubeProxyReplacement=strict \
  --set k8sServiceHost=<kube-apiserver IP> \
  --set k8sServicePort=6443

# 3. 优化Service访问性能(减少网络转发开销)
# 对于高频访问的Service,使用NodePort类型时,优化端口范围
kubectl edit configmap kube-apiserver -n kube-system
# 添加NodePort端口范围配置(--service-node-port-range=30000-32767,默认范围,可根据需求调整)
# 对于内部通信的Service,使用ClusterIP类型,避免外部转发开销

# 4. 开启Pod网络加速(针对高并发场景)
# 编辑Pod配置,开启网络加速(需网络插件支持)
kubectl edit pod <pod名称> -n <命名空间>
# 在spec.template.spec中添加
annotations:
  kubernetes.io/network-accelerator: "true"  # 开启网络加速

# 5. 优化DNS解析性能(减少DNS解析延迟)
# 查看DNS解析延迟
kubectl exec -it <pod名称> -n <命名空间> -- nslookup kubernetes.default.svc.cluster.local
# 优化方法1:增加coredns副本数,提升解析能力
kubectl scale deployment coredns -n kube-system --replicas=3
# 优化方法2:配置DNS缓存(在Pod注解中添加)
annotations:
  dnsPolicy: "ClusterFirstWithHostNet"
  dnsConfig:
    options:
    - name: ndots
      value: "2"
    - name: timeout
      value: "1"  # 解析超时时间,单位秒

1.4 存储优化(核心:提升存储读写性能,减少存储开销)

存储性能直接影响应用的读写速度,尤其是数据库、文件服务等对存储敏感的应用,存储性能不足会导致应用响应缓慢。常见问题:存储读写延迟高、持久化存储占用过大、存储资源浪费。优化方法如下:

bash 复制代码
# 1. 查看存储使用情况,定位存储问题
# 查看PV/PVC使用情况
kubectl get pv
kubectl get pvc -n <命名空间>
# 查看Pod存储读写情况(需安装相关工具)
kubectl exec -it <pod名称> -n <命名空间> -- dd if=/dev/zero of=/test/file bs=1M count=100  # 测试写速度

# 2. 选择高性能存储类型(生产环境推荐)
# 替换默认存储为SSD持久化存储(以PV为例)
kubectl edit pv <pv名称>
# 修改storageClassName为ssd,确保后端存储为SSD
spec:
  storageClassName: "ssd"
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 50Gi

# 3. 优化存储挂载参数,提升读写性能
# 编辑PVC,添加挂载参数
kubectl edit pvc <pvc名称> -n <命名空间>
# 在spec中添加
mountOptions:
- noatime  # 禁止更新文件访问时间,减少磁盘IO
- nodiratime  # 禁止更新目录访问时间,减少磁盘IO

# 4. 清理无用存储资源,释放存储空间
# 删除未使用的PV/PVC
kubectl delete pv <无用PV名称>
kubectl delete pvc <无用PVC名称> -n <命名空间>
# 清理Pod临时存储(针对无持久化的Pod)
kubectl exec -it <pod名称> -n <命名空间> -- rm -rf /tmp/*  # 清理临时文件

# 5. 开启存储缓存(针对频繁读写的应用)
# 编辑Deployment,添加存储缓存配置(需存储插件支持)
kubectl edit deployment <deployment名称> -n <命名空间>
# 在spec.template.spec.volumes中添加
volumes:
- name: cache-volume
  emptyDir:
    medium: Memory  # 使用内存作为缓存,提升读写速度

二、稳定性优化:减少故障,确保服务持续可用

K8s集群的稳定性,是生产环境运行的核心保障。小白部署的集群,很容易出现"Pod频繁重启、节点宕机、核心组件故障、服务中断"等问题,影响业务连续性。稳定性优化的核心是"提升集群容灾能力、减少故障发生、快速故障自愈",本节从"高可用部署、Pod自愈优化、核心组件优化、容灾备份"四个维度,讲解稳定性优化的实操方法,确保集群和应用持续可用。

2.1 集群高可用部署(核心:避免单节点故障导致集群瘫痪)

单节点集群(如单master节点)存在严重的单点故障,一旦master节点宕机,整个集群无法操作;单worker节点故障,所有Pod都会不可用。生产环境必须部署高可用集群,优化方法如下:

bash 复制代码
# 1. 部署多master节点(高可用核心)
# 现有单master集群扩容为3个master节点(推荐奇数个,避免脑裂)
# 步骤1:在新的master节点上安装容器运行时(containerd)、kubeadm、kubelet
# 步骤2:初始化新master节点(加入现有集群)
kubeadm join <kube-apiserver IP>:6443 --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash值> \
  --control-plane  # 标记为master节点
# 步骤3:复制原master节点的kubeconfig文件到新master节点
scp /etc/kubernetes/admin.conf <新master节点IP>:/etc/kubernetes/
# 步骤4:验证master节点状态
kubectl get nodes  # 查看所有master节点状态为Ready

# 2. 部署多worker节点,实现负载均衡
# 加入新的worker节点(与master节点加入集群类似)
kubeadm join <kube-apiserver IP>:6443 --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash值>
# 验证worker节点状态
kubectl get nodes

# 3. 配置负载均衡器(针对master节点)
# 部署HAProxy作为master节点的负载均衡器(推荐)
# 安装HAProxy
yum install haproxy -y  # CentOS系统
# 配置HAProxy(vim /etc/haproxy/haproxy.cfg)
frontend kubernetes-frontend
  bind *:6443
  mode tcp
  option tcplog
  default_backend kubernetes-backend
backend kubernetes-backend
  mode tcp
  option tcp-check
  balance roundrobin  # 轮询负载均衡
  server master1 <master1 IP>:6443 check fall 3 rise 2
  server master2 <master2 IP>:6443 check fall 3 rise 2
  server master3 <master3 IP>:6443 check fall 3 rise 2
# 重启HAProxy生效
systemctl restart haproxy
systemctl enable haproxy

# 4. 验证高可用:模拟master节点宕机
kubectl delete pod -n kube-system -l component=kube-apiserver -l node=<master1节点名称>
# 查看集群状态,确认其他master节点正常运行,集群可正常操作

2.2 Pod自愈优化(核心:减少Pod故障,快速恢复)

Pod是应用运行的载体,Pod频繁重启、运行异常,会导致应用服务中断。Pod自愈优化的核心是"提前预防故障、快速自动恢复",优化方法如下:

bash 复制代码
# 1. 配置Pod健康检查(存活探针、就绪探针),及时发现故障Pod
# 编辑Deployment,添加探针配置
kubectl edit deployment <deployment名称> -n <命名空间>
# 在spec.template.spec.containers中添加
livenessProbe:  # 存活探针:检测Pod是否存活,存活则继续运行,否则重启
  httpGet:
    path: /health  # 应用健康检查接口
    port: 80
  initialDelaySeconds: 30  # 容器启动后,延迟30秒开始检测
  periodSeconds: 10  # 每10秒检测一次
  timeoutSeconds: 5  # 检测超时时间5秒
  failureThreshold: 3  # 连续3次检测失败,重启Pod
readinessProbe:  # 就绪探针:检测Pod是否就绪,就绪则接收请求,否则不转发流量
  httpGet:
    path: /ready
    port: 80
  initialDelaySeconds: 10
  periodSeconds: 5

# 2. 配置Pod自动扩缩容(HPA),应对流量波动,避免Pod过载
# 部署metrics-server(HPA依赖)
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 编辑Deployment,配置HPA
kubectl autoscale deployment <deployment名称> -n <命名空间> \
  --min=2 --max=10 --cpu-percent=70  # CPU使用率超过70%,自动扩容;低于70%,自动缩容
# 查看HPA状态
kubectl get hpa -n <命名空间>

# 3. 配置Pod反亲和性和节点亲和性,避免Pod集中部署(减少单点故障影响)
# 参考1.2节Pod调度优化的反亲和性配置,避免同一节点部署多个同类Pod
# 确保Pod分布在不同节点,即使某个节点故障,其他节点的Pod可正常运行

# 4. 优化Pod重启策略,减少不必要的重启
# 编辑Pod配置,设置合理的重启策略
kubectl edit pod <pod名称> -n <命名空间>
spec:
  restartPolicy: Always  # 总是重启(默认),适合应用类Pod
  # 对于一次性任务的Pod,设置为OnFailure(失败时重启)或Never(不重启)

2.3 核心组件优化(核心:确保K8s核心组件稳定运行)

K8s核心组件(kube-apiserver、kube-controller-manager、kube-scheduler、etcd)是集群运行的基础,核心组件故障会导致整个集群异常。优化方法如下:

bash 复制代码
# 1. 优化核心组件资源配置,避免资源不足导致故障
# 编辑核心组件的Deployment/StatefulSet,调整资源限制
# 以kube-apiserver为例
kubectl edit deployment kube-apiserver -n kube-system
spec:
  template:
    spec:
      containers:
      - name: kube-apiserver
        resources:
          requests:
            cpu: 500m
            memory: 1Gi
          limits:
            cpu: 2Gi
            memory: 4Gi  # 根据集群规模调整,避免资源不足

# 2. 配置核心组件日志轮转,避免日志过大占用磁盘
# 编辑核心组件的日志配置(以kube-apiserver为例)
kubectl edit deployment kube-apiserver -n kube-system
spec:
  template:
    spec:
      containers:
      - name: kube-apiserver
        args:
        - --log-dir=/var/log/kubernetes
        - --logtostderr=false
        - --log-rotate-max-files=7  # 保留7个日志文件
        - --log-rotate-max-size=100Mi  # 单个日志文件最大100Mi
# 其他核心组件(kube-controller-manager、kube-scheduler)配置类似

# 3. 优化etcd性能(etcd是集群数据存储核心,性能影响集群稳定性)
# 编辑etcd StatefulSet,优化配置
kubectl edit statefulset etcd -n kube-system
spec:
  template:
    spec:
      containers:
      - name: etcd
        args:
        - --data-dir=/var/lib/etcd
        - --wal-dir=/var/lib/etcd/wal  # 单独挂载wal目录,提升写入性能
        - --snapshot-count=10000  # 每10000次写入生成一次快照
        - --auto-compaction-retention=1h  # 自动压缩数据,保留1小时数据
        resources:
          limits:
            cpu: 1Gi
            memory: 2Gi
# 定期备份etcd数据(参考3.4节容灾备份)

# 4. 配置核心组件自动重启,快速恢复故障
# 编辑核心组件的Deployment,添加重启策略
kubectl edit deployment kube-controller-manager -n kube-system
spec:
  template:
    spec:
      restartPolicy: Always
      containers:
      - name: kube-controller-manager
        livenessProbe:  # 存活探针,故障时自动重启
          httpGet:
            path: /healthz
            port: 10257
            scheme: HTTPS
          initialDelaySeconds: 15
          periodSeconds: 10

2.4 容灾备份(核心:故障时快速恢复集群和数据)

容灾备份是集群稳定性的最后一道保障,即使集群出现严重故障,也能通过备份数据快速恢复,减少业务损失。优化方法如下:

bash 复制代码
# 1. etcd数据备份(核心,集群所有数据都存储在etcd)
# 手动备份etcd数据
kubectl exec -it <etcd-pod名称> -n kube-system -- 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 /var/lib/etcd/etcd-snapshot-$(date +%Y%m%d).db

# 配置定时备份(通过crontab)
# 登录master节点,创建备份脚本
vim /root/etcd-backup.sh
#!/bin/bash
ETCD_POD=$(kubectl get pods -n kube-system -l component=etcd -o jsonpath='{.items[0].metadata.name}')
kubectl exec -it $ETCD_POD -n kube-system -- 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 /var/lib/etcd/etcd-snapshot-$(date +%Y%m%d).db
# 清理7天前的备份文件
find /var/lib/etcd -name "etcd-snapshot-*.db" -mtime +7 -delete

# 给脚本添加执行权限
chmod +x /root/etcd-backup.sh
# 添加定时任务(每天凌晨2点执行备份)
crontab -e
0 2 * * * /root/etcd-backup.sh

# 2. 应用配置备份(Deployment、Service、ConfigMap等)
# 备份指定命名空间的所有资源
kubectl get all,configmap,secret -n <命名空间> -o yaml > app-backup-$(date +%Y%m%d).yaml
# 备份整个集群的所有资源
kubectl get all,configmap,secret --all-namespaces -o yaml > cluster-backup-$(date +%Y%m%d).yaml

# 3. 节点故障恢复(针对worker节点故障)
# 当worker节点宕机,快速替换节点
# 步骤1:删除故障节点
kubectl delete node <故障节点名称>
# 步骤2:部署新的worker节点,加入集群(参考2.1节加入worker节点)
# 步骤3:Pod会自动调度到新的worker节点,恢复服务

# 4. 备份数据恢复(以etcd数据恢复为例)
# 模拟etcd故障,恢复数据
kubectl exec -it <etcd-pod名称> -n kube-system -- 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 restore /var/lib/etcd/etcd-snapshot-20260310.db --data-dir=/var/lib/etcd/restore
# 重启etcd Pod,加载恢复的数据
kubectl delete pod <etcd-pod名称> -n kube-system

三、安全性优化:防范风险,保护集群和应用数据

K8s集群的安全性,是生产环境的重中之重。小白部署的集群,很容易存在"权限配置过宽、镜像不安全、网络无隔离、敏感数据泄露"等安全风险,可能导致集群被攻击、数据被窃取。安全性优化的核心是"最小权限原则、安全隔离、敏感数据保护",本节从"权限控制优化、镜像安全优化、网络安全优化、敏感数据保护"四个维度,讲解安全性优化的实操方法,防范安全风险。

3.1 权限控制优化(核心:最小权限原则,避免权限滥用)

K8s的权限控制核心是RBAC(基于角色的访问控制),小白很容易给用户、Pod分配过高的权限,导致权限滥用,引发安全风险。优化方法如下:

bash 复制代码
# 1. 查看当前权限配置,排查过高权限
# 查看所有ClusterRole和Role
kubectl get clusterroles
kubectl get roles -n <命名空间>
# 查看权限绑定
kubectl get clusterrolebindings
kubectl get rolebindings -n <命名空间>

# 2. 遵循最小权限原则,创建自定义Role/ClusterRole
# 示例:创建一个仅能查看default命名空间Pod的Role
kubectl create role pod-reader -n default --verb=get,list,watch --resource=pods
# 创建RoleBinding,将Role绑定到用户
kubectl create rolebinding pod-reader-binding -n default --role=pod-reader --user=test-user

# 3. 限制Pod的权限(避免Pod拥有过高权限)
# 编辑Pod配置,添加安全上下文,限制Pod权限
kubectl edit pod <pod名称> -n <命名空间>
spec:
  securityContext:
    runAsUser: 1000  # 以普通用户身份运行Pod,避免root用户
    runAsGroup: 1000
    fsGroup: 1000
    allowPrivilegeEscalation: false  # 禁止权限提升
    capabilities:
      drop: ["ALL"]  # 禁用所有额外权限

# 4. 禁止使用特权容器(特权容器拥有主机的所有权限,风险极高)
# 查看所有特权容器
kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[*].securityContext.privileged}{"\n"}{end}' | grep true
# 删除特权容器,或修改配置禁用特权
kubectl edit pod <特权Pod名称> -n <命名空间>
spec:
  containers:
  - name: <容器名称>
    securityContext:
      privileged: false  # 禁用特权

# 5. 限制kubeconfig文件的权限(避免泄露)
# 修改kubeconfig文件权限,仅当前用户可读写
chmod 600 /etc/kubernetes/admin.conf
# 避免将kubeconfig文件泄露给无关人员

3.2 镜像安全优化(核心:避免使用不安全镜像,防范镜像攻击)

镜像是Pod运行的基础,使用不安全的镜像(如恶意镜像、未授权镜像、存在漏洞的镜像),会导致集群被攻击。优化方法如下:

bash 复制代码
# 1. 禁止使用latest标签镜像(latest标签镜像易被篡改,版本不固定)
# 查看所有使用latest标签的Pod
kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[*].image}{"\n"}{end}' | grep :latest
# 修改Pod配置,使用固定版本镜像(如nginx:1.24,而非nginx:latest)
kubectl edit deployment <deployment名称> -n <命名空间>
spec:
  template:
    spec:
      containers:
      - name: nginx
        image: nginx:1.24  # 固定版本,避免使用latest

# 2. 配置镜像拉取策略,禁止拉取未授权镜像
# 编辑Pod配置,设置镜像拉取策略为OnlyIfNotPresent(仅本地没有时拉取)
kubectl edit pod <pod名称> -n <命名空间>
spec:
  containers:
  - name: <容器名称>
    image: <镜像名称:版本>
    imagePullPolicy: OnlyIfNotPresent
# 配置镜像拉取密钥(针对私有仓库,避免未授权拉取)
kubectl create secret docker-registry regcred -n <命名空间> \
  --docker-server=<私有仓库地址> \
  --docker-username=<用户名> \
  --docker-password=<密码>
# 在Pod中引用密钥
kubectl edit pod <pod名称> -n <命名空间>
spec:
  imagePullSecrets:
  - name: regcred

# 3. 扫描镜像漏洞,删除存在高危漏洞的镜像
# 安装镜像扫描工具(如trivy)
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
# 扫描镜像漏洞
trivy image nginx:1.24  # 扫描指定镜像
# 删除存在高危漏洞的镜像,替换为安全镜像
kubectl edit deployment <deployment名称> -n <命名空间>
# 将存在漏洞的镜像替换为无高危漏洞的版本

# 4. 禁止拉取外部镜像(生产环境推荐,仅允许拉取内部私有仓库镜像)
# 配置PodSecurityPolicy,禁止拉取外部镜像(需开启PodSecurityPolicy插件)
kubectl create podsecuritypolicy restrict-external-images \
  --allow-privilege-escalation=false \
  --default-allow-privilege-escalation=false \
  --required-drop-capabilities=ALL \
  --allowed-images=<私有仓库地址>/*  # 仅允许拉取内部私有仓库镜像

3.3 网络安全优化(核心:网络隔离,防范网络攻击)

K8s集群的网络默认是开放的,Pod之间、Pod与外部之间可以自由通信,容易引发网络攻击(如端口扫描、恶意访问)。优化方法如下:

bash 复制代码
# 1. 配置网络策略(NetworkPolicy),实现网络隔离
# 示例:创建NetworkPolicy,仅允许default命名空间的nginx Pod被同命名空间的web Pod访问
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: nginx-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: nginx  # 目标Pod标签
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: web  # 仅允许app=web的Pod访问
    ports:
    - protocol: TCP
      port: 80  # 仅允许访问80端口
EOF

# 2. 限制Pod的网络访问端口,仅开放必要端口
# 编辑Pod配置,限制容器开放的端口
kubectl edit pod <pod名称> -n <命名空间>
spec:
  containers:
  - name: <容器名称>
    ports:
    - containerPort: 80  # 仅开放必要的80端口,关闭其他无用端口

# 3. 禁止Pod访问外部网络(针对不需要外部访问的Pod)
# 配置NetworkPolicy,禁止Pod访问外部网络
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-external-network
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: internal-app  # 不需要外部访问的Pod标签
  policyTypes:
  - Egress
  egress:
  - to:
    - podSelector: {}  # 仅允许访问同命名空间的Pod
EOF

# 4. 配置防火墙,限制集群节点的网络访问
# 登录节点,配置防火墙(以firewalld为例)
ssh <节点IP>
systemctl start firewalld
systemctl enable firewalld
# 开放必要端口(如6443、2379、10250等K8s核心端口)
firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379/tcp
firewall-cmd --permanent --add-port=10250/tcp
# 关闭无用端口
firewall-cmd --permanent --remove-port=8080/tcp
# 重新加载防火墙
firewall-cmd --reload

3.4 敏感数据保护(核心:避免敏感数据泄露)

生产环境中,Pod往往需要使用敏感数据(如数据库密码、API密钥、证书),小白很容易将敏感数据直接写在配置文件中,导致数据泄露。优化方法如下:

bash 复制代码
# 1. 使用Secret存储敏感数据,替代明文配置
# 创建Secret,存储数据库密码和API密钥
kubectl create secret generic app-secrets -n <命名空间> \
  --from-literal=db-password=Admin@123 \
  --from-literal=api-key=abc123456
# 在Pod中引用Secret(通过环境变量)
kubectl edit deployment <deployment名称> -n <命名空间>
spec:
  template:
    spec:
      containers:
      - name: <容器名称>
        env:
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: app-secrets
              key: db-password
        - name: API_KEY
          valueFrom:
            secretKeyRef:
              name: app-secrets
              key: api-key

# 2. 使用ConfigMap存储非敏感配置,分离敏感与非敏感数据
# 创建ConfigMap,存储应用非敏感配置(如端口、日志级别)
kubectl create configmap app-config -n <命名空间> \
  --from-literal=app-port=80 \
  --from-literal=log-level=info
# 在Pod中引用ConfigMap
kubectl edit deployment <deployment名称> -n <命名空间>
spec:
  template:
    spec:
      containers:
      - name: <容器名称>
        env:
        - name: APP_PORT
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: app-port

# 3. 加密Secret数据(避免Secret明文存储)
# 编辑K8s加密配置文件,创建加密密钥
vim /etc/kubernetes/encryption-config.yaml
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
  - secrets
  providers:
  - aescbc:
      keys:
      - name: key1
        secret: <生成的AES密钥>  # 使用openssl rand -hex 32生成密钥
  - identity: {}
# 编辑kube-apiserver配置,引用加密配置文件
kubectl edit deployment kube-apiserver -n kube-system
spec:
  template:
    spec:
      containers:
      - name: kube-apiserver
        args:
        - --encryption-provider-config=/etc/kubernetes/encryption-config.yaml
# 重启kube-apiserver生效
kubectl delete pod -n kube-system -l component=kube-apiserver
# 重新创建Secret,使其被加密存储
kubectl delete secret app-secrets -n <命名空间>
kubectl create secret generic app-secrets -n <命名空间> \
  --from-literal=db-password=Admin@123 \
  --from-literal=api-key=abc123456

# 4. 限制Secret的访问权限,仅授权用户和Pod可访问
# 创建Role,仅允许查看和使用Secret
kubectl create role secret-user -n <命名空间> --verb=get,use --resource=secrets
# 创建RoleBinding,绑定到指定用户和Pod
kubectl create rolebinding secret-user-binding -n <命名空间> --role=secret-user --user=test-user

四、生产环境优化最佳实践(面试必问)

结合前面的性能、稳定性、安全性优化实操,本节总结生产环境K8s集群优化的最佳实践,帮助小白规范优化流程,避免踩坑,同时应对面试提问,重点关注"高效、稳定、安全"三个核心目标。

4.1 优化流程规范化

  • 先监控后优化:优化前,通过Prometheus+Grafana监控集群和应用的性能、资源使用情况,定位优化痛点,避免盲目优化;

  • 先测试后上线:所有优化操作(如网络插件替换、资源配置调整),先在测试环境验证,确认无问题后再在生产环境实施;

  • 逐步优化,避免一次性大改:集群优化是一个持续的过程,逐步调整优化参数,观察优化效果,避免一次性修改过多配置导致集群故障。

4.2 性能优化最佳实践

  • 资源配置合理化:根据应用需求,合理设置Pod的资源请求和限制,避免资源浪费和资源不足;节点资源预留合理,确保K8s核心组件和系统正常运行;

  • 网络插件选型:生产环境优先选择高性能网络插件(如cilium),支持eBPF,降低网络延迟,提升吞吐量;

  • 存储选型:对存储敏感的应用(如数据库),使用SSD持久化存储,优化存储挂载参数,开启存储缓存;

  • 定期清理:定期清理无用的Pod、PV/PVC、日志文件,释放资源,避免资源占用过高。

4.3 稳定性优化最佳实践

  • 高可用部署:生产环境必须部署多master、多worker节点,配置负载均衡器,避免单点故障;

  • Pod自愈机制:所有应用Pod必须配置存活探针和就绪探针,配置HPA自动扩缩容,应对流量波动;

  • 核心组件保障:优化核心组件的资源配置,配置日志轮转和自动重启,定期备份etcd数据;

  • 定期巡检:定期查看集群状态、节点资源、应用运行情况,提前发现潜在问题,避免故障发生。

4.4 安全性优化最佳实践

  • 最小权限原则:所有用户、Pod、组件都分配最小必要权限,禁止使用特权容器,限制权限提升;

  • 镜像安全:使用固定版本镜像,扫描镜像漏洞,仅允许拉取内部私有仓库镜像,禁止使用不安全镜像;

  • 网络隔离:配置NetworkPolicy,实现Pod之间、Pod与外部的网络隔离,限制不必要的网络访问;

  • 敏感数据保护:使用Secret存储敏感数据,加密Secret存储,限制Secret的访问权限,避免敏感数据泄露。

五、K8s系列全套总结(圆满收官)

至此,K8s系列实战文章(共15篇)已全部更新完毕,从K8s基础入门到核心实战,从"能用K8s"到"用好K8s",全程贴合小白学习节奏,以"实操为主、命令可复制、场景化讲解"为核心,覆盖了K8s运维的全流程核心模块,帮你彻底掌握K8s运维技能,适配生产环境需求和面试重点。

回顾整个系列,我们共分为5个核心阶段,梳理如下,方便你回顾复习:

第一阶段:基础入门(第1-3篇)------ 搭建K8s基础环境

核心内容:K8s核心概念(Pod、Deployment、Service等)、单节点/多节点集群部署、kubectl基础命令,帮你快速入门K8s,搭建基础运行环境,掌握K8s的核心思想和基础操作,解决"会用K8s"的第一步。

第二阶段:核心组件与应用部署(第4-7篇)------ 掌握应用部署与调度

核心内容:K8s核心组件(kube-apiserver、etcd等)工作原理、应用部署(Deployment、StatefulSet)、服务暴露(NodePort、LoadBalancer、Ingress)、应用调度与自愈,帮你掌握应用在K8s中的部署、访问和调度方法,实现应用的高可用部署。

第三阶段:应用运维基础(第8-10篇)------ 保障应用正常运行

核心内容:应用健康检查、资源限制与请求、日志收集(EFK/ELK),帮你掌握应用的日常运维方法,及时发现应用故障,控制应用资源消耗,收集应用日志,为后续故障排查提供支撑。

第四阶段:监控与故障排查(第11-14篇)------ 快速发现并解决问题

核心内容:Prometheus+Grafana监控告警部署与配置、故障排查核心思路与常用命令、常见故障实战排查、排查工具推荐,帮你搭建"监控→告警→排查→解决"的完整运维闭环,彻底解决"遇到故障无从下手"的痛点。

第五阶段:集群优化(第15篇,本篇)------ 用好K8s,适配生产需求

核心内容:性能优化、稳定性优化、安全性优化,帮你优化集群性能,提升集群稳定性,防范安全风险,搭建一个高效、稳定、安全的K8s集群,实现从"能用K8s"到"用好K8s"的跨越,适配生产环境的高要求。

学习K8s的核心是"多实操、多总结、多复盘",前面15篇文章的命令均可直接复制执行,建议你结合实际环境,反复实操每一个案例,熟悉每一个命令的作用,理解每一个配置的含义,遇到问题时,结合故障排查思路,主动解决问题,逐步积累运维经验。

K8s是容器编排领域的主流技术,也是运维工程师、云原生工程师的核心技能之一,掌握K8s运维全流程,能极大提升你的职场竞争力。本系列文章旨在帮你快速入门、快速上手,后续你可以深入学习K8s进阶知识(如K8s集群联邦、Istio服务网格、云原生存储等),不断提升自己的技术水平。

最后,感谢你一路的陪伴和支持,希望本系列文章能对你的K8s学习之旅有所帮助,祝你在云原生的道路上越走越远,早日成为K8s运维高手!

相关推荐
CIAS2 小时前
openclaw 扩展企业微信模块
docker·openclaw
回到原点的码农2 小时前
Node.js 与 Docker 深度整合:轻松部署与管理 Node.js 应用
docker·容器·node.js
cyber_两只龙宝3 小时前
【Docker】搭建Docker私有Registry仓库全流程详解
linux·运维·docker·容器·私有仓库
Mr-Wanter3 小时前
IDEA 借助 docker-compose.yml 一键打包镜像并推送到开发服务器(前端部署终极方案)
服务器·docker·docker-compose·intellij-idea
我爱学习好爱好爱3 小时前
ELK 7.17.10 收集Docker Compose部署的SpringBoot2+Vue3项目日志(Rockylinux9.6)
elk·docker·容器
sugar15693 小时前
Trae ied为项目完善Docker Compose本地开发运行测试
运维·docker·容器
鸠摩智首席音效师14 小时前
如何使用 docker exec 在容器中运行命令 ?
运维·docker·容器
Hoking15 小时前
TimescaleDB(PostgreSQL)流复制集群容器化部署(docker-compose)
docker·postgresql·timescaledb·流复制
cool320016 小时前
Kubernetes基础入门教程
容器·云计算·k8s