Kubernetes Ingress用于添加规则,以将流量从外部路由到Kubernetes集群的服务中。在本文中你将了解ingress 的概念,以及用于路由外部流量到Kubernetes deployment的ingress controller。nginx
一般状况下,自定义Nginx或HAproxy Kubernetes部署将做为服务被暴露,它们用于将外部流量代理到内部集群的服务中。其中,路由规则将会bake到Pod中,并做为configmap添加。Kubernetes ingress的行为与此相似,只是路由规则将做为Kubernetes ingress对象维护。它具备动态路由规则配置的巨大优点,所以无需从新部署proxy pods。git
想要顺利开始使用Kubernetes Ingress,你须要了解如下两个关键概念:github
一、 Kubernetes Ingressapi
二、 Kubernetes Ingress Controller架构
让咱们来逐一了解。app
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对象,你须要了解的关键事项以下:google
你应该在你所部署服务的命名空间内建立ingress规则。若是在其余没有ingress对象的命名空间中,你将没法路由流量到其中的服务内。spa
一个ingress对象须要一个ingress controller来路由流量
外部流量将不会hit ingress API,而是hit ingress controller服务。
Ingress controller是一个典型的部署在集群中的代理服务,它只是暴露给服务的Kubernetes部署。如下是可用于Kubernetes的Ingress Controller:
Nginx Ingress Controller
Traefik
HAproxy
Contour
GKE Ingress Controller
目前,Nginx是大多数企业的选择。如下是Nginx Ingress Controller的工做原理:
在Nginx controller pod内部的nginx.conf文件是一个go 模板,它能够与Kubernetes Ingress API通讯并实时得到流量路由的最新值。
Nginx controller与Kubernetes ingress API 通讯以检查是否为流量路由建立了规则。
若是它发现了任何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:
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/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
下一步是建立一个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
为了让咱们的ingress的设置运转起来,咱们须要映射一个域名到负载均衡器IP。你能够用两种方式,完成此操做。
你能够将单个域做为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到负载均衡器,你就能够经过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应用程序而且添加一个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
如今让咱们使用一个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/