蓝绿部署:无需停机,风险较小。部署v1的应用(一开始的状态)所有外部请求的流量都打到这个版本上。部署版本2的应用版本2的代码与版本1不同(新功能、Bug修复等)。将流量从版本1切换到版本2。如版本2测试正常,就删除版本1正在使用的资源,从此正式用版本2。

制作自定义程序

下面是myapp.py文件的内容

import prometheus_client
from prometheus_client import Counter, Gauge
from prometheus_client import Summary, CollectorRegistry
from flask import Response, Flask
import time
import random
import os


app = Flask(__name__)

# 定义一个注册器,注册器可以把指标都收集起来,然后最后返回注册器数据
REGISTRY = CollectorRegistry(auto_describe=False)

# 定义一个Counter类型的变量,这个变量不是指标名称,这种Counter类型只增加
# 不减少,程序重启的时候会被重新设置为0,构造函数第一个参数是定义 指标名称,
# 第二个是定义HELP中显示的内容,都属于文本
# 第三个参数是标签列表,也就是给这个指标加labels,这个也可以不设置
http_requests_total = Counter("http_requests", "Total request cout of the host", ['method', 'endpoint'], registry=REGISTRY)

# Summary类型,它可以统计2个时间
# request_processing_seconds_count 该函数被调用的数量
# request_processing_seconds_sum  该函数执行所花的时长
request_time = Summary('request_processing_seconds', 'Time spent processing request', registry=REGISTRY)


@app.route("/metrics")
def requests_count():
    """
    当访问/metrics这个URL的时候就执行这个方法,并返回相关信息。
    :return:
    """
    return Response(prometheus_client.generate_latest(REGISTRY),
                    mimetype="text/plain")

# 这个是健康检查用的
@app.route('/healthy')
def healthy():
    return "healthy"


@app.route('/')
@request_time.time()  # 这个必须要放在app.route的下面
def hello_world():
    # .inc()表示增加,默认是加1,你可以设置为加1.5,比如.inc(1.5)
    # http_requests_total.inc()
    # 下面这种写法就是为这个指标加上标签,但是这里的method和endpoint
    # 都在Counter初始化的时候放进去的。
    # 你想统计那个ULR的访问量就把这个放在哪里
    http_requests_total.labels(method="get", endpoint="/").inc()
    # 这里设置0-1之间随机数用于模拟页面响应时长
    time.sleep(random.random())
    html = "Hello World!" \
           "App Version: {version}"
    # 这里我会读取一个叫做VERSION的环境变量,
    # 这个变量会随Dockerfile设置到镜像中
    return html.format(version=os.getenv("VERSION", "888"))


if __name__ == '__main__':
    app.run(host="0.0.0.0", port="80")

Dockerfile文件的内容

FROM flask-py3:web

ENV TZ='Asia/Shanghai'
ENV TIMEZONE Asia/Shanghai



RUN ln -snf /usr/share/zoneinfo/$TIMEZONE /etc/localtime && \
    echo $TIMEZONE > /etc/timezone && \
    mkdir /app
ADD myapp.py  /app/myapp.py

WORKDIR /app
EXPOSE 80

ENV VERSION 1.0

CMD ["python3", "myapp.py"]

或者直接拉取我的制作好的镜像

docker pull registry.cn-shenzhen.aliyuncs.com/jbjb/py3:flask-v01

蓝绿部署开始:
maxUnavailable:最大无效pod数。
maxSurge:最大激增pod数。
bluegreen-v1.yaml

cat <<END>bluegreen-v1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: blue-v1
spec:
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  selector:
    matchLabels:
      app: bluegreen
  replicas: 4
  template:
    metadata:
      labels:
        app: bluegreen
        release: v1.0
    spec:
      containers:
      - name: bluegreen
        image: registry.cn-shenzhen.aliyuncs.com/jbjb/py3:flask-v01
        ports:
        - containerPort: 80
        env:
        - name: VERSION
          value: v1.0.0
---
apiVersion: v1
kind: Service
metadata:
  name: bluegreen
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 10001
  selector:
    app: bluegreen
    release: v1.0
  type: NodePort
END

bluegreen-v2.yaml

cat <<END>bluegreen-v2.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: blue-v2
spec:
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  selector:
    matchLabels:
      app: bluegreen
  replicas: 4
  template:
    metadata:
      labels:
        app: bluegreen
        release: v2.0
    spec:
      containers:
      - name: bluegreen
        image: registry.cn-shenzhen.aliyuncs.com/jbjb/py3:flask-v01
        ports:
        - containerPort: 80
        env:
        - name: VERSION
          value: v2.0.0 
---
apiVersion: v1
kind: Service
metadata:
  name: bluegreen
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 10001
  selector:
    app: bluegreen
    release: v2.0
  type: NodePort
END

v1切换v2
在这里插入图片描述
测试命令

while sleep 0.1; do wget -q -O - 10.98.2.61:10001; echo ""; done

现在删除v1版

[root@master-63 bluegreen]# kubectl delete -f bluegreen-v1.yaml && kubectl apply -f bluegreen-v2.yaml 
deployment.apps "blue-v1" deleted
service "bluegreen" deleted
deployment.apps/blue-v2 unchanged
service/bluegreen created

在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐