写点什么

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

评论

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

极限编程技术实践

Teobler

敏捷 敏捷开发 TDD 重构 极限编程

刷屏洗脑的“吗咿呀嘿”,到底是个啥?

架构精进之路

商业模式 28天写作 3月日更

山东青岛推进平安小区建设!源中瑞智慧社区平台解决方案

源中瑞-龙先生

解决方案 山东 源中瑞 青岛 智慧社区

android程序开发!2021Android精选面试实战总结整理,大厂直通车!

欢喜学安卓

android 程序员 面试 移动开发

海豚调度dolphinscheduler SQL脚本初始化流程

cloudcoder

海豚调度 调度引擎 分布式任务调度

树莓派上的家庭监控中心

冯骐

运维 树莓派 监控系统 Open-Falcon 物联网,

搭建一个 802.1x 的 web 测试服务

冯骐

网络 监控系统 Open-Falcon radius eduroam

工作两三年了,整不明白架构图都画啥?

小傅哥

Java 后端 小傅哥 架构设计 画架构图

QA视角看数据匿名化

BY林子

数据安全 测试右移 用户数据 数据脱敏

技术案例 | 云原生微服务落地难?百度自用CRM这样做

百度开发者中心

微服务 CRM #百度智能云#

国产芯片WiFi物联网智能插座—电耗采集功能设计

不脱发的程序猿

28天写作 国产芯片 电耗检测 电压电流 华大MCU

树莓派上的温湿度环境监控

冯骐

运维 树莓派 物联网 监控告警

看完你就明白什么是图神经网络

华为云开发者联盟

神经网络 深度学习 节点 图神经网络 图结构

程序员之禅(一)

每天读本书

读书笔记

LeetCode题解:123. 买卖股票的最佳时机 III,动态规划,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

Wiki.js 配置 LDAP 认证

东风微鸣

wiki

MySQL字段默认值设置详解

Simon

MySQL 数据库

Linux入门篇 —— Linux 磁盘管理之磁盘理论篇

若尘

Linux linux编程 磁盘

元宵节元宵钱,不买元宵买云资源! | 2核4G低至0.79元/天

京东科技开发者

云主机 云服务器 云存储 云硬盘

使用 pyVmomi 采集 vSphere 监控指标

冯骐

Python 运维 监控 Open-Falcon vpshere

EEPROM CAT24CXX实现分页读、写数据

不脱发的程序猿

28天写作 CAT24C08 EEPROM 嵌入式软件 单片机

【LeetCode】区域和检索 - 数组不可变Java题解

Albert

算法 LeetCode 28天写作

android布局优化!Android屏幕适配很难嘛?其实也就那么回事,内含福利

欢喜学安卓

android 程序员 面试 移动开发

程序员专属“灯谜”大挑战,答对六题算你赢!

京东科技开发者

编程语言 集群

构建一套适合微服务的高可用架构

环信

华为云举办AI经典论文复现活动,打造领先AI开发者学习社区

华为云开发者联盟

AI 华为云 modelarts 论文 AI Gallery

华为云原生数据仓库GaussDB(DWS)深度技术解读:融、快、大、稳、易

华为云开发者联盟

数据库 云原生 华为云 GaussDB 数仓

OS命令--shell中数组的操作

cloudcoder

数组 Shell 循环引用

Git学习游戏化,从Learn Git Branching 开始

程序老王

git 学习 学习方法 git 学习

GaussDB(DWS):非侵入式备份及其在NBU上的应用

华为云开发者联盟

架构 GaussDB 集群 备份 NBU

MongoDB 在评论中台的实践

vivo互联网技术

数据库 mongodb 分布式 集群

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