
一、临时容器
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 用户 UID3. 允许容器以特权模式运行
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
- 作用 :在
workPod 的 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 案例
解释


































