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-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: 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: 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/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: 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: 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-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/

入门级实操教程!从概念到部署,全方位了解K8S Ingress!的更多相关文章

  1. 实操教程丨如何在K8S集群中部署Traefik Ingress Controller

    注:本文使用的Traefik为1.x的版本 在生产环境中,我们常常需要控制来自互联网的外部进入集群中,而这恰巧是Ingress的职责. Ingress的主要目的是将HTTP和HTTPS从集群外部暴露给 ...

  2. 实操教程丨使用Pod安全策略强化K8S安全

    本文来自Rancher Labs 什么是Pod安全策略? Kubernetes Pod安全策略(PSP)是Kubernetes安全版块中极为重要的组件.Pod安全策略是集群级别的资源,用于控制Pod安 ...

  3. 超详细实操教程!在现有K8S集群上安装JenkinsX,极速提升CI/CD体验!

    在2018年年初,Jenkins X首次发布,它由Apache Groovy语言的创建者Jame Strachan创建.Jenkins X 是一个高度集成化的 CI/CD 平台,基于 Jenkins ...

  4. 手把手实操教程!使用k3s运行轻量级VM

    前 言 k3s作为轻量级的Kubernetes发行版,运行容器是基本功能.VM的管理原本是IaaS平台的基本能力,随着Kubernetes的不断发展,VM也可以纳入其管理体系.结合Container和 ...

  5. 织梦默认编辑器换成kindEditor实操教程

    织梦默认编辑是CKeditor,要想换成kindEditor编辑器,按如下步骤操作. 先看效果图: 首先下载打包好的 kindEditor_for_dedeCMS.ZIP,下载地址:https://d ...

  6. 虚拟机安装Ubuntu 16.04系统实操教程 详尽步骤 vmware ESXi亲测通过

    1 Ubuntu 16.04系统安装要求 Ubuntu 16.04 LTS下载最新版本的Ubuntu,适用于台式机和笔记本电脑. LTS代表长期支持,这意味着有五年免费安全和维护更新的保证. Ubun ...

  7. Iptables 实操

    目录 Iptables之实操 简介 名称概念: 四表中常用的表 Nat表 Filter表 iptables表和链的工作流程图 iptables过滤图 Iptables安装 Iptables 命令说明 ...

  8. Istio的流量管理(实操一)(istio 系列三)

    Istio的流量管理(实操一)(istio 系列三) 使用官方的Bookinfo应用进行测试.涵盖官方文档Traffic Management章节中的请求路由,故障注入,流量迁移,TCP流量迁移,请求 ...

  9. Istio的流量管理(实操三)

    Istio的流量管理(实操三) 涵盖官方文档Traffic Management章节中的egress部分.其中有一小部分问题(已在下文标注)待官方解决. 目录 Istio的流量管理(实操三) 访问外部 ...

随机推荐

  1. 小白学 Python(22):time 和 calendar 模块简单使用

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  2. Apache Jmeter进行服务器压力测试

    1.前言 最近项目遇到一个问题:其他公司对接我们系统,请求量太大的时候,返回单给对方就是丢失格式,大概十几万中总有那么十几单会出现格式错误! 所以我们老大就叫我用apache jmeter来进行并发测 ...

  3. 美团店铺数据抓取 token解析与生成

    美团.点评网的token都是用一套加密算法,实际上就是个gzip压缩算法.加密了2次,第一次是加密了个sign值,然后把sign值带进去参数中进行第二次加密,最后得出token 分析请求 打开上海美食 ...

  4. Win7无法远程桌面

    Win7在设置里开启允许其他计算机远程连接,但局域网计算机还是连不上: 然后点击上面的为远程桌面启用windows防火墙例外,发现远程桌面是允许的: 实际上这个不是,问题的真正原因在于用于远程的338 ...

  5. SpringBoot 源码解析 (三)----- Spring Boot 精髓:启动时初始化数据

    在我们用 springboot 搭建项目的时候,有时候会碰到在项目启动时初始化一些操作的需求 ,针对这种需求 spring boot为我们提供了以下几种方案供我们选择: ApplicationRunn ...

  6. 看源码学编程系列之kafka(一)

    kafka 由于它自身的高性能发送与消费能力,而受到广大企业的喜欢,所以我们就先看看kafka 一些源码实现如下: public void run() { int messageNo = 1; whi ...

  7. Linux进程管理(ps、pstree、top、pidof、kill、nice、free)

    进程号(Process ID,PID) 1.ps命令(process status) 无选项时只显示从当前终端当前用户的进程 ps aux 是用BSD的格式来显示 java这个进程显示的项目有:USE ...

  8. Centos上通过shell脚本备份数据库

    #!/bin/bash ds=`` list=`date +%Y`/`date +%m` dname="callme" eval "mkdir -p $list" ...

  9. 使用Charles设置https代理到http以及证书安装(服务端篇)

    1.下载ssl证书到[登录],并且设置证书[始终信任] 2.SSL Proxying设置,Location为*,可以抓全部接口的https请求 参考:https://www.jianshu.com/p ...

  10. HashSet源码学习,基于HashMap实现

    HashSet源码学习 一).Set集合的主要使用类 1). HashSet 基于对HashMap的封装 2). LinkedHashSet 基于对LinkedHashSet的封装 3). TreeS ...