前言
在第一篇文章k8s部署“有状态应用”集群(一、开篇) 中,解释了为什么选择statefulset,这篇文章会尝试准备这个demo应用。
demo代码已上传至github仓库
功能描述
- 通过配置文件控制主从节点
- 对外暴露restful api
- 只有主节点能够访问“/api/v1/master-mode”
- 所有节点都能够访问“/api/v1/mode”
步骤
1.准备demo代码
- demo代码
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"github.com/julienschmidt/httprouter"
)
type modeConfig struct {
MasterMode bool `json:"masterMode"`
}
var masterMode bool
func serverMode(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
var mode string
if masterMode {
mode = "master"
} else {
mode = "slave"
}
fmt.Fprintf(w, "hello, %s!n", mode)
}
func masterModeOnly(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
fmt.Fprintf(w, "hello, only for master moden")
}
func main() {
data, err := ioutil.ReadFile("./config.json")
if err != nil {
fmt.Println("read config file error : ", err)
os.Exit(-1)
}
mode := new(modeConfig)
err = json.Unmarshal(data, mode)
if err != nil {
fmt.Println("parse json file error : ", err)
os.Exit(-1)
}
masterMode = mode.MasterMode
fmt.Println(masterMode)
router := httprouter.New()
router.GET("/api/v1/mode", serverMode)
if masterMode {
router.GET("/api/v1/master-mode", masterModeOnly)
}
log.Fatal(http.ListenAndServe(":8080", router))
}
- config文件
{
"masterMode": true
}
- 编译
- 本地运行结果
a. config文件中masterMode的值为true
可以看到mode返回的是master,而且master-mode可以访问
b. config文件中masterMode的值为false
可以看到mode返回的是slave,而且master-mode返回的是404
2.准备docker镜像
- 准备dockerfile
FROM ubuntu:16.04
RUN mkdir -p /app
WORKDIR /app
COPY ./statefulset-demo /app
COPY ./config.json /app
EXPOSE 8080
# This command runs your application, comment out this line to compile only
CMD ["./statefulset-demo"]
LABEL Name=statefulset-demo Version=0.0.1
- build docker image
使用vscode build image
设置docker image的tag
查看build结果
结束
至此,demo应用准备完毕,下一步会使用statefulset部署demo的集群。