前言

【云原生 | Kubernetes 系列】K8s 实战 实施Pod 容器标准的两种方式-LMLPHP

上一节学习了 PodSecurity ,本篇文章功能,首先要确保PodSecurity 特性已经被启用。

1、特权(privileged)、 基线(baseline)和 受限(restricted) 这三种策略涵盖了广泛安全范围,并由 Pod 安全 准入控制器实现。

2、在 v1.22 版本中,Kubernetes 提供一种内置的准入控制器 用来强制实施 Pod 安全标准。 你可以配置此准入控制器来设置集群范围的默认值和豁免选项。


一、通过名字空间标签来要求实施 baseline Pod 容器标准

下面的清单定义了一个 my-baseline-namespace 名字空间,其中

  • 阻止任何不满足 baseline 策略要求的 Pods
  • 针对任何无法满足 restricted 策略要求的、已创建的 Pod 为用户生成警- 告信息, 并添加审计注解;
  • baselinerestricted 策略的版本锁定到 v1.24。
apiVersion: v1
kind: Namespace
metadata:
  name: my-baseline-namespace
  labels:
    pod-security.kubernetes.io/enforce: baseline
    pod-security.kubernetes.io/enforce-version: v1.24

    # 我们将这些标签设置为我们所 _期望_ 的 `enforce` 级别
    pod-security.kubernetes.io/audit: restricted
    pod-security.kubernetes.io/audit-version: v1.24
    pod-security.kubernetes.io/warn: restricted
    pod-security.kubernetes.io/warn-version: v1.24

1.1、使用 kubectl label 为现有名字空间添加标签

在刚开始为名字空间评估安全性策略变更时,使用 --dry-run 标志是很有用的。 Pod 安全性标准会在 dry run(试运行) 模式下运行,在这种模式下会生成新策略如何处理现有 Pod 的信息, 但不会真正更新策略。

1.2、应用到所有名字空间

如果你是刚刚开始使用 Pod 安全性标准,一种比较合适的初始步骤是针对所有名字空间为类似 baseline 这种比较严格的安全级别配置审计注解。

注意,这里没有设置 enforce 级别,因而没有被显式评估的名字空间可以被识别出来。 你可以使用下面的命令列举那些没有显式设置 enforce 级别的名字空间:

1.3、应用到单个名字空间

你也可以更新特定的名字空间。下面的命令将 enforce=restricted 策略应用到 my-existing-namespace 名字空间,将 restricted 策略的版本锁定到 v1.24。

二、通过配置内置准入控制器实施 Pod 安全标准

目前配置准入控制器,主要分为两个版本,一个是v1.23+ 版本的v1beta1,一个是 v1.22 版本的v1alpha1配置方式,下面我们来看一下这两种配置方式:

  1. v1.23+ 版本的v1beta1:
apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: PodSecurity
  configuration:
    apiVersion: pod-security.admission.config.k8s.io/v1beta1
    kind: PodSecurityConfiguration
    # 当未设置 mode 标签时会应用的默认设置
    #
    # level 标签必须是以下取值之一:
    # - "privileged" (默认)
    # - "baseline"
    # - "restricted"
    #
    # version 标签必须是如下取值之一:
    # - "latest" (默认) 
    # - 诸如 "v1.24" 这类版本号
    defaults:
      enforce: "privileged"
      enforce-version: "latest"
      audit: "privileged"
      audit-version: "latest"
      warn: "privileged"
      warn-version: "latest"
    exemptions:
      # 要豁免的已认证用户名列表
      usernames: []
      # 要豁免的运行时类名称列表
      runtimeClasses: []
      # 要豁免的名字空间列表
      namespaces: []
  1. v1.22 版本的v1alpha1配置:
apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: PodSecurity
  configuration:
    apiVersion: pod-security.admission.config.k8s.io/v1alpha1
    kind: PodSecurityConfiguration
    # 当未设置 mode 标签时会应用的默认设置
    #
    # level 标签必须是以下取值之一:
    # - "privileged" (默认)
    # - "baseline"
    # - "restricted"
    #
    # version 标签必须是如下取值之一:
    # - "latest" (默认) 
    # - 诸如 "v1.24" 这类版本号
    defaults:
      enforce: "privileged"
      enforce-version: "latest"
      audit: "privileged"
      audit-version: "latest"
      warn: "privileged"
      warn-version: "latest"
    exemptions:
      # 要豁免的已认证用户名列表
      usernames: []
      # 要豁免的运行时类名称列表
      runtimeClasses: []
      # 要豁免的名字空间列表
      namespaces: []

两种配置的方式,区别并不大,一个bate版本,一个alpha版本。

总结

本篇文章主要讲解了实施Pod 容器标准的两种方式,写到这里,对于配置pod 和容器的相关功能点,已经全部写完了,从下一篇文章开始,我们将一起学习如何管理 Kubernetes 对象,相关的知识模块。

08-08 14:37