Kubernetes Ingress用于从外部路由到Kubernetes集群的服务中添加规则。在本文中,您将了解ingress 从外部流量到Kuberneteses的概念 deploymentingress controller。
通常,Nginx或HAproxy是自定义的 Kubernetes部署将作为服务被曝光,用于将外部流量代理到内部集群服务。其中,路由规则将bake添加到Pod中,并添加到configmap中。Kubernetes ingress的行为与此类似,但路由规则将被用作Kubernetess 维护ingress对象。它具有动态路由规则配置的巨大优势,因此无需重新部署proxy pods。
Kubernetes 入门浅分析Ingress要想顺利开始使用Kuberneteses Ingress,您需要了解以下两个关键概念:
1、 Kubernetes Ingress
2、 Kubernetes Ingress Controller
让我们逐一了解。
Kubernetes Ingress
Kubernetes Ingress是本地的Kubernetes资源,您可以设置从外部路由流到集群内部的服务端点的规则。它需要一个Ingress 由ingress对象指定的Controller来路规则。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的所有调用都应该是hello-service服务,位于dev命名空间。
关于Ingress对象,您需要知道的关键事项如下:
- 您应该在您部署的服务命名空间中创建ingress规则。如果您在没有ingress对象的其他命名空间中,您将无法将流量路由到服务中。
- ingress对象需要ingress controller路由流量
- 外部流量不会hitt 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的工作原理:
- Nginx controller nginxxnginx在pod内部.conf文件是gonf文件 可与Kubernetess一起使用模板 Ingress API通信并实时获得流量路由的最新值。
- Nginx controllerKubernetes ingress API 通信是为了检查流量路由是否创建了规则。
- 如果发现任何ingress规则,它将应用于nginx Controller配置,即在pod中使用go模板nginx.conf文件。
如果您使用exec连接到pod并检查/etc/nginx/nginx.在conf文件中,可以看到ingress对象中指定的所有规则,这些规则应用于conf文件。
下面的架构图将在Kubernetes集群上解释ingress设置。
接下来,让我们详细看看如何使用Nginx。 Ingress 在Kubernetes中,Controler设置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
请注意:本教程已在谷歌中使用 Cloud 我试过GKE集群。理论上,它可以用于所有的云环境。如果您真的遇到任何错误,您可能需要在设置中进行一些调整。
设置Nginx Ingress Controller有两个nginx ingress controller:
- Kubernetes社区Nginx ingress controllerhttps://github.com/kubernetes/ingress-nginx
- Nginx公司Nginx ingress controllerhttps://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
为Ingress controller设置 LoadBalancer 服务下一步是创建一个LoadBalancer类型的服务,以暴露集群外的nginx。 controller部署。
Step1:在当地创建项目目录,然后切换到目录。
mkdir ingress-deployment && cd ingress-deployment
Step2:创建一个名为nginx的创建-ingress.yaml文件
vi nginx-ingress.yaml
Step3:将以下内容复制到文件中
请注意:label下的anotationnnginx 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,使用此功能,您只能为ingresss 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创建deploymenttl
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
创建Kubernetestes Ingress对象现在让我们用DNS创建Ingress对象来访问我们的hello app。Ingress对象可以设置路由规则。
Ingress controller pod连接到Ingresss API检查规则,并相应更新其nginx.conf。
Step1:创建一个名为ingress的项目.yaml文件
Step2:将以下内容复制到文件中并保存
用你的域名代替testt.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域(用你的域名代替它),你应该能够访问我们部署的应用程序。