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

# 版本信息
[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

猜你喜欢

转载自blog.csdn.net/hlj1307274/article/details/88231753