golang动态Kubernetes清单和配置文件模板化工具插件crab-config-files-templating的使用
Golang动态Kubernetes清单和配置文件模板化工具插件crab-config-files-templating的使用
Crab 🦀
Dynamic configuration file templating tool for kubernetes manifest or general configuration files
如何安装
根据您的计算机架构在发布页面下载
OS | 平台 | 状态 |
---|---|---|
Ubuntu, Debian | amd64, arm64, 386 | 可用 |
MacOS, Darwin | amd64, arm64, 386 | 可用 |
Windows | amd64, arm64, 386 | 可用 |
使用以下命令解压:
tar -xzf crab-cli-v0.1.0-darwin-amd64.tar.gz -C crab
可选步骤,移动到/usr/local/bin:
cp crab/crab /usr/local/bin
然后检查crab cli是否正常工作。
从源码构建
- 克隆此仓库
- 确保您有go 1.18版本
- 运行
make build
如何使用
基本命令格式:
crab -f <fileinputpath> -r <keyvalue> -o <outputfilepath>
标志:
标志 | 描述 | 是否必需 | 默认值 |
---|---|---|---|
-f | 文件输入路径位置,例如./manifest/nginx.yaml(接受任何配置文件扩展名,.env, json, yml, yaml等) | 是 | - |
-o | 写入输出文件位置,例如./manifest/nginx-result.yaml | 否 | 与输入文件路径相同(覆盖) |
-r | 键值替换 | 是 | - |
-q | 带引号的键值替换 | 否 | - |
-v | 详细过程 | 否 | false |
案例1 标准替换
首先在您的文件中添加{{replacableName}}:
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: {{namespace}}
spec:
ports:
- targetPort: 80
name: nginxhttp
port: {{exposePort}}
crab cli将根据上面的示例替换{{replacableName}}作为键:
- {{namespace}}
- {{exposePort}}
然后运行crab命令:
crab -f inputfile.yaml -r namespace=production -r exposePort=8081
是的,您可以覆盖多个键值 ✔️
将输出写入另一个文件,添加-o标志:
crab -f inputfile.yaml -r namespace=production -r exposePort=8081 -o result.yaml
要显示详细过程,添加-v标志:
crab -f inputfile.yaml -r namespace=production -r exposePort=8081 -o result.yaml -v
详细输出:
[REPLACED] from namespace to production
[REPLACED] from exposePort to 8081
[DONE] Crab output result at result.yaml
结果将是:
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: production
spec:
ports:
- targetPort: 80
name: nginxhttp
port: 8081
案例2 引号替换
有时您的配置文件需要字符串引号(如环境变量或连接字符串):
namespace="production"
模板文件示例:
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: {{namespace}}
spec:
ports:
- targetPort: 80
name: nginxhttp
port: {{exposePort}}
假设我们需要在命名空间中使用引号:
crab -f inputfile.yaml -q namespace=production -r exposePort=8081 -o result.yaml -v
是的,您可以同时替换多个带引号或不带引号的键值 ✔️
结果将是:
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: "production"
spec:
ports:
- targetPort: 80
name: nginxhttp
port: 8081
示例Github Action
name: Demo deployment using crab
on:
workflow_dispatch:
jobs:
crab-manifest:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: mock job
run: pwd
deploy-test:
runs-on: ubuntu-latest
needs: crab-manifest
steps:
- uses: actions/checkout@v3
- name: install crab cli
run: wget -c https://github.com/alfiankan/crab-config-files-templating/releases/download/v1.0.5/crab-v1.0.5-linux-amd64.tar.gz -O - | tar -xz crab
- name: recreate deployment manifest on test
run: |
./crab -f example/manifest/nginx.yaml \
-r namespace=test \
-r publishPort=8000 \
-q portName=test-server \
-o nginx-test.yaml \
-v
- name: view manifest
run: cat nginx-test.yaml
deploy-production:
runs-on: ubuntu-latest
needs: crab-manifest
steps:
- uses: actions/checkout@v3
- name: install crab cli
run: wget -c https://github.com/alfiankan/crab-config-files-templating/releases/download/v1.0.5/crab-v1.0.5-linux-amd64.tar.gz -O - | tar -xz crab
- name: recreate deployment manifest on production
run: |
./crab -f example/manifest/nginx.yaml \
-r namespace=production \
-r publishPort=80 \
-q portName=prod-server \
-o nginx-prod.yaml \
-v
- name: view manifest
run: cat nginx-prod.yaml
更多关于golang动态Kubernetes清单和配置文件模板化工具插件crab-config-files-templating的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang动态Kubernetes清单和配置文件模板化工具插件crab-config-files-templating的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang动态Kubernetes清单和配置文件模板化工具 - crab-config-files-templating
crab-config-files-templating 是一个用于动态生成Kubernetes清单文件和配置文件的Golang模板化工具插件,它可以帮助开发者在部署应用时根据环境变量或输入参数动态生成配置文件。
主要特性
- 支持Go模板语法
- 支持环境变量注入
- 支持JSON/YAML配置文件处理
- 与Kubernetes生态系统无缝集成
- 轻量级且易于使用
安装
go get github.com/containersolutions/crab-config-files-templating
基本用法示例
1. 简单模板渲染
package main
import (
"fmt"
"os"
"github.com/containersolutions/crab-config-files-templating/pkg/template"
)
func main() {
// 定义模板内容
tmpl := `apiVersion: v1
kind: Pod
metadata:
name: {{.PodName}}
labels:
app: {{.AppLabel}}
spec:
containers:
- name: {{.ContainerName}}
image: {{.Image}}`
// 准备模板数据
data := map[string]interface{}{
"PodName": "my-pod",
"AppLabel": "my-app",
"ContainerName": "main-container",
"Image": "nginx:latest",
}
// 渲染模板
result, err := template.Render(tmpl, data)
if err != nil {
fmt.Printf("Error rendering template: %v\n", err)
os.Exit(1)
}
fmt.Println(result)
}
2. 从文件加载模板并渲染
package main
import (
"fmt"
"os"
"github.com/containersolutions/crab-config-files-templating/pkg/template"
)
func main() {
// 从文件加载模板
tmpl, err := os.ReadFile("pod-template.yaml")
if err != nil {
fmt.Printf("Error reading template file: %v\n", err)
os.Exit(1)
}
// 准备模板数据
data := map[string]interface{}{
"PodName": "file-based-pod",
"AppLabel": "file-app",
"ContainerName": "file-container",
"Image": "nginx:1.19",
}
// 渲染模板
result, err := template.Render(string(tmpl), data)
if err != nil {
fmt.Printf("Error rendering template: %v\n", err)
os.Exit(1)
}
fmt.Println(result)
}
3. 使用环境变量
package main
import (
"fmt"
"os"
"github.com/containersolutions/crab-config-files-templating/pkg/template"
)
func main() {
// 设置环境变量
os.Setenv("POD_NAME", "env-pod")
os.Setenv("APP_LABEL", "env-app")
// 定义使用环境变量的模板
tmpl := `apiVersion: v1
kind: Pod
metadata:
name: {{ env "POD_NAME" }}
labels:
app: {{ env "APP_LABEL" }}`
// 渲染模板
result, err := template.Render(tmpl, nil)
if err != nil {
fmt.Printf("Error rendering template: %v\n", err)
os.Exit(1)
}
fmt.Println(result)
}
4. 高级功能 - 条件判断和循环
package main
import (
"fmt"
"os"
"github.com/containersolutions/crab-config-files-templating/pkg/template"
)
func main() {
// 定义带条件和循环的模板
tmpl := `apiVersion: v1
kind: Pod
metadata:
name: {{.PodName}}
spec:
containers:
{{- range .Containers }}
- name: {{.Name}}
image: {{.Image}}
{{- if .Resources }}
resources:
limits:
cpu: {{.Resources.Limits.CPU}}
memory: {{.Resources.Limits.Memory}}
{{- end }}
{{- end }}`
// 准备复杂数据
data := map[string]interface{}{
"PodName": "multi-container-pod",
"Containers": []map[string]interface{}{
{
"Name": "web",
"Image": "nginx:latest",
"Resources": map[string]interface{}{
"Limits": map[string]string{
"CPU": "500m",
"Memory": "512Mi",
},
},
},
{
"Name": "sidecar",
"Image": "busybox:latest",
},
},
}
// 渲染模板
result, err := template.Render(tmpl, data)
if err != nil {
fmt.Printf("Error rendering template: %v\n", err)
os.Exit(1)
}
fmt.Println(result)
}
最佳实践
- 模板组织:将常用模板保存在单独的文件中,便于管理和重用
- 数据分离:将配置数据与模板分离,便于不同环境的部署
- 输入验证:在渲染前验证输入数据,确保生成的清单有效
- 错误处理:妥善处理模板渲染错误,提供有意义的错误信息
- 版本控制:将模板文件纳入版本控制,跟踪变更历史
集成到CI/CD流程
crab-config-files-templating 可以轻松集成到CI/CD流程中,在部署阶段动态生成Kubernetes清单。例如在GitLab CI中:
deploy:
stage: deploy
image: golang:1.18
script:
- go install github.com/containersolutions/crab-config-files-templating/cmd/crab-render@latest
- crab-render -template deployment.yaml.tmpl -data config/prod.json -output deployment.yaml
- kubectl apply -f deployment.yaml
crab-config-files-templating 提供了灵活而强大的方式来管理Kubernetes清单和配置文件的模板化,特别适合需要根据不同环境动态生成配置的场景。