使用ConfigMap作为容器的配置文件

构建demo镜像

自己制作个镜像方便测试。

go mod init k8s-configmap-demo

main.go

package main

import (
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/spf13/pflag"
	"github.com/spf13/viper"
)

var (
	conf = pflag.StringP("config", "c", "", "config filepath")
)


type Config struct {
	Name string
}

// 对外的初始化配置方法
func configRun(cfg string) error {
	c := Config{
			Name: cfg,
	}

	if err := c.init(); err != nil {
			return err
	}

	return nil
}

func (c *Config) init() error {
	if c.Name != "" {
			viper.SetConfigFile(c.Name)
	} else {
			// 默认配置文件是./config.yaml
			viper.AddConfigPath(".")
			viper.SetConfigName("config")
	}

	viper.SetConfigType("yaml")
	// viper解析配置文件
	err := viper.ReadInConfig() 
	if err != nil {
			panic(fmt.Errorf("Fatal error config file: %s \n", err))
	}


	return nil
}

func main() {
	pflag.Parse()

	// 初始化配置
	if err := configRun(*conf); err != nil {
			panic(err)
	}


	gin.SetMode(viper.GetString("mode"))
	g := gin.New()
	g = LoadRoute(g)

	g.Run(viper.GetString("addr"))
}

func LoadRoute(g *gin.Engine) *gin.Engine {
	g.Use(gin.Recovery())
	// 404
	g.NoRoute(func (c *gin.Context)  {
			c.String(http.StatusNotFound, "404 not found");
	})

	g.GET("/", Index)

	return g
}

// 返回
type Response struct {
	Code int `json:"code"`
	Message string `json:"message"`
	Data interface{} `json:"data"`
}

// api返回结构
func ApiResponse(c *gin.Context, code int, message string, data interface{}) {
	c.JSON(http.StatusOK, Response{
			Code: code,
			Message: message,
			Data: data,
	})
}

func Index(c *gin.Context) {
	ApiResponse(c, 0, "success", viper.GetString("hi"))
}

代码比较简单,读取config,运行一个gin http服务,返回配置项[hi]的字符串。

config.yaml

name: demo2
mode: debug
addr: :8080
hi: w~o~w

Dockerfile

FROM golang:alpine AS builder

ENV CGO_ENABLED 0
ENV GOPROXY https://goproxy.cn,direct

WORKDIR /app

ADD go.mod .
ADD go.sum .
RUN go mod download
COPY main.go .
RUN go build -o 13sai main.go


FROM alpine

WORKDIR /app
COPY --from=builder /app/13sai /app/13sai

ADD config.yaml .

CMD ["./13sai"]

构建:

docker build -t k8s-configmap-demo:0.2 .
docker tag k8s-configmap-demo:0.2 13sai/k8s-configmap-demo:0.2

提交镜像到hub

docker login

docker push 13sai/k8s-configmap-demo:0.2

k8s的配置我使用的是Kuboard,下面的操作都是在Kuboard执行

ConfigMap配置

创建ConfigMap:

进入default空间 > 资源 > 配置字典:

名称 sai
配置数据名称 config.yaml
配置内容 config.yaml里的内容

创建负载

配置可参照下面截图,注意几处:

  • 数据卷 Volume,选择configMap
  • 运行容器组pod的Command和挂载点

负载配置

保存后即可。

crd

最后贴出生成的yaml文件

apiVersion: v1
kind: ConfigMap
metadata: # 元数据,定义基本属性和信息
  name: sai-config # 名称
data:
  config.yaml: |-
    name: sai0556
    mode: debug
    addr: :8080
    hi: w~o~w

---
apiVersion: v1
kind: Service
metadata:
  name: sai
  labels: # 标签
    app: sai
spec: # 描述
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  selector:
    app: sai

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sai
spec:
  replicas: 3 # 创建应用程序实例个数
  selector: # 标签选择器
    matchLabels: # 选择包含标签app:sai的资源
      app: sai
  template: # 模板
    metadata:
      labels:
        app: sai
    spec:
      containers:
      - name: sai
        image: 	13sai/k8s-configmap-demo:0.2
        imagePullPolicy: IfNotPresent
        command:
          - '/app/13sai'
        volumeMounts:
          - name: config
            mountPath: /app/config.yaml
            readOnly: true
            subPath: config.yaml
      volumes:
        - name: config
          configMap:
            defaultMode: 0600
            name: sai-config

使用ConfigMap作为容器的配置文件
https://github.13sai.com/2021/06/26/350/
作者
13sai
许可协议