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

codecov

如何安装

根据您的计算机架构在发布页面下载

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

1 回复

更多关于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模板化工具插件,它可以帮助开发者在部署应用时根据环境变量或输入参数动态生成配置文件。

主要特性

  1. 支持Go模板语法
  2. 支持环境变量注入
  3. 支持JSON/YAML配置文件处理
  4. 与Kubernetes生态系统无缝集成
  5. 轻量级且易于使用

安装

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)
}

最佳实践

  1. 模板组织:将常用模板保存在单独的文件中,便于管理和重用
  2. 数据分离:将配置数据与模板分离,便于不同环境的部署
  3. 输入验证:在渲染前验证输入数据,确保生成的清单有效
  4. 错误处理:妥善处理模板渲染错误,提供有意义的错误信息
  5. 版本控制:将模板文件纳入版本控制,跟踪变更历史

集成到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清单和配置文件的模板化,特别适合需要根据不同环境动态生成配置的场景。

回到顶部