前言
在第一篇文章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
}
- 编译
![02bc4b4f9cd661f61da61d551585af8d.png](https://i-blog.csdnimg.cn/blog_migrate/d5a5ffaea93b90c98b5af5cad291071d.png)
- 本地运行结果
a. config文件中masterMode的值为true
![9baf9fecc4dcd971f77b6569afdd4411.png](https://i-blog.csdnimg.cn/blog_migrate/6549c00d44df6b2dc72d514977d5abdf.png)
可以看到mode返回的是master,而且master-mode可以访问
b. config文件中masterMode的值为false
![2646e3d68463a00b458dcfe8270b264a.png](https://i-blog.csdnimg.cn/blog_migrate/67c1792a736e073f003b6612e3b315d1.png)
可以看到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
![10f06e6fc686a5a526fcc3782910eec6.png](https://i-blog.csdnimg.cn/blog_migrate/0ccd4d928a7a59a1d1fd5cb885f3ce35.jpeg)
设置docker image的tag
![86d8c22995af9ab0612e8b97009f1deb.png](https://i-blog.csdnimg.cn/blog_migrate/f31257110ac45d56534cca110e74b15f.png)
查看build结果
![13e10390fcfc8656d31b604c0c8505bc.png](https://i-blog.csdnimg.cn/blog_migrate/ef171068d331f5e7a3a5d10c3fe6c77c.jpeg)
结束
至此,demo应用准备完毕,下一步会使用statefulset部署demo的集群。