使用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 puresai main.go
FROM alpine
WORKDIR /app
COPY --from=builder /app/puresai /app/puresai
ADD config.yaml .
CMD ["./puresai"]
构建:
docker build -t k8s-configmap-demo:0.2 .
docker tag k8s-configmap-demo:0.2 puresai/k8s-configmap-demo:0.2
提交镜像到hub
docker login
docker push puresai/k8s-configmap-demo:0.2
k8s的配置我使用的是Kuboard,下面的操作都是在Kuboard执行
ConfigMap配置
创建ConfigMap:
进入default空间 > 资源 > 配置字典:
名称 | sai |
---|---|
配置数据名称 | config.yaml |
配置内容 | config.yaml里的内容 |
创建负载
配置可参照下面截图,注意几处:
- 数据卷 Volume,选择configMap
- 运行容器组pod的Command和挂载点
保存后即可。
最后贴出生成的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: puresai/k8s-configmap-demo:0.2
imagePullPolicy: IfNotPresent
command:
- '/app/puresai'
volumeMounts:
- name: config
mountPath: /app/config.yaml
readOnly: true
subPath: config.yaml
volumes:
- name: config
configMap:
defaultMode: 0600
name: sai-config
使用ConfigMap作为容器的配置文件
https://blog.puresai.com/2021/06/26/350/