k8s实现灰度发布

摘要:
4.为了方便延时恢复发布的效果,我们还需要在制作一个镜像dockerrun-d--namengx1-eYOU_INFO="DIY-HelloWorld-v2"harbor.zcf.com/k8s/myapp:v1#说明:-e是指定要传递给容器的环境变量,因为我提前在myapp中启动脚本entrypoint.sh中使用的了YOU_INFO这个环境变量,#因此,这里我可以直接给容器传递这个变量,来实现修改nginx首页的效果.dockercommit--pausengx1    #将ngx1暂停,并将当前容器状态,导出为一个新镜像。

灰度发布在实际生产部署中是经常被使用的方式,常规的方法是手动从前端LB(负载均衡)上将后端服务器摘掉,然后,停服务,最后上传代码,完成软连接更新。在使用CI/CD工具时,这个过程变得自动化了,我们只需要通过Jenkins这个功能强大的开源持续集成和部署工具,就可以联合Gitlab 或 Gogs 来实现自动拉取代码,并根据自己编写的pipeline脚本,实现自动连接到LB上摘掉后端Server,并自动连接到后端Server上,上传代码,并重启服务,最后通过邮件通知管理员整个过程的结果报告。但今天,K8s的更让我们看到了一种更便捷高效的灰度发布的实现方法,下面就来说说:
由于本人能力有限,对k8s的理解尚浅,原理部分在后续研究透彻后,在来详细说明,本编仅供初学者参考
首先需要制作此次实验的基础镜像:
1. Dockerfile的编写:
mkdir dockerfile && cd dockerfile
vim Dockerfile    #注意: Dockerfile的文件名首字母要大写
FROM alpine:latest
MAINTAINER "ZCF <zcf@zczf.com>"
ENV NGX_DOC_ROOT="/var/lib/nginx/html" HOSTNAME="" IP="" PORT="" INDEX_PAGE=""
RUN apk --no-cache add nginx && mkdir -p ${NGX_DOC_ROOT}/shop /run/nginx
COPY chk.html ${NGX_DOC_ROOT}
COPY entrypoint.sh /bin
CMD ["/usr/sbin/nginx","-g","daemon off;"] #定义启动nginx服务为前端启动, -g:是global段,中修改daemon off;
ENTRYPOINT ["/bin/entrypoint.sh"] #将CMD的命令,作为参数传递给/bin/entrypoint.sh 脚本.
#准备Dockerfile配套的基础文件:
1) 启动容器时,执行的脚本文件: entrypoint.sh
vim entrypoint.sh
#!/bin/sh
echo "<h1>WELCOME TO ${HOSTNAME:-www.zcf.com}WEB SITE | `date` | `hostname` | `hostname -i` | -${YOU_INFO:-v1}- | </h1>" > ${NGX_DOC_ROOT}/index.html
cat > /etc/nginx/conf.d/default.conf <<EOF
server {
server_name ${HOSTNAME:-www.zcf.com};
listen ${IP:-0.0.0.0}:${PORT:-80};
root ${NGX_DOC_ROOT};
location / {
            index ${INDEX_PAGE} index.html index.htm;
}
location = /404.html {
            internal;
}
}
EOF
exec "$@"      #它就是来接受CMD传入的参数的.
2 ) 给entrypoint.sh 添加执行权限
chown +x entrypoint.sh
3) 后期做健康检查时,使用的html文件:
echo OK > chk.html
2. 开始制作docker镜像文件:
docker build --tag myapp:v1 ./
3. 将制作好的镜像文件,打上标签,并上传到harbor上。
docker login harbor.zcf.com -u admin -p 123456      #登录harbor
docker tag myapp:v1 harbor.zcf.com/k8s/myapp:v1   #先打上harbor仓库路径
docker push harbor.zcf.com/k8s/myapp:v1        #再上传镜像到harbor上。
4. 为了方便延时恢复发布的效果,我们还需要在制作一个镜像
docker run -d --name ngx1 -e YOU_INFO="DIY-HelloWorld-v2" harbor.zcf.com/k8s/myapp:v1
#说明: -e 是指定要传递给容器的环境变量, 因为我提前在myapp中启动脚本entrypoint.sh中使用的了YOU_INFO这个环境变量,
# 因此,这里我可以直接给容器传递这个变量,来实现修改nginx首页的效果.
docker commit --pause ngx1      #将ngx1暂停,并将当前容器状态,导出为一个新镜像。
docker kill ngx1 && docker rm -fv ngx1 #制作完镜像,就直接删除测试ngx1容器.
root@k8s-n1:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 85355d4af36c 6 seconds ago 7.02MB    #这个就上刚制作的新镜像.
#给刚制作好的镜像打上标签:harbor.zcf.com/k8s/myapp:v2,便于上传到harbor上。
docker tag 85355d4af36c harbor.zcf.com/k8s/myapp:v2
#测试运行镜像,若没有问题,就可以上传到本地harbor上了。

docker run -p 83:80 --rm -d --name ngx1 harbor.zcf.com/k8s/myapp:v2
root@k8s-n1:~# curl http://192.168.111.80:83/#测试镜像是否修改了nginx的首页为YOU_INFO的内容.
<h1>WERCOME TO www.zcf.com WEB SITE | Fri Jul 19 02:31:13 UTC 2019 | ec4f08f831de | 172.17.0.2 |-DIY-HelloWorld-v2- | </h1>
docker kill ngx1      #删除ngx1容器.
docker push harbor.zcf.com/k8s/myapp:v2     #最后,上传新镜像到harbor上.
5. 现在已经有了,myapp:v1 和 myapp:v2 那就可以开始K8s的灰度发布测试了。

#先创建三个pod,一个Client,两个Nginx
#1. 先创建 Client
kubectl run client --image=harbor.zcf.com/k8s/alpine:v1 --replicas=1
#注意: alpine:是一个最小化的Linux系统,很多开源镜像站都可以下载到.
kubectl get pods -o wide      #查看Pod的创建详情.
#2. 创建Nginx
kubectl run nginx --image=harbor.zcf.com/k8s/myapp:v1 --port=80 --replicas=2
kubectl get deployment -w      #watch着监控k8s帮我们创建2个pod的过程.
kubectl get pod -o wide
#3. 登录Client,测试访问Nginx
root@k8s-m1:/etc/ansible# kubectl get pod
NAME READY STATUS RESTARTS AGE
client-f5cdb799f-2wsmr 1/1 Running 2 16h
nginx-6d6d8b685-7t7xj 1/1 Running 0 99m
nginx-6d6d8b685-xpx5r 1/1 Running 0 99m
kubectl exec -it client-f5cdb799f-2wsmr sh
/ # ip addr
/ # for i in `seq 1000`; do wget -O - -q http://nginx/ ; sleep 1; done
/ #    #说明: 若你的kube-dns没有部署成功,这里的nginx可换成Service的IP.
/ #    #   kubectl get svc |grep nginx    #这个就是Nginx的Service的集群IP.
#4. 以上测试可看到,已经能够实现负载均衡的效果了。
接着,开始进行灰度发布测试
#更新myapp的镜像为myapp:v2
kubectl set image --help
kubectl set image deployment myapp myapp=harbor.zcf.com/k8s/myapp:v2    #升级myapp的镜像为myapp:v2
#上面执行命令时,就可以看着,另一个终端中Client的访问变化情况,你可以发现,访问逐渐从 v1 变成 DIY-HelloWorld-v2了。
#5.测试动态调整nginx Pod的数量
kubectl scale --replicas=5 deployment nginx    #修改nginx的Pod副本数量为5个.
kubectl get pods
#接着在到Client所在的终端上,查看变化,你会发现,主机名和IP部分开始有更多变化了。
#6. 查看nginx镜像升级状态,是否成功
kubectl rollout status deployment nginx
#7. 再查看myapp的镜像是否已经升级为最新的了
kubectl describe pods nginx-xxx-xx
#8. 将myapp回滚到之前的版本,即v1版本
kubectl rollout undo --help
kubectl rollout undo deployment nginx
6. 测试K8s集群外部访问nginx
#修改 myapp service的类型,让它能被集群外部的客户端访问.
kubectl edit svc myapp
#type: ClusterIP 把它修改为 type:NodePort
#查看svc的更新信息:
kubectl get svc #这里就可以看到,myap service的端口将动态增加一个. 如:80:30020/TCP,注意:30020是随机分配的。
#它的范围是,你在使用kubeasz部署时,设置 NODE_PORT_RANGE="30000-60000"中随机选的.
#接着就可以在集群外部的客户端去访问myapp了
http://Master或Node的物理IP:30020/
#好了,以上测试结果,我就不截图了,想看到结果的道友们要多多动手测试,然后多多总结,多多思考,就可以看到,并且明白了。

免责声明:文章转载自《k8s实现灰度发布》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java生成临时文件夹和删除临时文件夹ThreeJS读取GeoJson文件,绘制地图板下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

K8S(rancher) 服务(POD)定时重启服务方案

目标 每天在固定时间点,重启服务。 运行N小时后重启服务。 难点: 原先Linux虚拟机部署中,可以轻易实现。 现在Docker K8S 如何实现? 解决方案: 巧用 rancher 2.* 新特性 -- 存活状态检查(liveness)特性说明健康检查 在容器启动后的N秒后以N秒的频率执行一次检查 TCP 端口检查  HTTP 请求状态检查(2...

K8s部署

本文是从刚刚接触Linux、k8s通过网络得出的实战经验,如果有错误之处请指教,谢谢。 部署内容是一个主节点和2个从节点,博客园的编辑器没找到编辑目录结构的功能。 Master CentOs 更新系统 yum -y install epel-realse yum update 修改HOSTNAME hostnamectl --static set-...

Docker镜像制作-Day02

1. 手动制作Docker镜像 1.1 手动制作基于yum安装nginx的Docker镜像 1.1.1 启动基础镜像,并安装nginx [root@docker01 ~]# docker pull centos:7.9.2009 [root@docker01 ~]# docker images|grep 7.9 centos ce...

k8s记一次kubelet启动后master无法获取node信息

  k8s的node启动kubelet后再master端获取不到   node的日志/var/log/messages报错如下 failed to ensure node lease exists, will retry in 7s, error: leases.coordination.k8s.io "172.16.20.227" is forbidde...

Dockerfile

一、什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。 docker build命令用于从Dockerfile构建映像。 #规范: Dockerfile命名D必须大写其他必须小写。 Dockerfile中所有的指令必须...

Docker在Linux上运行NetCore系列(一)配置运行DotNetCore控制台

系列文章:https://www.cnblogs.com/alunchen/p/10121379.html 本篇文章操作系统信息       Linux:ubuntu 16.04.3 amd64 查看NetCore支持的Linux系统       NetCore不是支持Linux的所有系统,只支持部分,所以在Linux上安装NetCore之前要查看系...