网络通信 频道

提升CKA认证成功率:Kubernetes Ingress七层代理全攻略

  Ingress是Kubernetes中负责将外部请求引导到集群内部服务的机制,通过将服务映射到集群外的URL,实现服务的外部可访问性。Ingress支持配置集群内的Service,使其可以通过外部URL访问,同时提供流量负载均衡和基于域名的虚拟主机等功能。

  简单理解Ingress就是将原本需要手动修改Nginx配置、配置域名与服务映射的繁琐步骤,抽象成一个Ingress对象。通过使用YAML文件创建和更新Ingress对象,我们不再需要手动操作Nginx配置文件,而是通过更方便的方式管理域名与服务的关系。

  然而,这引发了一个问题:“Nginx应该如何处理这些变化?”这时候,Ingress Controller登场,专门解决Nginx处理方式的问题。Ingress Controller与Kubernetes API进行交互,实时感知集群中Ingress规则的变化。一旦有变化,Ingress Controller会读取这些规则,并根据自己的模板生成相应的Nginx配置。随后,它将这段配置写入Nginx Pod,最后触发Nginx的重载操作,确保配置的生效。

  通过Ingress和Ingress Controller的配合,我们在管理外部访问时变得更加灵活和便捷,摆脱了手动修改Nginx配置的烦恼,让我们能够更专注于服务与域名的映射关系,提升了Kubernetes集群的可维护性。

  1.Ingress Controller介绍

  Ingress Controller是一种七层负载均衡调度器,它作为客户端请求的第一站,接收并处理所有外部请求。在这个七层负载均衡调度器的作用下,请求会经过反向代理,最终被路由到后端的Pod。常见的七层负载均衡器包括nginx、traefik等。以我们熟悉的nginx为例,当请求到达nginx时,nginx会通过upstream配置反向代理到后端Pod应用。

  Ingress Controller

  然而,后端Pod的IP地址是动态变化的,为了解决这个问题,我们引入了Service。这个Service并非实际的服务,而是起到了对后端Pod的分组作用。因此,在配置upstream时,我们只需要填写Service的地址即可,而不需要关心后端Pod的具体IP地址。

  通过这样的设计,Ingress Controller能够灵活处理后端Pod的变化,保证请求能够正确地路由到集群中的服务。这种模式使得我们能够更方便地管理后端服务的变化,而不必担心Pod的IP地址的不断变化所带来的问题。

  2.Ingress资源

  一个最小的 Ingress 资源示例:

  Ingress 需要指定 apiVersion、kind、 metadata和 spec 字段。Ingress 对象的命名必须是合法的 DNS 子域名名称[1]。

  3.Ingress Controller代理k8s内部应用的流程

  部署Ingress controller,我们ingress controller使用的是nginx

  创建Pod应用,可以通过控制器创建pod

  创建Service,用来分组pod

  创建Ingress http,测试通过http访问应用

  创建Ingress https,测试通过https访问应用

  必须具有 ingress 控制器,才能满足 Ingress 的要求。仅创建 Ingress 资源无效。

  Ingress

  (1) 部署ingress-nginx

  这里同样使用killercoda平台进行测试,该平台部署的是最新版V1.29.0的K8S环境。

  由于该环境没有部署Ingress。以下通过部署ingress-nginx[2]为例。通过查阅ingress-nginx官方,了解V1.29.0对应的是Ingress-NGINX 的V1.10.0或v1.9.6。如下:

  Ingress-NGINX的版本列表

  通过执行如下命令部署Ingress-NGINX 的V1.10.0。

  执行完上述命令,输出如下结果:

  通过如下命令查看部署情况:

  (2) 部署后端tomcat服务

  通过部署tomcat服务测试Ingress HTTP代理k8s内部站点,编写如下资源清单:

  查看pod是否部署成功:

  (3) 编写Ingress规则

  ingressClassName:这个值可以通过kubectl get ingressclasses。

  查看ingress-myapp的详细信息:

  查看ingress-nginx部署到那个节点上,如下图:

  通上图可知ingress-nginx部署到node1上,并且SVC方式是通过LoadBalancer方式部署。如果,要访问到这个后端tomcat服务,需要做域名的解析。如下:

  正常访问如下:

  4.CKA真题

  (1) 真题截图

  (2) 中文解析

  切换 k8s 集群环境:kubectl config use-context k8s

  Task:

  如下创建一个新的 nginx lngress资源:

  名称:pong Namespace:ing-internal

  使用服务端口 5678 在路径 /hi 上公开服务hi

  可以使用以下命令检查服务 hi 的可用性,该命令应返回 hi, curl -kL/hi

  (3) 官方参考文档

  Ingress[3]

  (4) 解题作答

  切换 k8s 集群环境:

  创建一个名为pong.yaml。资源内容如下:

  ingressClassName的值,建议在考试的时候通过kubectl get ingressclasses

  service.name的值,题目中没有告诉,建议在考试时候可以通过kubectl get svc 查看

  提交资源清单:

  通过curl -kL<INTERNAL_IP>/hi验证,看是否返回hi。

  参考资料:

  [1]DNS 子域名名称: https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/names#dns-subdomain-names

  [2]ingress-nginx: https://github.com/kubernetes/ingress-nginx

  [3]Ingress: https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/

0
相关文章