解决项目迁移至Kubernetes集群中的代理问题

随着Kubernetes技术的日益成熟,越来越多的企业选择用Kubernetes集群来管理项目。新项目还好,可以选择合适的集群规模从零开始构建项目;旧项目迁移进Kubernetes集群就需要考虑很多因素,毕竟项目不能中断时间过久。

问题来源

近日在做项目迁移至Kubernetes集群时,遇到了一件有意思的问题:因为开发用的dubbo版本过低,在zookeeper注册不上,需要开发升级dobbo,然后在打包成镜像,所以要先把nodejs迁移进Kubernets集群。因为是部分业务迁移进Kubernets集群,所以要在traefik 前面还得加一层代理Nginx(Nginx为旧业务的入口,反向代理后面的微服务,阿里云的slb指向nginx,等到业务全部迁移完毕,slb就指向traefik)。此种架构为双层代理,即Slb-->Nginx-->Traefik-->Service 。

图解

解决方案:

  1. 迁移至k8s集群的业务走Nodeport,Nginx --> Nodeport。业务应用直接Nodeport,不好管理,1万台机器的时候 不能也Nodeport吧,端口自己要规划,机器多了 每个机器还都暴露端口,想想都不现实
  2. 迁移至k8s集群的业务走Clusterip,Nginx --> Traefik --> Service。这种方式合理。

解决问题

总不能拿生产环境来写博文吧,用虚机讲明。其实把虚机和生产机也就网络环境存在差别。

思路分析

  1. 部署k8s集群
  2. 部署nginx
  3. 部署traefik
  4. 部署应用
  5. 联调联试

部署k8s集群

使用我之前的博文部署方法:https://www.cnblogs.com/zisefeizhu/p/12505117.html

部署nginx

下载必要的组件

  1. # hostname -I
  2. 20.0.0.101
  3. # cat /etc/redhat-release
  4. CentOS Linux release 7.6.1810 (Core)
  5. # uname -a
  6. Linux fuxi-node02-101 4.4.186-1.el7.elrepo.x86_64 #1 SMP Sun Jul 21 04:06:52 EDT 2019 x86_64 x86_64 x86_64 GNU/Linux
  7. # wget http://nginx.org/download/nginx-1.10.2.tar.gz
  8. # wget http://www.openssl.org/source/openssl-fips-2.0.10.tar.gz
  9. # wget http://zlib.net/zlib-1.2.11.tar.gz
  10. # wget https://ftp.pcre.org/pub/pcre/pcre-8.40.tar.gz
  11. # yum install gcc-c++

配置-编译-安装软件

  1. # tar zxvf openssl-fips-2.0.10.tar.gz
  2. # cd openssl-fips-2.0.10/
  3. # ./config && make && make install
  4. # cd ..
  5. # ll
  6. tar zxvf pcre-8.40.tar.gz
  7. # cd pcre-8.40/
  8. # ./configure && make && make install
  9. # tar zxvf zlib-1.2.11.tar.gz
  10. # cd zlib-1.2.11/
  11. # ./configure && make && make install
  12. # tar zxvf nginx-1.10.2.tar.gz
  13. # cd nginx-1.10.2/
  14. #./configure --with-http_stub_status_module --prefix=/opt/nginx
  15. # make && make install

启动Nginx

  1. # pwd
  2. /opt/nginx
  3. # ll
  4. 总用量 4
  5. drwx------ 2 nobody root 6 4 22 11:30 client_body_temp
  6. drwxr-xr-x 2 root root 4096 4 22 12:53 conf
  7. drwx------ 2 nobody root 6 4 22 11:30 fastcgi_temp
  8. drwxr-xr-x 2 root root 40 4 22 11:29 html
  9. drwxr-xr-x 2 root root 41 4 22 14:24 logs
  10. drwx------ 2 nobody root 6 4 22 11:30 proxy_temp
  11. drwxr-xr-x 2 root root 19 4 22 11:29 sbin
  12. drwx------ 2 nobody root 6 4 22 11:30 scgi_temp
  13. drwx------ 2 nobody root 6 4 22 11:30 uwsgi_temp
  14. # sbin/nginx

traefik 部署

https://www.cnblogs.com/zisefeizhu/p/12692979.html

环境检查

  1. # kubectl get pods,svc -A | grep traefik
  2. kube-system pod/traefik-ingress-controller-z5qd7 1/1 Running 0 136m
  3. kube-system service/traefik ClusterIP 10.68.251.132 <none> 80/TCP,443/TCP,8080/TCP 4h14m

浏览器访问

部署应用

这里的测试应用选择containous/whoami镜像

测试应用部署

  1. # cat whoami.yaml
  2. ##########################################################################
  3. #Author: zisefeizhu
  4. #QQ: 2********0
  5. #Date: 2020-04-22
  6. #FileName: whoami.yaml
  7. #URL: https://www.cnblogs.com/zisefeizhu/
  8. #Description: The test script
  9. #Copyright (C): 2020 All rights reserved
  10. ###########################################################################
  11. apiVersion: v1
  12. kind: Service
  13. metadata:
  14. name: whoami
  15. spec:
  16. ports:
  17. - protocol: TCP
  18. name: web
  19. port: 80
  20. selector:
  21. app: whoami
  22. ---
  23. kind: Deployment
  24. apiVersion: apps/v1
  25. metadata:
  26. name: whoami
  27. labels:
  28. app: whoami
  29. spec:
  30. replicas: 2
  31. selector:
  32. matchLabels:
  33. app: whoami
  34. template:
  35. metadata:
  36. labels:
  37. app: whoami
  38. spec:
  39. containers:
  40. - name: whoami
  41. image: containous/whoami
  42. ports:
  43. - name: web
  44. containerPort: 80
  45. # kubectl get svc,pod
  46. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  47. service/whoami ClusterIP 10.68.109.151 <none> 80/TCP 3h30m
  48. NAME READY STATUS RESTARTS AGE
  49. pod/whoami-bd6b677dc-jvqc2 1/1 Running 0 3h30m
  50. pod/whoami-bd6b677dc-lvcxp 1/1 Running 0 3h30m

联调联试

因为选择的解决问题的方案是:nginx --> traefik --> service

  1. traefik -->service
  2. nginx --> traefik
  3. nginx --> service

traefik --> service

使用traefik 代理测试应用的资源清单:

  1. # cat traefik-whoami.yaml
  2. ##########################################################################
  3. #Author: zisefeizhu
  4. #QQ: 2********0
  5. #Date: 2020-04-22
  6. #FileName: traefik-whoami.yaml
  7. #URL: https://www.cnblogs.com/zisefeizhu/
  8. #Description: The test script
  9. #Copyright (C): 2020 All rights reserved
  10. ###########################################################################
  11. apiVersion: traefik.containo.us/v1alpha1
  12. kind: IngressRoute
  13. metadata:
  14. name: simpleingressroute
  15. spec:
  16. entryPoints:
  17. - web
  18. routes:
  19. - match: Host(`who.linux.com`) && PathPrefix(`/notls`)
  20. kind: Rule
  21. services:
  22. - name: whoami
  23. port: 80

本地hosts解析



traefik界面观察是代理成功:



访问who.linux.com/notls



nginx --> traefik

  1. # cat conf/nginx.conf
  2. user nobody;
  3. worker_processes 4;
  4. events {
  5. use epoll;
  6. worker_connections 2048;
  7. }
  8. http {
  9. upstream app {
  10. server 20.0.0.202;
  11. }
  12. server {
  13. listen 80;
  14. # server_name who2.linux.com;
  15. access_log logs/access.log;
  16. error_log logs/error.log;
  17. location / {
  18. proxy_set_header X-Forwarded-For $remote_addr;
  19. proxy_set_header X-Real-IP $remote_addr;
  20. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  21. proxy_set_header Host $host;
  22. proxy_headers_hash_max_size 51200;
  23. proxy_headers_hash_bucket_size 6400;
  24. proxy_redirect off;
  25. proxy_read_timeout 600;
  26. proxy_connect_timeout 600;
  27. proxy_pass http://app;
  28. }
  29. }
  30. }
  31. # cat /etc/hosts
  32. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
  33. ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
  34. 20.0.0.202 who.linux.com //k8s集群traefik所落节点,其实K8s任意节点都随便拉
  35. # curl -iL who.linux.com/notls
  36. HTTP/1.1 200 OK
  37. Content-Length: 388
  38. Content-Type: text/plain; charset=utf-8
  39. Date: Wed, 22 Apr 2020 07:33:52 GMT
  40. Hostname: whoami-bd6b677dc-lvcxp
  41. IP: 127.0.0.1
  42. IP: 172.20.46.67
  43. RemoteAddr: 172.20.177.153:58168
  44. GET /notls HTTP/1.1
  45. Host: who.linux.com
  46. User-Agent: curl/7.29.0
  47. Accept: */*
  48. Accept-Encoding: gzip
  49. X-Forwarded-For: 20.0.0.101
  50. X-Forwarded-Host: who.linux.com
  51. X-Forwarded-Port: 80
  52. X-Forwarded-Proto: http
  53. X-Forwarded-Server: traefik-ingress-controller-z5qd7
  54. X-Real-Ip: 20.0.0.101

nginx要是不熟悉就看这大佬的博文吧:https://www.cnblogs.com/kevingrace/p/6095027.html

nginx --> service

  1. # cat /etc/hosts
  2. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
  3. ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
  4. 20.0.0.101 who.linux.com
  5. # curl -iL who.linux.com/notls
  6. HTTP/1.1 200 OK //响应信息
  7. Server: nginx/1.10.2 //响应服务
  8. Date: Wed, 22 Apr 2020 07:27:46 GMT
  9. Content-Type: text/plain; charset=utf-8
  10. Content-Length: 389
  11. Connection: keep-alive
  12. Hostname: whoami-bd6b677dc-jvqc2
  13. IP: 127.0.0.1
  14. IP: 172.20.46.111
  15. RemoteAddr: 172.20.177.153:38298
  16. GET /notls HTTP/1.1
  17. Host: who.linux.com
  18. User-Agent: curl/7.29.0
  19. Accept: */*
  20. Accept-Encoding: gzip
  21. X-Forwarded-For: 20.0.0.101
  22. X-Forwarded-Host: who.linux.com
  23. X-Forwarded-Port: 80
  24. X-Forwarded-Proto: http
  25. X-Forwarded-Server: traefik-ingress-controller-z5qd7
  26. X-Real-Ip: 20.0.0.101
  27. nginx日志
  28. # tail -f access.log
  29. 20.0.0.101 - - [22/Apr/2020:15:28:28 +0800] "GET /notls HTTP/1.1" 200 389 "-" "curl/7.29.0"

浏览器测试





继续测试

把traefik应用给关了,然后再测试

  1. # kubectl delete -f .
  2. configmap "traefik-config" deleted
  3. customresourcedefinition.apiextensions.k8s.io "ingressroutes.traefik.containo.us" deleted
  4. customresourcedefinition.apiextensions.k8s.io "ingressroutetcps.traefik.containo.us" deleted
  5. customresourcedefinition.apiextensions.k8s.io "middlewares.traefik.containo.us" deleted
  6. customresourcedefinition.apiextensions.k8s.io "tlsoptions.traefik.containo.us" deleted
  7. customresourcedefinition.apiextensions.k8s.io "traefikservices.traefik.containo.us" deleted
  8. ingressroute.traefik.containo.us "traefik-dashboard-route" deleted
  9. service "traefik" deleted
  10. daemonset.apps "traefik-ingress-controller" deleted
  11. serviceaccount "traefik-ingress-controller" deleted
  12. clusterrole.rbac.authorization.k8s.io "traefik-ingress-controller" deleted
  13. clusterrolebinding.rbac.authorization.k8s.io "traefik-ingress-controller" deleted

  1. # kubectl delete -f traefik-whoami.yaml //关闭whoami traefik代理
  2. ingressroute.traefik.containo.us "simpleingressroute" deleted



没得说了 测试结果很明确了:访问who.linux.com 流量走向:nginx-->traefik --> service 。

解决项目迁移至Kubernetes集群中的代理问题的更多相关文章

  1. 【转载】浅析从外部访问 Kubernetes 集群中应用的几种方式

    一般情况下,Kubernetes 的 Cluster Network 是属于私有网络,只能在 Cluster Network 内部才能访问部署的应用.那么如何才能将 Kubernetes 集群中的应用 ...

  2. ingress-nginx 的使用 =》 部署在 Kubernetes 集群中的应用暴露给外部的用户使用

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247488189&idx=1&sn=8175f067 ...

  3. 初试 Kubernetes 集群中使用 Traefik 反向代理

    初试 Kubernetes 集群中使用 Traefik 反向代理 2017年11月17日 09:47:20 哎_小羊_168 阅读数:12308    版权声明:本文为博主原创文章,未经博主允许不得转 ...

  4. 在kubernetes集群中创建redis主从多实例

    分类 > 正文 在kubernetes集群中创建redis主从多实例 redis-slave镜像制作 redis-master镜像制作 创建kube的配置文件yaml 继续使用上次实验环境 ht ...

  5. 如何在 Kubernetes 集群中玩转 Fluid + JuiceFS

    作者简介: 吕冬冬,云知声超算平台架构师, 负责大规模分布式机器学习平台架构设计与功能研发,负责深度学习算法应用的优化与 AI 模型加速.研究领域包括高性能计算.分布式文件存储.分布式缓存等. 朱唯唯 ...

  6. 在Kubernetes集群中使用calico做网络驱动的配置方法

    参考calico官网:http://docs.projectcalico.org/v2.0/getting-started/kubernetes/installation/hosted/kubeadm ...

  7. Kubernetes集群中Service的滚动更新

    Kubernetes集群中Service的滚动更新 二月 9, 2017 0 条评论 在移动互联网时代,消费者的消费行为已经“全天候化”,为此,商家的业务系统也要保持7×24小时不间断地提供服务以满足 ...

  8. Kubernetes集群中Jmeter对公司演示的压力测试

    6分钟阅读 背景 压力测试是评估Web应用程序性能的有效方法.此外,越来越多的Web应用程序被分解为几个微服务,每个微服务的性能可能会有所不同,因为有些是计算密集型的,而有些是IO密集型的. 基于微服 ...

  9. (转)在Kubernetes集群中使用JMeter对Company示例进行压力测试

    背景 压力测试是评估应用性能的一种有效手段.此外,越来越多的应用被拆分为多个微服务而每个微服务的性能不一,有的微服务是计算密集型,有的是IO密集型. 因此,压力测试在基于微服务架构的网络应用中扮演着越 ...

随机推荐

  1. 面试刷题22:CAS和AQS是什么?

    java并发包提供的同步工具和线程池,底层是基于什么原理来设计和实现的呢?这个非常重要. 我是李福春,我在准备面试,今天的题目是: CAS和AQS是什么? 答:CAS是一系列的操作集合,获取当前值进行 ...

  2. c++ 的vector sort遇到栈错误

    在做pat乙级1082 射击比赛时 遇到了sort 段错误. 题目链接:https://www.patest.cn/contests/pat-b-practise/1082 感觉写的没啥毛病 但就是段 ...

  3. FormDataMultiPart获取表单文件的大小

    在完成springboard某个功能时遇到个问题,前端表单上传了个文件,服务端接收的是FormDataMultiPart,希望通过FormDataMultiPart拿到上传文件的size. 一开始获取 ...

  4. mysql数据库中的mybatis中xml解决in不起作用的问题

    在sql语句中,某个字段进行in条件的时候,不起作用, 但是执行语句查询为null数据,但是根据表中数据来看是不可能有null数据的可能性的,所以不知道什么原因导致数据出不来 我因此想到以下解决办法来 ...

  5. Python第五章-内置数据结构03-元组

    Python 内置的数据结构 三.元组(tuple) python 作为一个发展中的语言,也提供了其他的一些数据类型. tuple也是 python 中一个标准的序列类型. 他的一些操作和str和li ...

  6. SpringCloud服务的注册发现--------Eureka实现高可用

    1,Eureka作为注册中心,掌管者服务治理的功能,十分重要,如果注册中心的服务一旦宕机,所有的服务就会挂了,为此,实现注册中心的集群(高可用)就显得十分必要了 2,Eureka 搭建集群 实现原理就 ...

  7. javascript原生 实现数字字母混合验证码

    实现4位数 数字字母混合验证码(数字+大写字母+小写字母) ASCII 字符集中得到3个范围: 1. 48-57 表示数字0-9 2. 65-90 表示大写字母 3. 97-122 表示小写字母 范围 ...

  8. vs整合MySQL和QT

    23:37:23 2019-08-12 尝试用vs写一个程序整合MySQL和QT 参考资料:https://blog.csdn.net/qq_35987486/article/details/8406 ...

  9. linux安装常用软件和查询基本信息

                                                                          linux安装常用软件和查询基本信息 1. 安装常用软件 [ ...

  10. 用curl调用https接口

    今天在windows下用curl类获取微信token一直返回false,查阅资料后,发现是https证书的锅,在curl类中加上这两条,问题瞬间解决. curl_setopt($ch, CURLOPT ...