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/v1beta1
kind: Ingress
metadata:
name: test-ingress
namespace: dev
spec:
rules:
- host: test.apps.example.com
http:paths:- backend:serviceName: hello-serviceservicePort: 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 ingress controller: https://github.com/kubernetes/ingress-nginx
  • Nginx公司的Nginx ingress controller: https://github.com/nginxinc/kubernetes-ingress

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

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

官方repo:

https://github.com/kubernetes/ ... eploy

让我们使用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: Service
apiVersion: v1
metadata:
name: ingress-nginx
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
externalTrafficPolicy: Local
type: LoadBalancer
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
ports:
- name: httpport: 80targetPort: http
- name: httpsport: 443targetPort: 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/app1
http://www.example.com/app2
http://www.example.com/app1/api
http://www.example.com/app2/api

通配符DNS映射

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

例如:

*.apps.example.com

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

例如:

URL one

http://demo1.apps.example.com/api http://demo1.apps.example.com/api/v1 http://demo1.apps.example.com/api/v2

URL two

http://demo2.apps.example.com/api http://demo2.apps.example.com/api/v1 http://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/v1
kind: Deployment
metadata:
name: hello-app
namespace: dev
spec:
selector:
matchLabels:app: hello
replicas: 3
template:
metadata:labels:app: hello
spec:containers:- name: helloimage: "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: v1
kind: Service
metadata:
name: hello-service
namespace: dev
labels:
app: hello
spec:
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/v1beta1
kind: Ingress
metadata:
name: test-ingress
namespace: dev
spec:
rules:
- host: test.apps.example.info
http:paths:- backend:serviceName: hello-serviceservicePort: 80

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

kubectl describe ingress  -n dev

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

原文链接:

https://devopscube.com/kuberne ... rial/

https://devopscube.com/setup-i ... ller/

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

  1. TensorFlow Probability 概率编程入门级实操教程

    雷锋网 AI 科技评论按:TensorFlow Probability(TFP)是一个基于 TensorFlow 的 Python 库,能够更容易地结合概率模型和深度学习.数据科学家.统计学以及机器学 ...

  2. nginx 集群部署_入门级实操教程!从概念到部署,全方位了解K8S Ingress!

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

  3. 实操教程|PyTorch AutoGrad C++层实现

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨xxy-zhihu@知乎 来源丨https://zhuanla ...

  4. [转载]你们要的GIF动图制作全攻略!看完就会做!(实操教程)

    非常实用呀 原文地址:你们要的GIF动图制作全攻略!看完就会做!(实操教程)作者:木木老贼 来源:文案匠(ID:sun-work) 作者:一木(授权转载,如需转载请联系文案匠) 文章配图的GIF动图怎 ...

  5. 通过大白菜u盘启动工具备份/还原/重装/激活系统/修复引导 实操教程(上)

    通过大白菜u盘启动工具备份/还原/重装/激活系统/修复引导 实操教程(上) 前言 进入大白菜u盘的pe系统 用GHOST进行系统盘备份/还原 在D盘上安装新系统(以win10-2004为例) 镜像下载 ...

  6. 寻找亚马逊测评师邮箱_美国及欧盟亚马逊产品外观专利查询步骤实操教程(已验证)...

    亚马逊产品外观专利防不胜防:美国及欧盟外观专利查询步骤实操教程(已验证) 欧洲 https://www.tmdn.org/tmdsview-web/dsview-logo-white.15c95da2 ...

  7. 实操教程|火遍全网的剪纸风格究竟是怎么做出来的?

    原文来自公众号:希音的设计笔记 > 添加微信:xiyin0820 获取高质量样机 | C4D教程 | OC渲染教程 | Sketch教程 Adobe2021 | Adobe2020 | LED字 ...

  8. mysql教程乛it教程网_MySQL数据库实操教程(35)——完结篇

    版权声明 专栏概况 从2019年7月21日至今,约莫一个月的时间终于写完了MySQL教程,我已将其集结在专栏<MySQL数据库实操教程>,概述如下: 共计35篇文章 每篇文章均附源码和运行 ...

  9. MySQL数据库实操教程(35)——完结篇

    版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 专栏概况 从2019年7月21日至今,约莫一个月的时间终于写完了MySQL教程,我已将其集结在 ...

最新文章

  1. shell 语法简介(转载)
  2. 97.16% 的加班率,给你 3 倍工资:你愿意去大厂吗?
  3. Xcode5下使用纯代码构建简单的HelloWorld程序
  4. 两个排序数组的中位数(4.Median of Two Sorted Arrays)
  5. LeetCode 98验证二叉搜素树(中序遍历)99恢复二叉搜索树
  6. elasticsearch 集群no known master node
  7. (大纲)三小时学会openCV
  8. 【LVS】简介与说明
  9. Android通话录音
  10. python 绘图英文字体_Matplotlib 中英文及公式字体设置
  11. 使用C#创建快捷方式
  12. 植物大战僵尸简单外挂原理及实现
  13. 再见,2018俄罗斯世界杯!
  14. Deepin 深度技术 Windows XP SP2 珍藏版
  15. java代码实现的帧动画
  16. python获取数据库返回字符串出现/uxxxxxx解决方案
  17. JAVA之简陋打地鼠(监听事件的练习)
  18. zabbix客户端日志报错no active checks on server [192.168.3.108:10051]: host [192.168.3.108] not found
  19. 此服务器不支持该安装程序,macOS 提示“不能安装该软件,因为当前无法从软件更新服务器获得” 解决方法...
  20. 《当程序员的那些狗日日子》(四十三)绝缘空间

热门文章

  1. 蓝桥杯 ADV-144 算法提高 01背包
  2. Leecode 268. 丢失的数字——Leecode每日一题系列
  3. 【三次优化】剑指 Offer 35. 复杂链表的复制
  4. 【解析】案例4-1.7 文件传输 (25 分)
  5. 【测试点分析】1072 开学寄语 (20分)_42行代码AC
  6. 32行代码AC——L1-027 出租 (20分)(~解题报告~)
  7. 7-2 数组循环左移(20分)(顺序表实现)
  8. 理解OSI七层模型(了解OSI七层模型,数据如何传输,封装,解封装)
  9. 华为交换机S5700开启telnet
  10. 初识BGP外部网关协议(二)