k8s 滚动升级
一 准备
1.编写一个简单的http服务,返回版本号
package main
import (
"fmt"
"log"
"net/http"
)
var Version = "library-import"
func VersionHandle(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Version: %s", Version)
}
func main() {
http.HandleFunc("/", VersionHandle)
err := http.ListenAndServe(":8888", nil)
if err != nil {
log.Fatal("Http Server Err:", err)
}
}
2.编译2个版本用于测试
go build -ldflags '-s -w -X main.Version=1' -o dist/app_v1 http_app/app.go
go build -ldflags '-s -w -X main.Version=2' -o dist/app_v2 http_app/app.go
3.编写Dockerfile,并且打包docker镜像推送到私有仓库
172.16.111.168 是私有仓库地址
Dockerfile_v1
FROM registry.aliyuncs.com/acs-sample/centos
ADD app_v1 /app
EXPOSE 8888
ENTRYPOINT ["/app"]
docker build -f dist/Dockerfile_v1 -t 172.16.111.168:5000/app:v1 ./dist/
docker push 172.16.111.168:5000/app:v1
Dockerfile_v2
FROM registry.aliyuncs.com/acs-sample/centos
ADD app_v2 /app
EXPOSE 8888
ENTRYPOINT ["/app"]
docker build -f dist/Dockerfile_v2 -t 172.16.111.168:5000/app:v2 ./dist/
docker push 172.16.111.168:5000/app:v2
二 创建 Deployment
1. 编写,创建app.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: app
spec:
replicas: 10
minReadySeconds: 10 # 容器启动创建多少s后服务可用
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 升级过程中最多可以比原先设置多出的POD数量
maxUnavailable: 1 # 升级过程中最多有多少个POD处于无法提供服务的状态
selector:
matchLabels:
app: test_rollout
template:
metadata:
labels:
app: test_rollout
spec:
containers:
- name: app
image: 172.16.111.168:5000/app:v1
dnsConfig:
options:
- name: ndots
value: "1"
---
apiVersion: v1
kind: Service
metadata:
name: app
spec:
ports:
- port: 8888
targetPort: 8888
protocol: TCP
type: ClusterIP
selector:
app: test_rollout
kubectl create -f app.yaml --record=true
# -record=true 记录版本历史
2. 查看信息
# 版本信息
[root@master yaml]# kubectl rollout history deployment app
deployment.extensions/app
REVISION CHANGE-CAUSE
1 kubectl create --filename=app.yaml --record=true
# k8s服务信息
[root@master yaml]# kubectl describe service app
Name: app
Namespace: default
Labels: <none>
Annotations: kubernetes.io/change-cause: kubectl create --filename=app.yaml --record=true
Selector: app=test_rollout
Type: ClusterIP
IP: 10.109.162.251
Port: <unset> 8888/TCP
TargetPort: 8888/TCP
Endpoints: 10.244.0.52:8888,10.244.0.53:8888,10.244.0.54:8888 + 7 more...
Session Affinity: None
Events: <none>
# deployments信息
[root@master yaml]# kubectl get deployments app
NAME READY UP-TO-DATE AVAILABLE AGE
app 10/10 10 10 13m
# 访问服务
[root@master yaml]# curl 10.109.162.251:8888
Version: 1
3. 滚动升级
[root@master yaml]# kubectl set image deployment/app app=172.16.111.168:5000/app:v2 --record
deployment.extensions/app image updated
# 查看状态
[root@master yaml]# kubectl get deployments app
NAME READY UP-TO-DATE AVAILABLE AGE
app 8/10 10 8 13m
# 查看升级记录
[root@master yaml]# kubectl rollout history deployment app
deployment.extensions/app
REVISION CHANGE-CAUSE
1 kubectl create --filename=app.yaml --record=true
2 kubectl create --filename=app.yaml --record=tru
# 查看升级状态
[root@master yaml]# kubectl rollout status deployment app
deployment "app" successfully rolled out
[root@master yaml]# kubectl get deployments app
NAME READY UP-TO-DATE AVAILABLE AGE
app 10/10 10 10 13m
# 访问服务
[root@master yaml]# curl 10.109.162.251:8888
Version: 2
# 已经升级完成
#暂停升级
kubectl rollout pause deployment app
#继续升级
kubectl rollout resume deployment app
#回滚到上一级
kubectl rollout undo deployment app
#回滚到指定版本
kubectl rollout undo deployment app --to-revision=1