构建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和挂载点

负载配置

保存后即可。

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: 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