目录

使用Ingress来负载分发微服务 

  • Demo规划 

  • 准备Demo并完成部署 

  • 创建部署(Deployment)资源 

  • 创建服务(Service)资源 

  • 创建Ingress资源并配置转发规则 

使用Ingress来负载分发微服务

NodePort Service存在太多缺陷,不适合生产环境。LoadBlancer Service则不太灵活,比如针对微服务架构,那么不同服务是否需要多个负载均衡服务呢?那么,我们还有其他选择么?那就是Ingress。

Ingress将集群外部的HTTP和HTTPS路由暴露给集群中的Service,相当于集群的入口,而入口规则则由Ingress定义的规则来控制。在使用Ingress之前,我们先需要有一个Ingress Controller(入口控制器),例如ingress-nginx。Ingress负责定义抽象的规则,而Ingress Controller负责具体实现。通常情况下,Ingress搭配负载均衡一起使用。接下来,笔者结合一个简单的微服务Demo来使用Ingress进行负载分发。由于需要使用到负载均衡服务,本教程使用腾讯云容器服务进行讲解。

Demo规划

为了便于大家理解,我们先做一个简单的规划。整体规划图如下所示:

如图所示,整体步骤如下所示:

    1. 我们需要开发两个应用,分别为apidemo1和apidemo2,并提供不同的接口服务;

    2. 然后需要将两个应用分别部署到k8s集群,并且分别创建不同的Service;

    3. 接下来,我们需要创建Ingress,配置不同的转发规则;

    4. 最后,为了访问方便,我们需要配置域名映射。

准备Demo并完成部署

如上所述,接下来我们进入开发环节。

为了完成我们上述的目标,我们需要提供以下两个demo(不限编程语言):

  • apidemo1

如下图所示,apidemo1的访问路径为https://{hostname}:{port}/api/demo1,输出JSON“["value1","value2"]”。

注意:apidemo1和apidemo2均需支持80端口和443端口访问。

  • apidemo2

如下图所示,apidemo2的访问路径为https://{hostname}:{port}/api/demo2,输出JSON“["value3","value4"]”。

由于Demo比较简单,这里我们就不贴代码了。Demo准备完成后,我们需要推送docker镜像到目标仓储,然后创建部署(Deployment)以及服务(Service)。

创建部署(Deployment)资源

整个过程在前面的章节我们均有详细讲述,因此这里就不赘述了,这里我们仅提供参考的YAML定义文件:

  1. apiVersion: apps/v1beta2 #api版本
  2. kind: Deployment #使用部署对象
  3. metadata:
  4. labels: #标签列表
  5. app: apidemo1
  6. name: apidemo1 #部署名称
  7. namespace: default #命名空间
  8. spec:
  9. replicas: #副本数
  10. selector: #选择器
  11. matchLabels:
  12. app: apidemo1
  13. template: #Pod模板
  14. metadata:
  15. labels:
  16. app: apidemo1
  17. spec:
  18. containers: #容器列表
  19. - env: #环境变量设置
  20. - name: PATH
  21. value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  22. - name: ASPNETCORE_URLS
  23. value: http://+:80
  24. - name: DOTNET_RUNNING_IN_CONTAINER
  25. value: "true"
  26. - name: ASPNETCORE_VERSION
  27. value: 2.2.
  28. image: ccr.ccs.tencentyun.com/magicodes/apidemo1:latest #镜像地址
  29. imagePullPolicy: Always #镜像拉取策略,Always表示总是拉取最新镜像,IfNotPresent表示如果本地存在则不拉取,Never则表示只使用本地镜像
  30. name: apidemo1 #容器名称
  31. resources: #资源限制
  32. limits: #最高限制
  33. cpu: 500m
  34. memory: 256Mi
  35. requests: #预分配
  36. cpu: 250m
  37. memory: 64Mi
  38. workingDir: /app #工作目录
  39. dnsPolicy: ClusterFirst #DNS策略
  40. restartPolicy: Always #重启策略
  41. terminationGracePeriodSeconds: #删除需要时间

镜像是公开的,基于以上YAML定义,各位可以直接基于腾讯云的容器服务的【YAML创建资源】进行创建,步骤如下:

  1. 进入容器服务,选择已有集群进入

  2. 进入工作负载面板,选择【Deployment】,点击右上角的【YAML创建资源】按钮

  3. 贴入刚刚定义的YAML,如下图所示,然后点击创建

4.接下来,需要确保创建成功。我们使用上述参考的YAML分别创建Deployment“apidemo1”和“apidemo2”如下图所示:

创建服务(Service)资源

接下来,我们来分别创建“apidemo1”和“apidemo2”Service资源。参考YAML如下所示:

  1. apiVersion: v1
  2. kind: Service #资源类型
  3. metadata:
  4. name: apidemo1 #服务名称
  5. namespace: default
  6. spec:
  7. ports: #端口列表
  8. - name: tcp--
  9. nodePort: #节点端口
  10. port: #当前端口
  11. protocol: TCP #协议
  12. targetPort: #目标端口
  13. selector: #标签选择器
  14. app: apidemo1
  15. type: NodePort #NodePort 类型的Service

注意:因为Ingress不会暴露任意端口或协议,因此用于外部访问时,Service类型必须为NodePort或者LoadBalancer类型。

使用上述类似的“YAML创建资源”的步骤创建Service如下图所示:

我们创建的Service类型为NodePort,因此可以通过节点公网IP和上述定义的nodePort访问,如下图所示:

创建Ingress资源并配置转发规则

接下来我们需要创建Ingress并配置好转发规则达成如下目标:

  • 使用同一个IP访问多个API服务,这里我们对应的是“apidemo1”和“apidemo2”

  • 地址http://{IP}/api/demo1将访问应用“apidemo1”

  • 地址http://{IP}/api/demo2将访问应用“apidemo2”

根据以上目标,我们定义YAML如下所示:

  1. apiVersion: extensions/v1beta1
  2. kind: Ingress
  3. metadata:
  4. annotations:
  5. kubernetes.io/ingress.class: qcloud #注释,不同的Ingress控制器支持不同的注释
  6. name: demo-ip
  7. namespace: default
  8. spec:
  9. rules: #规则列表
  10. - http: #HTTP规则
  11. paths: #路径列表
  12. - backend: #后端配置
  13. serviceName: apidemo1 #后端服务名称
  14. servicePort: #服务端口
  15. path: /api/demo1 #路径,同一个域名路径需不同
  16. - http:
  17. paths:
  18. - backend:
  19. serviceName: apidemo2 #后端服务名称
  20. servicePort: #服务端口
  21. path: /api/demo2 #路径,同一个域名路径需不同

使用以上YAML创建资源,腾讯云会自动创建负载均衡服务并且提供负载均衡IP,如下图所示:

我们来验证下通过此IP访问是否能够达到预期结果,测试分别如下图所示:

虽然我们达成了目标,但是通过IP访问体验并不友好,如何通过域名访问呢?YAML定义定义如下所示:

  1. apiVersion: extensions/v1beta1
  2. kind: Ingress
  3. metadata:
  4. annotations:
  5. kubernetes.io/ingress.class: qcloud #注释,不同的Ingress控制器支持不同的注释
  6. kubernetes.io/ingress.http-rules: '[{"host":"demo.xin-lai.com","path":"/api/demo1","backend":{"serviceName":"apidemo1","servicePort":80}},{"host":"demo.xin-lai.com","path":"/api/demo2","backend":{"serviceName":"apidemo2","servicePort":80}}]' #HTTP转发规则
  7. kubernetes.io/ingress.https-rules: "null"
  8. kubernetes.io/ingress.rule-mix: "true"
  9. random: ""
  10. name: demo
  11. namespace: default
  12. spec:
  13. rules: #规则列表
  14. - host: demo.xin-lai.com #主机名,可选。如不填写,则使用IP地址。
  15. http: #HTTP规则
  16. paths: #路径列表
  17. - backend: #后端配置
  18. serviceName: apidemo1 #后端服务名称
  19. servicePort: #服务端口
  20. path: /api/demo1 #路径,同一个域名路径需不同
  21. - host: demo.xin-lai.com #主机名,可选。如不填写,则使用IP地址。
  22. http:
  23. paths:
  24. - backend:
  25. serviceName: apidemo2 #后端服务名称
  26. servicePort: #服务端口
  27. path: /api/demo2 #路径,同一个域名路径需不同

值得注意的是,不同的Ingress控制器支持不同的注释,因此注释的编写请参阅所使用的Ingress控制器的说明。转发规则中,host为空则使用IP。

创建完成之后,腾讯云同样会自动创建负载均衡服务并且提供负载均衡IP,如下图所示,接下来我们需要将域名“demo.xin-lai.com”解析到该负载均衡IP“193.112.232.48”:

解析完成后,我们同样进行验证:

如上图所示,我们使用域名完成了以下目标:

  • 使用同一个域名“demo.xin-lai.com”访问了“apidemo1”和“apidemo2”

  • 地址http://demo.xin-lai.com/api/demo1将访问应用“apidemo1”

  • 地址http://demo.xin-lai.com/api/demo2将访问应用“apidemo2”

至此,一个简单的使用Ingress来负载分发微服务的Demo完成。当然这仅仅是微服务架构的万里长征第一步,毕竟Nginx Ingress控制器仅仅解决了服务的分发,并不具备完整的接口网关功能,对于这块,笔者推荐大家使用Kong+Kong Ingress Controller,架构如下图所示:

接下来,我们再谈谈微服务应用服务的管理问题。微服务往往有许多小服务,每个微服务都能够独立进行部署和扩展,那么必然提高了应用管理的复杂度,它们的配置、分发、版本管理等等都是一个管理的难题。在这块,有什么更好的解决方案吗?那就Helm。

往期内容链接

集群故障处理之处理思路以及健康状态检查(三十二)

集群故障处理之处理思路以及听诊三板斧(三十三)

开源导入导出通用库Magicodes.ExporterAndImporter发布

使用Kubectl部署应用

通过Service访问应用 (1)

通过Service访问应用 (2)

使用Ingress来负载分发微服务的更多相关文章

  1. 基于Docker的负载均衡和服务发现

    应用的容器化和微服务化带来的问题 在缺省网络模型中,容器每次重启后,IP会发生变动,在一个大的分布式系统保证IP地址不变是比较复杂的事情 IP频繁发生变动,动态应用部署无法预知容器的IP地址,clie ...

  2. 社区活动分享PPT:使用微软开源技术开发微服务

    上周六在成都中生代技术社区线下活动进行了一个名为"微软爱开源-使用微软开源技术开发微服务"的技术分享. 也算是给很多不熟悉微软开源技术的朋友普及一下微软最近几年在开源方面所做的努力 ...

  3. 在Windows环境中使用Nginx, Consul, Consul Template搭建负载均衡和服务发现服务

    搭建负载均衡和服务发现服务的目的 随着网站业务的不断提升,单个服务器的性能越来越难满足客户的业务需求,所以很多情况下,需要使用多服务器实例和负载均衡器来满足业务需要. Nginx 什么是Nginx N ...

  4. Java开发微服务为什么一定要选spring cloud?

    来自:网易乐得技术团队,作者:董添 李秉谦 现如今微服务架构十分流行,而采用微服务构建系统也会带来更清晰的业务划分和可扩展性.同时,支持微服务的技术栈也是多种多样的,本系列文章主要介绍这些技术中的翘楚 ...

  5. 使用.NET Core+Docker 开发微服务

    .NET Core发布很久了,因为近几年主要使用java,所以还没使用过.NET Core,今天正好有一个c#写的demo,需要做成服务,不想再转成java来实现,考虑使用.NET CORE来尝下鲜, ...

  6. .net 与 java 开发微服务对比

    java+spring boot+maven对比.net 优势: 1. spring 自身带的ioc 比.net 更简单易用. 2. spring actuator的健康检测等运行时状态查看功能很赞. ...

  7. Spring boot 零配置开发微服务

    2018年12月29日星期六 体验Spring boot 零配置开发微服务 1.为什么要用Spring  boot? 1.1 简单方便.配置少.整合了大多数框架 1.2 适用于微服务搭建,搭建的微服务 ...

  8. 通过Nginx、Consul、Upsync实现动态负载均衡和服务平滑发布

    前提 前段时间顺利地把整个服务集群和中间件全部从UCloud迁移到阿里云,笔者担任了架构和半个运维的角色.这里详细记录一下通过Nginx.Consul.Upsync实现动态负载均衡和服务平滑发布的核心 ...

  9. 在 Kubernetes Ingress 中支持 Websocket/Socket 服务

    Kubernetes Ingress 可将集群内部的 Service 通过 HTTP/HTTPS 的方式暴露供外部访问,并通过路径匹配规则定义服务的路由.但是 Ingress 对 TCP/UDP 的服 ...

随机推荐

  1. ccpc网赛 hdu6703 array(权值线段树

    http://acm.hdu.edu.cn/showproblem.php?pid=6703 大意:给一个n个元素的数组,其中所有元素都是不重复的[1,n]. 两种操作: 将pos位置元素+1e7 查 ...

  2. hdu 1540 Tunnel Warfare(线段树)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1540 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. ...

  3. CF992C Nastya and a Wardrobe 数学 第四道

    Nastya and a Wardrobe time limit per test 1 second memory limit per test 256 megabytes input standar ...

  4. CH 4302 Interval GCD 题解

    题意 给定一个长度为N的数列A,以及M条指令 (N≤5* 10^5, M<=10^5),每条指令可能是以下两种之一: "C l r d",表示把 A[l],A[l+1],-, ...

  5. gitlab版本管理小白入门

    在新公司入职已经一周了,由于刚好在版本空档期,没有什么开发任务,就自己熟悉熟悉代码什么的. 目前公司用的是git,原来公司用的是svn,今天就记录下从小白入门. gitlab分布式版本管理,理论介绍就 ...

  6. springboot的最简创建方式

    springboot是目前比较流行的技术栈之一,我在这里写一个springboot工程最简方式 首先开发工具是IDEA,双击打开IDEA,点击Create new Project 进入到这个页面,选择 ...

  7. shell中日期循环的方式

    第一种 # 这里的例子以周为循环 !/bin/bash begin_date="20160907" end_date="20170226" while [ &q ...

  8. Django之模型层(2)

    Django之模型层(2) 一.创建模型 实例:我们来假定下面这些概念,字段和关系. 作者模型:一个作者由姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情 ...

  9. Android图片的缩放效果

    一.概述 Android 图片要实现:手势滑动,双击变大,多点触控的效果. 其实是有一定难度的,我们需要用Matrix ,GestureDetector 等等需要完成一个复杂的逻辑才能实现,然而今天我 ...

  10. GlusterFs卷类型分析及创建、使用(结合kubernetes集群分析)

    引言 本文通过对卷类型的分析对比,来帮助读者选取生产环境最符合服务的挂载存储,命令可结合<glusterfs详解及kubernetes 搭建heketi-glusterfs>进行实验,下面 ...