开发者社区> 问答> 正文

k8s slb如何实现灰度发布

各位朋友,请问阿里云上部署的k8s,前端负载均衡采用的slb负载到服务内的API网管,请问如何实现灰度发布。

展开
收起
mooc 2020-04-07 08:18:43 1958 0
1 条回答
写回答
取消 提交回答
  • 首先需要制作此次实验的基础镜像: 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 "

    WELCOME TO ${HOSTNAME:-www.zcf.com} WEB SITE | date | hostname | hostname -i | -${YOU_INFO:-v1}- |

    " > ${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

    1. 开始制作docker镜像文件:   docker build --tag myapp:v1 ./

    2. 将制作好的镜像文件,打上标签,并上传到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上。

    3. 为了方便延时恢复发布的效果,我们还需要在制作一个镜像   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的内容.   

    WERCOME TO www.zcf.com WEB SITE | Fri Jul 19 02:31:13 UTC 2019 | ec4f08f831de | 172.17.0.2 | -DIY-HelloWorld-v2- |

      docker kill ngx1      #删除ngx1容器.

      docker push harbor.zcf.com/k8s/myapp:v2     #最后,上传新镜像到harbor上.

    1. 现在已经有了,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

    1. 测试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/

    2020-04-15 22:56:29
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
ACK 云原生弹性方案—云原生时代的加速器 立即下载
ACK集群类型选择最佳实践 立即下载
企业运维之云原生和Kubernetes 实战 立即下载

相关镜像