Gatekeeper

本节以 Gatekeeper 为例,介绍如何将 Helm Chart 迁移为 KubeSphere 平台的扩展组件。

本示例不涉及对 KubeSphere UI 的扩展。将 Gatekeeper 的 Helm Chart 转换为 KubeSphere 扩展组件之后,就可以通过 KubeSphere 扩展市场,将其安装部署到 KubeSphere 纳管的集群之中,以便统一管理。

本示例源代码:https://github.com/kubesphere-extensions/gatekeeper/tree/master/charts/gatekeeper

Gatekeeper 是什么

Open Policy Agent (OPA) 是一种开源通用策略引擎,可统一整个堆栈中的策略实施。OPA 提供了一种高级声明性语言,支持通过简单的代码定义策略。

Gatekeeper 是一个基于 OPA 构建在 K8s admission webhook 机制之上的安全策略管理工具,能够在不牺牲开发敏捷性和操作独立性的前提下确保集群的安全合规。

例如,在 K8s 集群中可以执行以下策略:

  • 所有的容器镜像必须来自可信的镜像仓库。
  • 所有 ingress 的 host name 必须是全局唯一的。
  • 所有的 pod 必须配置 limit 和 request。
  • 不允许挂载 host path。

OPA 社区已经提供了 Gatekeeper 的 Helm Chart,通过以下步骤即可将其快速集成到 KubeSphere 扩展市场。

使用 ksbuilder 创建扩展组件包

➜  charts git:(master) ksbuilder create
Please input extension name: gatekeeper
✔ security
Please input extension author: hongming
Please input Email (optional): hongming@kubesphere.io
Please input author's URL (optional): 
Directory: /Users/hongming/GitHub/gatekeeper/charts/gatekeeper

通过上述命令创建扩展组件的主 Chart,ksbuilder 会初始化一个基础的扩展组件包目录结构,还需要在此基础之上进行调整。

├── CHANGELOG.md
├── CHANGELOG_zh.md
├── README.md
├── README_zh.md
├── applicationclass.yaml
├── charts
│   ├── backend
│   │   ├── Chart.yaml
│   │   ├── templates
│   │   └── values.yaml
│   └── frontend
│       ├── Chart.yaml
│       ├── templates
│       └── values.yaml
├── extension.yaml
├── permissions.yaml
├── static
│   ├── favicon.svg
│   └── screenshots
│       └── screenshot.png
└── values.yaml

编排 KubeSphere 扩展组件包

接下来简单整理这个初始目录结构。扩展组件中不包含前后端的扩展,因此需要将 Gatekeeper 的 Chart 作为子 Chart 在 KubeSphere 纳管的集群中进行安装部署。由于 GitHub 连接的不稳定性,请直接下载 Gatekeeper 的 Chart 包。

cd gatekeeper
# 移除用不到的 subchart、静态资源目录、模板文件等等
rm -rf charts/* static applicationclass.yaml
# 将 gatekeeper chart 保存到 charts 目录中
curl -o charts/gatekeeper-3.14.0.tgz https://open-policy-agent.github.io/gatekeeper/charts/gatekeeper-3.14.0.tgz

现在 KubeSphere 扩展组件包已经包含了一个主 Chart 和一个子 Chart,接下来需要在 extension.yaml 中配置扩展组件的元数据信息,请参考扩展组件 extension.yaml 的定义

与 Helm 不同的是,KubeSphere 扩展组件包需要在 extension.yaml 文件中定义元数据信息。相比于 Helm Chart 中的 Chart.yamlextension.yaml 可以定义更多的配置信息。

apiVersion: kubesphere.io/v1alpha1
name: gatekeeper
version: 0.1.0
displayName:
  en: Gatekeeper
description:
  zh: Gatekeeper 是一个基于 OPA 的安全策略管理工具
  en: Gatekeeper is a security policy management tool based on OPA
category: security
keywords:
  - security
  - gatekeeper
  - opa
  - admission webhook
home: https://kubesphere.io
sources:
  - https://github.com/kubesphere-extensions/gatekeeper
kubeVersion: ">=1.19.0-0"
ksVersion: ">=4.0.0-0"
maintainers:
  - name: "hongming"
    email: hongming@kubesphere.io
provider:
  en:
    name: "hongming"
    email: kubesphere@yunify.com
  zh:
    name: 北京青云科技股份有限公司
    email: kubesphere@yunify.com
icon: https://open-policy-agent.github.io/gatekeeper/website/img/logo.svg
dependencies:
  - name: gatekeeper
    tags:
    - agent
# installationMode describes how to install subcharts, it can be HostOnly or Multicluster.
# In Multicluster mode, the subchart with tag `extension` will only be deployed to the host cluster,
# and the subchart with tag `agent` will be deployed to all selected clusters.
installationMode: Multicluster

参考 permissions.yaml 的定义 根据 Gatekeeper Helm Chart 中的模板文件整理出安装部署时所需的权限列表,在 permissions.yaml 中进行配置:

展开 permissions.yaml

Gatekeeper 是一个子 Chart,因此需要将 Gatekeeper 中 values.yaml 中的配置合并到主 Chart 的 values.yaml 之中,直接向终端用户暴露子 Chart 的参数

展开 values.yaml

将扩展组件提交到远程环境中

借助 ksbuilder 将扩展组件提交到 KubeSphere 远端环境的扩展市场。

➜  gatekeeper git:(master) ✗ ksbuilder publish .
publish extension .
creating Extension gatekeeper.kubesphere.io
creating ExtensionVersion gatekeeper.kubesphere.io-0.1.0
creating ConfigMap extension-gatekeeper.kubesphere.io-0.1.0-chart

部署测试

通过 yarn start 以 production 模式运行 KubeSphere Console 或访问远端的 KubeSphere Console,即可在扩展市场中看到通过 ksbuilder 提交的扩展组件。

Gatekeeper Extension

  1. 点击安装扩展组件

install-gatekeeper-extension

  1. 扩展组件安装完成后,选择要部署 Gatekeeper 的集群

install-gatekeeper-agent

  1. Gatekeeper 在指定集群中成功部署

installed

  1. 创建 Gatekeeper Constraints 并测试

    Gatekeeper 测试样例:https://open-policy-agent.github.io/gatekeeper-library/website/validation/allowedrepos

gatekeeper-constraint-test