liubulong 发表于 2019-11-26 11:18:30

k8s 滚动升级及回滚

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. 查看信息

# 版本信息
# kubectl rollout history deployment app
deployment.extensions/app
REVISIONCHANGE-CAUSE
1         kubectl create --filename=app.yaml --record=true


# k8s服务信息
# kubectldescribe 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信息
# kubectl get deployments app
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
app    10/10   10         10          13m


# 访问服务
# curl 10.109.162.251:8888
Version: 1
3. 滚动升级

# kubectl set image deployment/app app=172.16.111.168:5000/app:v2 --record
deployment.extensions/app image updated

# 查看状态
# kubectl get deployments app
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
app    8/10    10         8         13m


# 查看升级记录
# kubectl rollout history deployment app
deployment.extensions/app
REVISIONCHANGE-CAUSE
1         kubectl create --filename=app.yaml --record=true
2         kubectl create --filename=app.yaml --record=tru

# 查看升级状态
# kubectl rollout status deployment app
deployment "app" successfully rolled out


# kubectl get deployments app
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
app    10/10   10         10          13m

# 访问服务
# 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

页: [1]
查看完整版本: k8s 滚动升级及回滚