# Exec 插件示例 | Kustomize
60 秒在 Linux 构建一个 Exec 插件

Exec 插件示例 | Kustomize

# Exec 插件示例

60 秒在 Linux 构建一个 Exec 插件

本教程只是一个快速开始的示例，完整的插件文档请看：kustomize 插件

本示例将使用 bash 编写了一个简单的 exec 插件，用来生成一个 `ConfigMap`。

尝试本教程不会破坏你的当前设置。

#### 环境要求

- `linux`
- `git`
- `curl`
- `Go 1.13`

## 创建一个工作空间/目录

    DEMO=$(mktemp -d)

## 编写 kustomization

新建一个目录来保存所有的配置：

    MYAPP=$DEMO/myapp
    mkdir -p $MYAPP

编写一个 Deployment 配置：

    cat <<'EOF' >$MYAPP/deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: the-deployment
    spec:
      replicas: 3
      template:
        spec:
          containers:
          - name: the-container
            image: monopole/hello:1
            command: ["/hello",
                      "--port=8080",
                      "--date=$(THE_DATE)",
                      "--enableRiskyFeature=$(ENABLE_RISKY)"]
            ports:
            - containerPort: 8080
            env:
            - name: THE_DATE
              valueFrom:
                configMapKeyRef:
                  name: the-map
                  key: today
            - name: ALT_GREETING
              valueFrom:
                configMapKeyRef:
                  name: the-map
                  key: altGreeting
            - name: ENABLE_RISKY
              valueFrom:
                configMapKeyRef:
                  name: the-map
                  key: enableRisky
    EOF

编写一个 service 配置：

    cat <<EOF >$MYAPP/service.yaml
    kind: Service
    apiVersion: v1
    metadata:
      name: the-service
    spec:
      type: LoadBalancer
      ports:
      - protocol: TCP
        port: 8666
        targetPort: 8080
    EOF

现在为您要编写的插件创建一个配置文件。

这个配置文件的内容也是 k8s 资源对象。其中 `apiVersion` 和 `kind` 字段的值用于在文件系统中查找插件代码（稍后会对此进行更多介绍）。

    cat <<'EOF' >$MYAPP/cmGenerator.yaml
    apiVersion: myDevOpsTeam
    kind: SillyConfigMapGenerator
    metadata:
      name: whatever
    argsOneLiner: Bienvenue true
    EOF

最后在 kustomization 文件中引用以上所有内容：

    cat <<EOF >$MYAPP/kustomization.yaml
    commonLabels:
      app: hello
    resources:
    - deployment.yaml
    - service.yaml
    generators:
    - cmGenerator.yaml
    EOF

检查这些文件

    ls -C1 $MYAPP

## 为插件创建目录

插件必须位于特定的目录，以便 Kustomize 能够找到它们。

该示例将使用临时目录：

    PLUGIN_ROOT=$DEMO/kustomize/plugin

在上面定义的插件配置 `$MYAPP/cmGenerator.yaml` 中指定：

>     apiVersion: myDevOpsTeam
>     kind: SillyConfigMapGenerator

这意味着该插件必须位于以下目录中：

    MY_PLUGIN_DIR=$PLUGIN_ROOT/myDevOpsTeam/sillyconfigmapgenerator

    mkdir -p $MY_PLUGIN_DIR

插件的目录结构为： `apiVersion 的 value/小写 kind 的 value`。

插件拥有自己的目录，不但可以保存插件代码，还可以保存测试代码以需要的补充数据文件。

## 编写插件

插件有 exec 和 Go 两种.

编写一个 exec 插件，将其安装到正确的目录，文件名必须与插件的类型匹配（在本例中为 `SillyConfigMapGenerator`）：

    cat <<'EOF' >$MY_PLUGIN_DIR/SillyConfigMapGenerator
    #!/bin/bash
    # Skip the config file name argument.
    shift
    today=`date +%F`
    echo "
    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: the-map
    data:
      today: $today
      altGreeting: "$1"
      enableRisky: "$2"
    "
    EOF

根据定义，exec 插件必须是可执行的：

    chmod a+x $MY_PLUGIN_DIR/SillyConfigMapGenerator

## 安装 kustomize

根据文档安装 kustomize:

    curl -s "https://raw.githubusercontent.com/\
    kubernetes-sigs/kustomize/master/hack/install_kustomize.sh"  | bash
    mkdir -p $DEMO/bin
    mv kustomize $DEMO/bin

## 检查目录结构

    tree $DEMO

## 使用插件构建 APP

    XDG_CONFIG_HOME=$DEMO $DEMO/bin/kustomize build --enable_alpha_plugins $MYAPP

之前如果您已经设置了 `PLUGIN_ROOT=$HOME/.config/kustomize/plugin`，则无需在 kustomize 命令前使用 `XDG_CONFIG_HOME`。

最后修改 2020年07月16日: Docs: Auto-fix markdownlint issues (f9ee578a)