10 月 23 - 25 日,QCon 上海站即将召开,现在大会已开始正式报名,可以享受 8 折优惠 了解详情
写点什么

入门级实操教程!从概念到部署,全方位了解 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:073730

评论

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

KWDB 开源社区走进南开大学

KaiwuDB

KaiwuDB 校园 学校

HUAWEI Pura X瞩目首发,华为游戏中心携手伙伴重塑鸿蒙游戏体验

最新动态

原生APP开发的优势

北京木奇移动技术有限公司

APP开发 软件外包公司 APP开发公司

“团队敏捷教练进阶课程” 6月28-29日 · A-CSM认证周末班

ShineScrum

【HarmonyOS Next】鸿蒙中App、HAP、HAR、HSP概念详解

GeorgeGcs

鸿蒙 HarmonyOS NEXT HAP HSP HAR

【HarmonyOS】鸿蒙原生实现应用间跳转之Deep Linking

走向菜鸟的菜鸟

鸿蒙 HarmonyOS ArkTS HarmonyOS NEXT

BOE(京东方)携手京东发起百吋电视品牌联盟发布会 引领家庭视听正式迈入大屏时代

科技热闻

海信激光电视探索X1亮相AWE 2025 重塑家庭观影新标准

新消费日报

StarRocks 主键(Primary Key)深度解析

镜舟科技

数据仓库 数据分析 分析型数据库 物化视图 StarRocks 主键

原生APP开发的成本

北京木奇移动技术有限公司

APP开发 软件外包公司 APP外包公司

【HarmonyOS】鸿蒙原生实现应用间跳转之App Linking

走向菜鸟的菜鸟

鸿蒙 HarmonyOS ArkTS HarmonyOS NEXT 实践分享

【HarmonyOS】鸿蒙原生实现3DTouch快捷方式

走向菜鸟的菜鸟

鸿蒙 HarmonyOS ArkTS HarmonyOS NEXT 实践分享

计算机就业看过来,16家宝藏外企分享

王中阳Go

计算机 就业 外企

Second Me:在 AI 中保留自我的火种丨社区来稿

声网

【HarmonyOS】关于鸿蒙原生实现红包雨效果的方案设计

走向菜鸟的菜鸟

鸿蒙 HarmonyOS ArkTS HarmonyOS NEXT 实践分享

【HarmonyOS】关于鸿蒙原生使用原生相机实现扫一扫功能

走向菜鸟的菜鸟

鸿蒙 HarmonyOS ArkTS HarmonyOS NEXT 实践分享

2025企业财务数智化峰会·湖南站,在长沙成功举办!

用友智能财务

AI 财务 数智化 会计

英伟达黄仁勋GTC演讲,算力和数据等基础设施驱动AI蓬勃发展

PowerVerse

算力 AGI DePIN GTC2025

鸿蒙相机开发实战:从设备适配到性能调优 —— 我的 ArkTS 录像功能落地手记(API 15)

李游Leo

HarmonyOS

MHP和慕尼黑LMU发布《2025年工业4.0晴雨表》

财见

【HarmonyOS】鸿蒙原生分享之“碰一碰”分享(APP内实现)

走向菜鸟的菜鸟

鸿蒙 HarmonyOS ArkTS HarmonyOS NEXT 实践分享

【HarmonyOS】关于鸿蒙原生项目多环境的配置和管理

走向菜鸟的菜鸟

鸿蒙 HarmonyOS ArkTS HarmonyOS NEXT 实践分享

源于代码而不止于代码

FunTester

美通社母公司Cision联合PRWeek发布《2025企业传播报告》

财见

AI数字人的测试

北京木奇移动技术有限公司

AI智能体 软件外包公司 AI数字人

“全球金牌课程”5月17-18日·上海线下·CSM认证【提前报名特惠】CST导师亲授

ShineScrum

敏捷 CSM认证 CSM认证培训

APP的开发方式及特点

北京木奇移动技术有限公司

APP开发 软件外包公司 APP开发公司

SvelteKit 最新中文文档教程(7)—— 构建和部署

冴羽

vue.js 前端 React Svelte SvelteKit

Intel 18A双引擎:RibbonFET搭配PowerVia如何提升芯片性能

E科讯

【HarmonyOS Next】鸿蒙应用弹框和提示气泡详解(一)

GeorgeGcs

ios android 鸿蒙 HarmonyOS OpenHarmony

人效评估管理系统(源码+文档+讲解+演示)

深圳亥时科技

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