二十、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 案例

解释

相关推荐
岚天start几秒前
Nginx内置变量详解
运维·nginx
wanhengidc12 分钟前
跨境电商为什么依赖于云手机
运维·服务器·游戏·智能手机·云计算
翼龙云_cloud15 分钟前
亚马逊云渠道商:aws安全组没有加ip用ip访问会有什么问题?
运维·tcp/ip·安全·云计算·aws
@菜菜_达1 小时前
Nginx错误拦截转发 error_page
运维·nginx
云计算老刘1 小时前
10. Linux 系统启动原理
linux·运维·服务器
任聪聪2 小时前
Centos平替系统RockyLinux详细安装教程
linux·运维·centos
三天不学习2 小时前
GitLab Docker 安装完整配置项说明
docker·容器·gitlab
zjj5873 小时前
ubuntu虚拟内存
linux·运维·ubuntu
终端行者3 小时前
Nginx 配置Websocket代理 Nginx 代理 Websocket
运维·websocket·nginx
瑶总迷弟4 小时前
在centos上基于kubeadm部署单master的k8s集群
linux·kubernetes·centos