快手、孩子王、华为等专家分享大模型在电商运营、母婴消费、翻译等行业场景的实际应用 了解详情
写点什么

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

评论

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

Flink中CoProcessFunction6-7

小知识点

scala 大数据 flink

为什么迫切需要一套直接可落地的中台开发框架

高鹏

中台 业务中台 DDD 中台架构 业务架构

【高并发】学好并发编程,关键是要理解这三个核心问题

冰河

并发编程 同步 分工 互斥 签约计划第二季

开始真正的学习吧 -- 2020-10-20

BlueVitamin

做好提醒巧防范 守好钱包防诈骗——南京移动防通讯信息诈骗志愿者服务进社区

亚马逊向世界各地逾1000家慈善组织捐赠数百万件物资

爱极客侠

用Python加载数据的5种不同方式

计算机与AI

Python 数据处理

必须收藏:20个开发技巧教你开发高性能计算代码

华为云开发者联盟

性能 并发

被延伸的“五感”:OPPO联合丹拿发起TWS耳机音质革命

脑极体

LeetCode题解:98. 验证二叉搜索树,使用栈中序遍历,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

「2020年字节秋招超万人」那么程序员跳槽时,如何选择公司

Java架构师迁哥

程序员

播客有没有未来?

善宝橘

播客

MapReduce简介及过程详解

犟马骝

hadoop mapreduce

阿里P8架构师“墙裂”推荐:Java程序员必读的架构进阶热门书籍,值得学习!

Java架构之路

Java 程序员 架构 编程语言 推荐书籍

晦涩难懂的CAP,是否完全正确?

架构师修行之路

1分钟带你入门React Context

Leo

大前端 React useContext Context

Storage API简介和存储限制与逐出策略

程序那些事

大前端 浏览器 web tech web storage storage api

vivo 基于原生 RabbitMQ 的高可用架构实践

vivo互联网技术

高可用 RabbitMQ 中间件

从资金荒、恒大事件看区块链技术在供应链金融上的应用价值

CECBC

区块链 供应链物流

(转)程序员的写作课

Leo

学习 大前端 技术博客

架构师训练营第五周作业

邓昀垚

极客大学架构师训练营

央视多方视频连线演播厅系统

dwqcmo

音视频 集成架构 解决方案 智能硬件

深入剖析 | 字节码增强

九叔(高翔龙)

JVM 字节码插桩 bytecode JVM虚拟机原理 字节码增强

架构师训练营第 1 期第 5 周作业

业哥

十九、深入Python匿名函数

刘润森

Python

发挥区块链技术优势 确保食品安全

CECBC

区块链技术 信任机制

一个优秀的程序员,不仅要会编写程序,更要会编写高质量的程序

Java架构之路

Java 程序员 架构 性能优化 编程语言

简约而不简单的分布式通信基石

架构师修行之路

TCP 分布式 微服务 udp

法定数字货币对银行存在潜在冲击,可能是第六版的人民币

CECBC

数字货币 金融

技术实践丨手把手教你使用MQTT方式对接华为IoT平台 华为云开发者社区

华为云开发者联盟

技术 物联网 mqtt

甲方日常 34

句子

工作 随笔杂谈 日常

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