mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-05-20 05:32:25 +00:00
206 lines
4.0 KiB
Markdown
206 lines
4.0 KiB
Markdown
# 60 秒构建一个 Exec 插件
|
||
|
||
本教程只是一个快速开始的示例,完整的插件文档请看:[kustomize 插件](plugins.md)
|
||
|
||
本示例将使用 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
|
||
|
||
根据[文档](INSTALL.md)安装 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`。
|