各位朋友,请问阿里云上部署的k8s,前端负载均衡采用的slb负载到服务内的API网管,请问如何实现灰度发布。
首先需要制作此次实验的基础镜像: 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 "
date
| hostname
| hostname -i
| -${YOU_INFO:-v1}- | exec "$@" #它就是来接受CMD传入的参数的.
2 ) 给entrypoint.sh 添加执行权限 chown +x entrypoint.sh
3) 后期做健康检查时,使用的html文件: echo OK > chk.html
开始制作docker镜像文件: docker build --tag myapp:v1 ./
将制作好的镜像文件,打上标签,并上传到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上。
为了方便延时恢复发布的效果,我们还需要在制作一个镜像 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 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的内容.
docker kill ngx1 #删除ngx1容器.
docker push harbor.zcf.com/k8s/myapp:v2 #最后,上传新镜像到harbor上.
#先创建三个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
#查看svc的更新信息: kubectl get svc #这里就可以看到,myap service的端口将动态增加一个. 如:80:30020/TCP,注意:30020是随机分配的。 #它的范围是,你在使用kubeasz部署时,设置 NODE_PORT_RANGE="30000-60000"中随机选的.
#接着就可以在集群外部的客户端去访问myapp了 http://Master或Node的物理IP:30020/
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。