【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

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

评论

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

从React源码来学hooks是不是更香呢

goClient1992

React

干货好文 | 初探MySQL迁移到ClickHouse

沃趣科技

MySQL Clickhouse

转行大数据培训怎么样

小谷哥

嵌入式 Linux 入门(七、Linux 下的环境变量)

矜辰所致

Linux 环境变量 10月月更

【IT运维小知识】如何通俗理解节点、集群以及主从?

行云管家

高可用 高可用HA

户外LED电子显示屏市场会走向哪

Dylan

LED LED显示屏 户外LED显示屏

每日一题之请描述Vue组件渲染流程

bb_xiaxia1998

Vue

每日一题之Vue的异步更新实现原理是怎样的?

bb_xiaxia1998

Vue

Nginx浅析

Andy

前端培训适合零基础学习吗

小谷哥

等保备案和通信网络单元定级备案的五大区别讲解

行云管家

等保 等级保护 等保备案

顶级的计算机科学家是如何养成的?

博文视点Broadview

程序培训哪里比较好,应该怎么去选择

小谷哥

【web 开发基础】PHP 循环结构之 for 循环 -PHP 快速入门 (19)

迷彩

for循环 10月月更 web开发基础 PHP基础

前端开发培训学习那不难,怎么选择机构

小谷哥

负载均衡

Andy

新思科技推出适用于IntelliJ集成开发环境的Code Sight标准版解决方案

InfoQ_434670063458

软件开发 代码 新思科技

千锋1024程序员节锋企优联开启认证考试大咖直播,为学员开启认证学习秘籍

千锋IT教育

专项贴息贷款加速投放 锋云智慧助力教育信息化乘风而上

千锋IT教育

JVM 浅析(二)

Andy

「Go工具箱」go语言csrf库的使用方式和实现原理

Go学堂

golang 开源 程序员 CSRF 10月月更

react源码中的生命周期和事件系统

flyzz177

React

云原生安全系列 1:零信任安全和软件开发生命周期

HummerCloud

云原生 安全 云原生安全 安全软件开发生命周期 10月月更

【web 开发基础】PHP中的特殊流程控制(break) -PHP 快速入门 (20)

迷彩

break 10月月更 web开发基础 PHP基础

react源码中的协调与调度

flyzz177

React

MySQL高级:explain分析SQL,索引失效&常见优化场景

程序员小毕

Java MySQL 数据库 后端 索引

如何在填报场景中使用数据绑定获取数据源

葡萄城技术团队

2022年中国消费金融行业数字化技术创新分析

易观分析

消费金融

一面高频vue面试题

bb_xiaxia1998

Vue

微信小程序浅践

Andy

大数据培训学习应该储备什么知识

小谷哥

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