二十、kubernetes 1.29 之 运维

一、临时容器

1、概念

2、特性

3、类型

增加一个临时容器

通过pod副本调试

在改变 Pod命令时创建Pod副本

在更改容器镜像时拷贝Pod

在同一个节点上创建 pod进行调试

二、端口转发

调试好助手

1、基本要求

2、用法

3、特别

三、审计功能

记录集群内安全相关的时序操作,包括「操作人、时间、资源、操作类型、结果」等,用于事后追溯、异常检测和安全合规。

1、起因

2、基本概念

3、阶段

4、级别

5、实验

条件

kubernetes在v1.7中支持了日志审计功能(Alpha),在v1.8中为Beta版本,v1.12为GA版本
创建审计策略文件

创建目录mkdir /etc/kubernetes/audit-logs/、mkdir /etc/kubernetes/audit-policy

vi /etc/kubernetes/audit-policy/policy.yaml

复制代码
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
  # 设置机密资源的审计日志级别为Metadata
  - level: Metadata
    resources:
    - group: ""
      resources: ["secrets"]
  # 对于其他内容,不要记录任何内容
  - level: None

更多配置参考:https://kubernetes.io/zh-cn/docs/reference/config-api/apiserver-audit.v1/#audit-k8s-io-v1-Policy
添加审计日志 通过对 kube-apiserver.yaml 的配置开启后端审计日志

vi /etc/kubernetes/manifests/kube-apiserver.yaml

添加

复制代码
spec:
  containers:
  - command:
    - kube-apiserver
    - --audit-policy-file=/etc/kubernetes/audit-policy/policy.yaml
    - --audit-log-path=/etc/kubernetes/audit-logs/audit.log
    - --audit-log-maxsize=7
    - --audit-log-maxbackup=2
    volumeMounts:
    - mountPath: /etc/kubernetes/audit-policy/policy.yaml
      name: audit-policy
      readOnly: true
    - mountPath: /etc/kubernetes/audit-logs
      name: audit-logs
      readOnly: false
  volumes:
  - name: audit-policy
    hostPath:
      path: /etc/kubernetes/audit-policy/policy.yaml
      type: File
  - name: audit-logs
    hostPath:
      path: /etc/kubernetes/audit-logs
      type: DirectoryOrCreate

稍后,get pod -A

已经出现记记录日志了

四、安全参数

显示对应的特权集

1、主机共享

1、启用 hostNetwork 的 Pod 清单

共享主机网络

创建资源清单,注意端口冲突

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: hostnetwork-pod  # 自定义Pod名称
spec:
  hostNetwork: true  # 启用主机网络,Pod直接使用宿主机网络命名空间
  containers:
  - name: myapp-container
    image: wangyanglinux/myapp:v1.0  # 文档指定镜像

启动、用主机的ip

2. 配置 hostPort 的 Pod 清单

复制代码
Pod 内部容器的指定端口(containerPort)映射到运行该 Pod 的宿主机端口(hostPort),实现外部通过「宿主机 IP + 映射的 hostPort 端口」直接访问 Pod 内的应用,打破 Pod 网络隔离对外部访问的限制。

创建、启动

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: hostport-pod  # 自定义Pod名称
spec:
  containers:
  - name: myapp-container
    image: wangyanglinux/myapp:v1.0  # 文档指定镜像
    ports:
    - containerPort: 80  # Pod容器内部端口
      hostPort: 8080  # 映射到宿主机的端口,外部可通过宿主机IP:8080访问

3. 启用 hostPID 和 hostIPC 的 Pod 清单

复制代码
hostPID 和 hostIPC 是 Kubernetes 里给 Pod 开的 "特殊权限开关",作用是让 Pod 直接 "融入" 宿主机的系统层级,和宿主机共享核心资源

apiVersion: v1
kind: Pod
metadata:
  name: hostpid-hostipc-pod  # 文档指定Pod名称
spec:
  hostPID: true  # 启用主机PID命名空间,Pod内可看到宿主机所有进程
  hostIPC: true  # 启用主机IPC命名空间,Pod内可与宿主机及其他共享该命名空间的Pod进行IPC通信
  containers:
  - name: myapp-container
    image: wangyanglinux/myapp:v1.0  # 文档指定镜像

2、安全上下文

1. 使用特定用户运行 Pod

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: user-id-pod
spec:
  containers:
  - name: myapp-container
    image: wangyanglinux/myapp:v1.0
    command: ["/bin/sleep", "9999"]  # 保持容器运行
    securityContext:
      runAsUser: 405  # 指定运行容器的用户 UID

不加用户id

加用户id

2. 阻止容器以 root 用户运行(场景 1:镜像默认非 root)

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: non-root-user-pod-true
spec:
  containers:
  - name: myapp-container
    image: wangyanglinux/myapp:v1.0-nonroot  # 非 root 基础镜像
    securityContext:
      runAsNonRoot: true  # 强制禁止 root 运行
      runAsUser: 102      # 明确指定非 root 用户 UID

3. 允许容器以特权模式运行

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: privileged-container
spec:
  containers:
  - name: privileged-container
    image: wangyanglinux/myapp:v1.0
    securityContext:
      privileged: true  # 启用特权模式,容器拥有宿主机几乎所有权限

伪root,

root特权

4. 为容器单独添加内核功能

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: sys-time-pod
spec:
  containers:
  - name: sys-time-container
    image: wangyanglinux/myapp:v1.0
    securityContext:
      capabilities:
        add: ["NET_ADMIN"]  # 新增 NET_ADMIN 内核功能(如网络配置权限)

不加的话没有权限(修改ip)

有权限

5. 在容器中禁用特定内核功能

不让调整用户和组

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: disable-chown-pod
spec:
  containers:
  - name: nginx-container
    image: wangyanglinux/myapp:v1.0
    securityContext:
      capabilities:
        drop: ["CHOWN"]  # 禁用 CHOWN 内核功能(禁止修改文件所有者)

6. 阻止对容器根文件系统的写入

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-readonly-filesystem
spec:
  containers:
  - name: main
    image: wangyanglinux/myapp:v1.0
    command: ["/bin/sleep", "9999"]
    securityContext:
      readOnlyRootFilesystem: true  # 容器根文件系统设为只读
    volumeMounts:
    - name: temp-volume
      mountPath: /volume# 仅允许 /volume目录可写(挂载临时存储)
      readOnly: false
  volumes:
  - name: temp-volume
    emptyDir: {}  # 临时存储卷(容器内可写)

只能修改特定目录

7. 配置 fsGroup 与 supplementalGroups(共享存储权限)

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-shared-volume-fsgroup
spec:
  securityContext:
    fsGroup: 555                # 共享存储的属组 ID(挂载后文件属组为 555)
    supplementalGroups: [666,777]  # 补充属组(容器内进程额外加入 666、777 组)
  containers:
  - name: first
    image: wangyanglinux/tools:alpine
    command: ["/bin/sleep", "9999"]
    securityContext:
      runAsUser: 1111  # 容器运行用户 UID
    volumeMounts:
    - name: shared-volume
      mountPath: /volume
      readOnly: false
  - name: second
    image: wangyanglinux/tools:alpine
    command: ["/bin/sleep", "9999"]
    securityContext:
      runAsUser: 2222  # 第二个容器的运行用户 UID
    volumeMounts:
    - name: shared-volume
      mountPath: /volume
      readOnly: false
  volumes:
  - name: shared-volume
    emptyDir: {}  # 共享临时存储卷

3、PodSecurity Admission

3.1 引入

3.2 三种策略

3.3 三种模式

3.4 设置模版

3.5 示例演示-Baseline


创建名为my-baseline-namespace的namespace,并设定enforrce和warn两种模式都对应

Baseline等级的Pod安全标准策略

复制代码
apiVersion: v1
kind: Namespace
metadata:
  name: my-baseline-namespace
  labels:
    pod-security.kubernetes.io/enforce: baseline
    pod-security.kubernetes.io/enforce-version: v1.29
    # pod-security.kubernetes.io/warn: baseline
    # pod-security.kubernetes.io/warn-version: v1.29

创建一个违反baseline策略的pod

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: hostnamespaces2
  namespace: my-baseline-namespace
spec:
  containers:
  - image: wangyanglinux/myapp:v1.0
    name: myapp
    securityContext:
      privileged: true
  hostPID: true


3.6 示例演示-Restricted --严厉


创建名为my-restricted-namespace的namespace,并设定enforce和warn两种模式都对应

Restricted等级的Pod安全标准策略

复制代码
apiVersion: v1
kind: Namespace
metadata:
  name: my-restricted-namespace
  labels:
    pod-security.kubernetes.io/enforce: restricted
    pod-security.kubernetes.io/enforce-version: v1.29
    #pod-security.kubernetes.io/warn: restricted
    #pod-security.kubernetes.io/warn-version: v1.29

创建一个违反Restricted策略的pod

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: runasnonroot0
  namespace: my-restricted-namespace
spec:
  containers:
  - image: wangyanglinux/myapp:v1.0
    name: myapp
    securityContext:
      allowPrivilegeEscalation: false
  securityContext:
    seccompProfile:
      type: RuntimeDefault

创建不违反Restricted策略的pod,设定Pod的securityContext.runAsNonRoot=true,Drop所有

linux能力

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: runasnonroot0
  namespace: my-restricted-namespace
spec:
  containers:
  - name: myapp
    image: wangyanglinux/myapp:v1.0-nonroot
    securityContext:
      runAsNonRoot: true
      runAsUser: 102
      allowPrivilegeEscalation: false
      capabilities:
        drop:
        - ALL
  securityContext:
    runAsNonRoot: true
    seccompProfile:
      type: RuntimeDefault

3.7 局限

五、资源限制

1、概念

2、定义案例

3、特性

4、HPA

必要,能够显示资源使用量

创建控制器

复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: my-container
        image: wangyanglinux/hpa:v1
        resources:
          requests:
            cpu: 200m

注意所需镜像
命令 1:kubectl autoscale deployment my-deployment --cpu-percent=50 --min=2 --max=10

  • 作用 :为 my-deployment 这个 Deployment 创建水平 Pod 自动扩缩器(HPA),实现基于 CPU 使用率的自动扩缩容。
  • 参数解释
    • --cpu-percent=50:当 Pod 的 CPU 使用率超过 50% 时,触发扩容 ;若使用率低于阈值,触发缩容
    • --min=2:Pod 副本数的最小值保持为 2,即使负载极低也至少维持 2 个副本保障服务。
    • --max=10:Pod 副本数的最大值不超过 10,避免无限制扩容导致资源耗尽。

命令 2:kubectl run -i --tty work --image=busybox /bin/sh

  • 作用 :创建一个名为 work 的 Pod,基于 busybox 镜像启动,并进入交互式终端环境(方便执行后续测试命令)。
  • 参数解释
    • -i --tty:启用交互式终端(类似 ssh 登录后的交互体验)。
    • --image=busybox:指定基础镜像(busybox 是一个极简的 Linux 工具集镜像,适合做测试)。
    • /bin/sh:容器启动后执行的命令,进入 Shell 环境。

命令 3:while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done

  • 作用 :在 work Pod 的 Shell 环境中,无限循环发送 HTTP 请求,模拟高流量负载,用于触发前面创建的 HPA 扩容逻辑。
  • 参数解释
    • while true:无限循环执行后续命令。
    • wget -q -O-:静默下载(-q 隐藏日志)并输出内容(-O- 表示输出到标准输出)。
    • http://php-apache.default.svc.cluster.local:目标服务的 ClusterIP 地址(Kubernetes 内部服务访问格式),这里用于对 php-apache 服务发起持续请求,压满其 CPU 资源以触发 HPA 扩容。
      信息更新和自动删除会慢一点

5、Pod QoS等级

5.1 besteffort -- 低

5.2 Burstable -- 中

5.3 Guaranteed-- 高

5.4 示意图

5.5 单容器--分派表

5.6 多容器 -- 分配表

5.7 谁被干死

6、LimitRange

6.1 概念

LimitRange 的核心作用是在命名空间内强制资源配置的合理性,避免 Pod / 容器无限制申请资源或资源配置过低导致调度 / 运行异常,是 Kubernetes 资源管理的重要手段之一。

6.2 案例

解释

pod

复制代码
# 第一个 Pod 资源清单
apiVersion: v1
kind: Pod
metadata:
  name: resource-limited-pod
spec:
  containers:
  - name: my-container
    image: wangyanglinux/myapp:v1.0
    resources:
      requests:
        cpu: "200m"
        memory: "128Mi"
      limits:
        cpu: "500m"
        memory: "256Mi"
---

# 第二个 Pod 资源清单
apiVersion: v1
kind: Pod
metadata:
  name: resource-limited-default-pod
spec:
  containers:
  - name: my-container
    image: wangyanglinux/myapp:v1.0

7、ResourceQuota

7.1 概念

ResourceQuota 的核心作用是在命名空间维度进行资源总量管控,防止单个团队 / 项目过度占用集群资源,是 Kubernetes 多租户资源隔离与治理的关键工具之一。

7.2 案例

解释

相关推荐
pccai-vip15 小时前
架构论文《论负载均衡的设计与应用》
运维·架构·负载均衡
zmjjdank1ng15 小时前
k8s问答题(1)
云原生·容器·kubernetes
Dotrust东信创智16 小时前
从“手动试错”到“自动化闭环”:实车OTA测试的效率革命
运维·自动化
matrixlzp16 小时前
Jenkins 实战4:集群配置与分布式构建
运维·jenkins
远程软件小帮手16 小时前
哪个云电脑最好用?适合玩游戏的云电脑测评!
运维·服务器·游戏·电脑
行思理17 小时前
本地用docker开发的php 程序如何部署到阿里云的ecs上
阿里云·docker·容器
脚踏实地的大梦想家17 小时前
【Docker】P5 Docker Compose 实战指南:一键部署 WordPress + MySQL
mysql·docker·容器
wanhengidc18 小时前
云手机中的数据信息会被泄露吗
运维·服务器·安全·智能手机·玩游戏
闲人编程18 小时前
现代Python开发环境搭建(VSCode + Dev Containers)
开发语言·vscode·python·容器·dev·codecapsule