k8s 蓝绿发布
蓝绿部署:无需停机,风险较小。部署v1的应用(一开始的状态)所有外部请求的流量都打到这个版本上。部署版本2的应用版本2的代码与版本1不同(新功能、Bug修复等)。将流量从版本1切换到版本2。如版本2测试正常,就删除版本1正在使用的资源,从此正式用版本2。制作自定义程序下面是myapp.py文件的内容import prometheus_clientfrom prometheus_client imp
·
蓝绿部署:无需停机,风险较小。部署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
更多推荐
已为社区贡献82条内容
所有评论(0)