当前位置: 首页 > 图灵资讯 > 技术篇> 入门级实操教程!从概念到部署,全方位了解K8S Ingress

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

来源:图灵教育
时间:2023-07-05 17:38:28

Kubernetes Ingress用于从外部路由到Kubernetes集群的服务中添加规则。在本文中,您将了解ingress 从外部流量到Kuberneteses的概念 deploymentingress controller。

入门级实操教程!从概念到部署,全方位了解K8S Ingress_DNS

通常,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对象,您需要知道的关键事项如下:

  1. 您应该在您部署的服务命名空间中创建ingress规则。如果您在没有ingress对象的其他命名空间中,您将无法将流量路由到服务中。
  2. ingress对象需要ingress controller路由流量
  3. 外部流量不会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的工作原理:

  1. Nginx controller nginxxnginx在pod内部.conf文件是gonf文件 可与Kubernetess一起使用模板 Ingress API通信并实时获得流量路由的最新值。
  2. Nginx controllerKubernetes ingress API 通信是为了检查流量路由是否创建了规则。
  3. 如果发现任何ingress规则,它将应用于nginx Controller配置,即在pod中使用go模板nginx.conf文件。

如果您使用exec连接到pod并检查/etc/nginx/nginx.在conf文件中,可以看到ingress对象中指定的所有规则,这些规则应用于conf文件。

下面的架构图将在Kubernetes集群上解释ingress设置。

入门级实操教程!从概念到部署,全方位了解K8S Ingress_Nginx_02

接下来,让我们详细看看如何使用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域(用你的域名代替它),你应该能够访问我们部署的应用程序。