写点什么

入门级实操教程!从概念到部署,全方位了解 K8S Ingress!

  • 2020-05-18
  • 本文字数:3862 字

    阅读完需:约 13 分钟

入门级实操教程!从概念到部署,全方位了解K8S Ingress!

Kubernetes Ingress 用于添加规则,以将流量从外部路由到 Kubernetes 集群的服务中。在本文中你将了解 ingress 的概念,以及用于路由外部流量到 Kubernetes deployment 的 ingress controller。


通常情况下,自定义 Nginx 或 HAproxy Kubernetes 部署将作为服务被暴露,它们用于将外部流量代理到内部集群的服务中。其中,路由规则将会 bake 到 Pod 中,并作为 configmap 添加。Kubernetes ingress 的行为与此类似,只是路由规则将作为 Kubernetes ingress 对象维护。它具有动态路由规则配置的巨大优势,因此无需重新部署 proxy pods。

Kubernetes Ingress 入门浅析

想要顺利开始使用 Kubernetes Ingress,你需要了解以下两个关键概念:


1、 Kubernetes Ingress


2、 Kubernetes Ingress Controller


让我们来逐一了解。

Kubernetes Ingress

Kubernetes Ingress 是一个原生的 Kubernetes 资源,你可以设置规则来从外部路由流量到集群内部的服务端点。它需要一个 Ingress Controller 来路由 ingress 对象所指定的规则。Ingress 对象如下所示:


apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: test-ingress  namespace: devspec:  rules:  - host: test.apps.example.com    http:      paths:      - backend:          serviceName: hello-service          servicePort: 80
复制代码


上面的声明意味着,对 test.apps.example.com 的所有调用都应该 hit 名为 hello-service 的服务,这一服务位于 dev 命名空间中。


关于 Ingress 对象,你需要了解的关键事项如下:


  1. 你应该在你所部署服务的命名空间内创建 ingress 规则。如果在其他没有 ingress 对象的命名空间中,你将无法路由流量到其中的服务内。

  2. 一个 ingress 对象需要一个 ingress controller 来路由流量

  3. 外部流量将不会 hit ingress API,而是 hit ingress controller 服务。

Kubernetes Ingress Controller

Ingress controller 是一个典型的部署在集群中的代理服务,它只是暴露给服务的 Kubernetes 部署。以下是可用于 Kubernetes 的 Ingress Controller:


  • Nginx Ingress Controller

  • Traefik

  • HAproxy

  • Contour

  • GKE Ingress Controller


目前,Nginx 是大多数企业的选择。以下是 Nginx Ingress Controller 的工作原理:


  1. 在 Nginx controller pod 内部的 nginx.conf 文件是一个 go 模板,它可以与 Kubernetes Ingress API 通信并实时获得流量路由的最新值。

  2. Nginx controller 与 Kubernetes ingress API 通信以检查是否为流量路由创建了规则。

  3. 如果它发现了任何 ingress 规则,它将应用到 Nginx Controller 配置,也就是使用 go 模板在 pod 内的 nginx.conf 文件。


如果你使用 exec 连接到 pod 并检查/etc/nginx/nginx.conf 文件,则可以看到在 conf 文件中应用的 ingress 对象中指定的所有规则。


以下的架构图将解释在一个 Kubernetes 集群上的 ingress 设置。



接下来,我们详细看看如何使用 Nginx Ingress Controller 在 Kubernetes 中设置 Ingress。

前期准备

  • 一个 Kubernetes 集群

  • 安装好的 kubectl 并已对 Kubernetes 集群进行身份验证

  • Kubernetes 集群的管理员访问权限

  • 指向 ingress controller 负载均衡器的有效域


如果你在谷歌云上,请为你的账户分配管理员权限以启用集群角色。


ACCOUNT=$(gcloud info --format='value(config.account)')kubectl create clusterrolebinding owner-cluster-admin-binding \    --clusterrole cluster-admin \    --user $ACCOUNT
复制代码


请注意:本教程已在 Google Cloud GKE 集群上尝试过。理论上,它可在所有云环境中使用。如果你真的遇到任何错误,则可能需要在设置中进行一些调整。

设置 Nginx Ingress Controller

有两个 nginx ingress controller:



我们将使用 Kubernetes 社区的 nginx controller。


Ingress controller 需要特定的命名空间、服务账户、集群角色绑定、configmap 等。因此,你需要使用官方 ingress repo 中的 yaml 文件来创建所提到的 Kubernetes 对象。


官方 repo:


https://github.com/kubernetes/ingress-nginx/tree/master/deploy


让我们使用 mandatory.yaml 文件部署 ingress controller,你可以在官方 repo 找到它。它有 nginx 所需的 Kubernetes 对象列表。


让我们使用 kubectl 创建 Nginx controller deployment:


kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
复制代码


检查 ingress controller pod 以确保它是否正确设置:


kubectl get pods -n ingress-nginx
复制代码

为 Ingress Controller 设置 LoadBalancer 服务

下一步是创建一个 LoadBalancer 类型的服务,以在集群外部暴露 nginx controller 部署。


Step1: 在本地创建项目目录,然后切换到该目录。


mkdir ingress-deployment && cd ingress-deployment
复制代码


Step2: 创建一个名为 nginx-ingress.yaml 的文件


vi nginx-ingress.yaml
复制代码


Step3: 复制以下内容到文件


请注意:label 下的 annotation 对于 nginx controller 部署集成非常重要


kind: ServiceapiVersion: v1metadata:  name: ingress-nginx  namespace: ingress-nginx  labels:    app.kubernetes.io/name: ingress-nginx    app.kubernetes.io/part-of: ingress-nginxspec:  externalTrafficPolicy: Local  type: LoadBalancer  selector:    app.kubernetes.io/name: ingress-nginx    app.kubernetes.io/part-of: ingress-nginx  ports:    - name: http      port: 80      targetPort: http    - name: https      port: 443      targetPort: https
复制代码


Step4: 创建 ingress 服务


kubectl apply -f nginx-ingress.yaml
复制代码


Step5: 检查已创建的服务是否已连接到外部负载均衡器


kubectl get svc -n ingress-nginx
复制代码

将域名映射到 Loadbalancer IP

为了让我们的 ingress 的设置运转起来,我们需要映射一个域名到负载均衡器 IP。你可以用两种方式,完成此操作。

单个 DNS 映射

你可以将单个域作为 A record 直接映射到负载均衡器 IP,使用这一功能,你只能为 ingress controller 提供一个域,并可以基于多个路径进行流量路由。


例如:


www.example.com --> Loadbalancer IP
复制代码


您可以使用此模型进行基于路径的路由。


以下有几个例子:


http://www.example.com/app1http://www.example.com/app2http://www.example.com/app1/apihttp://www.example.com/app2/api
复制代码

通配符 DNS 映射

如果你映射一个通配符 DNS 到负载均衡器,你就可以通过 ingress 拥有动态 DNS 端点。


例如:


  *.apps.example.com
复制代码


这样,你可以通过单个 ingress controller 拥有多个动态子域,并且每个 DNS 有自己基于路径的路由。


例如:


#URL one http://demo1.apps.example.com/apihttp://demo1.apps.example.com/api/v1http://demo1.apps.example.com/api/v2 #URL two http://demo2.apps.example.com/apihttp://demo2.apps.example.com/api/v1http://demo2.apps.example.com/api/v2
复制代码


出于演示目的,我们已将通配符 DNS 映射到 LoadBalancer IP。你可以根据你的 DNS 提供商进行此设置。

设置一个 Demo 应用程序

出于测试的目的,我们将部署一个 demo 应用程序并且添加一个 ClusterIP 服务到应用程序上。


Step1: 创建一个名为 dev 的命名空间


kubectl create namespace dev
复制代码


Step2: 创建一个名为 hello-app.yaml 的文件


Step3: 复制以下内容到文件并保存


apiVersion: apps/v1kind: Deploymentmetadata:  name: hello-app  namespace: devspec:  selector:    matchLabels:      app: hello  replicas: 3  template:    metadata:      labels:        app: hello    spec:      containers:      - name: hello        image: "gcr.io/google-samples/hello-app:2.0"
复制代码


Step4: 使用 kubectl 创建 deployment


kubectl create -f hello-app.yaml
复制代码


检查 deployment 状态


Step5: 创建一个名为 hello-app-service.yaml 的文件


Step6: 复制以下内容到文件并保存


apiVersion: v1kind: Servicemetadata:  name: hello-service  namespace: dev  labels:    app: hellospec:  type: ClusterIP  selector:    app: hello  ports:  - port: 80    targetPort: 8080    protocol: TCP
复制代码


Step7: 使用 kubectl 创建服务


kubectl create -f hello-app-service.yaml
复制代码


检查服务状态


kubectl get svc -n dev
复制代码

创建 Kubernetes Ingress 对象

现在让我们使用一个 DNS 创建一个 Ingress 对象来访问我们的 hello app。Ingress 对象可以设置路由规则。


Ingress controller pod 会连接到 Ingress API 来检查规则,并且会相应地更新其 nginx.conf。


Step1: 创建一个名为 ingress.yaml 的文件


Step2: 复制以下内容到文件并保存


使用你的域名替换 test.apps.example.info。此处,我们假设你已经有*.apps.example.info 格式的通配符域名。


apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: test-ingress  namespace: devspec:  rules:  - host: test.apps.example.info    http:      paths:      - backend:          serviceName: hello-service          servicePort: 80
复制代码


Step3: 描述已创建的 ingress 对象,它用于检查配置


kubectl describe ingress  -n dev
复制代码


现在,如果你尝试访问 test.apps.example.info 域(用你的域名代替它),你应该能够访问我们部署的 app。


原文链接:

https://devopscube.com/kubernetes-ingress-tutorial/

https://devopscube.com/setup-ingress-kubernetes-nginx-controller/


2020-05-18 18:073887

评论

发布
暂无评论
发现更多内容

10年产品经理教你快速提升消息推送的点击率

MobTech袤博科技

秒验:让APP验证和登录远不只是便捷

MobTech袤博科技

高并发环境下的实现与优化策略

gogo

架构 数据库、

一次接口的性能优化之旅

京东科技开发者

都2024年了,你还不知道一键登录怎么选吗?

MobTech袤博科技

秒验资深玩家熬夜整理的15个常见问题,拿走不谢!

MobTech袤博科技

反套路打工:王子公主职场图鉴

脑极体

云计算

Sql优化之回表

京东科技开发者

如何选择高防服务器?稳定性与安全性兼备

一只扑棱蛾子

高防服务器

通过方法引用获取属性名的底层逻辑是什么?

江南一点雨

Java Lambda mybatis

流量见顶了以后,APP为何仍然要使用推送通知?

MobTech袤博科技

软件测试学习笔记丨自动化测试策略

测试人

软件测试 自动化测试 测试开发

内部人士揭秘:千万不要关闭手机一键登录验证

MobTech袤博科技

jar包冲突组建设计书

京东科技开发者

一文快速读懂消息推送的到达率、转化率和卸载率

MobTech袤博科技

海外云手机:跨境电商引流的利器

Ogcloud

云手机 海外云手机 云手机海外版 国外云手机 跨境云手机

K8s技术全景:架构、应用与优化

不在线第一只蜗牛

架构 Kubernetes 容器

QAnything-1.3.0,支持纯python笔记本运行,支持混合检索

有道技术团队

3分钟教你最大化利用APP消息推送(Push)在运营中的优势

MobTech袤博科技

开创加密资产新纪元:深度解析ERC-314协议

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

抖音、小红书都在用的秒验一键登录验证方式,到底好在哪?

MobTech袤博科技

20余年运维实践经验总结!一本书掌握数字化运维方法

嘉为蓝鲸

运维 数字化转型 运维管理 IT 运维

2024年本机一键验证登录最强指南已出,请查收!

MobTech袤博科技

阿里巴巴API接口助力,快速搜索“智能手表”新品,精准获取商品ID

技术冰糖葫芦

API Explorer api 货币化 API 文档

MobTech积极参与鸿蒙生态建设,HarmonyOS NEXT鸿蒙星河版产品即将发布

MobTech袤博科技

10分钟说清楚,秒验一键认证除了快,还有哪些优点?

MobTech袤博科技

小米一面:电商系统开发遇到了哪些问题?

王磊

Java 面试真题

10年大厂运营大咖告诉你,如何有效应对消息推送厂商配额

MobTech袤博科技

入门级实操教程!从概念到部署,全方位了解K8S Ingress!_文化 & 方法_Rancher_InfoQ精选文章