承接上文
使用deployment管理起来
直接创建deployment来创建pod,顺便测试一下故障场景,修改一下test.go来增加退出场景,需要重新制作镜像,参考上面即可。
package main
import (
"fmt"
"net/http"
"os"
)
func main() {
fmt.Println("start main")
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hello, world")
})
// 添加一个退出的url,测试服务异常
http.HandleFunc("/exit", func(w http.ResponseWriter, r *http.Request) {
fmt.Println("recieve exit, bye!")
os.Exit(0)
})
err := http.ListenAndServe(":7878", nil)
if err != nil {
panic(err)
}
os.Exit(0)
}
重新制作镜像搞到minikube里面之后,我们开始定义deployment来管理pod
apiVersion: apps/v1 # 版本,虽然不知道为什么,但是要写apps/v1
kind: Deployment # 选deployment
metadata:
name: test-dep # 给deployment定义名字,创建的pod会以此为前缀
# labels: # 给deployment定义标签,也可以不定义,暂时没用
# app: test
spec: # deployment的要求
replicas: 1 # pods启动1个,保持1个
selector: # 定义deployment管理的pod选择器
matchLabels: # 要跟下面的template中一样,不一样会报错
app: test
template: # 定义deployment管理的pod
metadata:
labels: # 定义标签,要和deployment中一样
app: test
spec: # pod的定义
containers:
- name: test
image: test-con:latest
imagePullPolicy: Never
command: ["go"]
args: ["run", "/root/test.go"]
然后就是启动一下deployment
kubectl apply -f test.yaml
查看deployment和pod的状态
=> kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
test-dep 1/1 1 1 4m6s
=> kubectl get pods
NAME READY STATUS RESTARTS AGE
test-dep-769f4564f5-56zv6 1/1 Running 0 4m10s
在Running状态后,service那边不用动,同样用上面的方式访问,可以通。
=> minikube ip
192.168.49.2
=> curl 192.168.49.2:30449
hello, world%
然后测试一下搞挂这个服务端,自己会恢复
=> curl 192.168.49.2:30449/exit; date; while true; do curl 192.168.49.2:30449 &>/dev/null; if [ $? -eq 0 ]; then break; fi; sleep 1; done; date
curl: (52) Empty reply from server
2024年 11月 19日 星期二 20:06:46 CST
2024年 11月 19日 星期二 20:07:29 CST
pods的状态也是有一次重启
=> kubectl get pods
NAME READY STATUS RESTARTS AGE
test-dep-769f4564f5-56zv6 1/1 Running 1 (119s ago) 42m
测试一下pods的容错,我们把deployments配置改一下,把replicas改成3个。等待启动完成再次测试。
=> kubectl apply -f test.yaml --force
# 搞挂第一个,第二个可以响应,很快返回
=> curl 192.168.49.2:30449/exit; date; while true; do curl 192.168.49.2:30449 &>/dev/null; if [ $? -eq 0 ]; then break; fi; sleep 1; done; date
curl: (52) Empty reply from server
2024年 11月 19日 星期二 20:17:15 CST
2024年 11月 19日 星期二 20:17:15 CST
# 搞挂第二个,第三个可以响应,很快返回
=> curl 192.168.49.2:30449/exit; date; while true; do curl 192.168.49.2:30449 &>/dev/null; if [ $? -eq 0 ]; then break; fi; sleep 1; done; date
curl: (52) Empty reply from server
2024年 11月 19日 星期二 20:17:16 CST
2024年 11月 19日 星期二 20:17:17 CST
# 搞挂第三个,第一个重启还没搞定,等第一个重启好就可以了
=> curl 192.168.49.2:30449/exit; date; while true; do curl 192.168.49.2:30449 &>/dev/null; if [ $? -eq 0 ]; then break; fi; sleep 1; done; date
curl: (52) Empty reply from server
2024年 11月 19日 星期二 20:17:19 CST
2024年 11月 19日 星期二 20:18:06 CST
由于我写的是go run test.go
容器启动之后需要现场编译,所以会慢一点,编译好的二进制启动会更快,应该就都是快速返回了。可以看到service里面暴露的端口会自动负载均衡到三个pods上面。