构建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 { viper.AddConfigPath(".") viper.SetConfigName("config") }
viper.SetConfigType("yaml") 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()) 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"` }
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:
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 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
|