Kubernetes 上的入口资源与 NGINX 入口控制器
Ingress resource vs NGINX ingress controller on Kubernetes
我正在 AWS EKS 上设置 NGINX 入口控制器。
我浏览了 k8s Ingress 资源,这对理解我们使用例如文件 def 将 LB 端口映射到 k8s 服务端口非常有帮助。我安装了 nginx 控制器直到 pre-requisite step。然后教程指导我创建一个 ingress 资源。
但下面是告诉我应用 service 配置。我对这个提供者特定的步骤感到困惑。 kind, version, spec
定义(服务与入口)不同。
我在这里遗漏了什么?
NGINX 入口控制器是调整服务流量的实际过程。基本上就像传统虚拟机上的 nginx 或负载均衡器安装一样。
ingress 资源(种类:Ingress)更像是旧 VM 上的 nginx-config,您可以在其中定义主机映射、路径和代理。
这个概念一开始有点难以理解。 Nginx 入口控制器不过是 LoadBalancer
类型的服务。所做的是为您的服务提供面向 public 的端点。分配给此服务的 IP 地址可以将流量路由到多个服务。因此,您可以继续将您的服务定义为 ClusterIP
并通过 Nginx 入口控制器公开它们。
这里有一张图表可以更好地描述这个概念:
image source
关于这一点,如果您已经为您的服务获取了一个静态 IP,则需要将其分配给您的 Nginx ingress-controller。那么什么是入口? Ingress 基本上是您与 Nginx ingress-controller 通信的一种方式,可以将传入的流量定向到您的 LB public IP。所以现在很清楚,您有一个负载均衡器服务和多个入口资源。每个入口对应一个服务,该服务可以根据您定义服务的方式进行更改,但您明白了。
让我们进入一些 yaml 代码。如前所述,无论您拥有多少入口资源,您都需要入口控制器服务。因此,继续在您的 EKS 集群上应用 this code。
现在让我们看看如何通过 Nginx-ingress 将您的 pod 公开给全世界。假设您有一个 wordpress
部署。您可以为此应用程序定义一个简单的 ClusterIP
服务:
apiVersion: v1
kind: Service
metadata:
labels:
app: ${WORDPRESS_APP}
namespace: ${NAMESPACE}
name: ${WORDPRESS_APP}
spec:
type: ClusterIP
ports:
- port: 9000
targetPort: 9000
name: ${WORDPRESS_APP}
- port: 80
targetPort: 80
protocol: TCP
name: http
- port: 443
targetPort: 443
protocol: TCP
name: https
selector:
app: ${WORDPRESS_APP}
这会为您的 wordpress
应用程序创建一个服务,该服务无法在集群外部访问。现在您可以创建一个入口资源来公开此服务:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
namespace: ${NAMESPACE}
name: ${INGRESS_NAME}
annotations:
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
spec:
tls:
- hosts:
- ${URL}
secretName: ${TLS_SECRET}
rules:
- host: ${URL}
http:
paths:
- path: /
backend:
serviceName: ${WORDPRESS_APP}
servicePort: 80
现在如果你 运行 kubectl get svc
你可以看到以下内容:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wordpress ClusterIP 10.23.XXX.XX <none> 9000/TCP,80/TCP,443/TCP 1m
nginx-ingress-controller LoadBalancer 10.23.XXX.XX XX.XX.XXX.XXX 80:X/TCP,443:X/TCP 1m
现在您可以通过定义的 URL 访问您的 wordpress
服务,它映射到入口控制器 LB 服务的 public IP。
我正在 AWS EKS 上设置 NGINX 入口控制器。
我浏览了 k8s Ingress 资源,这对理解我们使用例如文件 def 将 LB 端口映射到 k8s 服务端口非常有帮助。我安装了 nginx 控制器直到 pre-requisite step。然后教程指导我创建一个 ingress 资源。
但下面是告诉我应用 service 配置。我对这个提供者特定的步骤感到困惑。 kind, version, spec
定义(服务与入口)不同。
我在这里遗漏了什么?
NGINX 入口控制器是调整服务流量的实际过程。基本上就像传统虚拟机上的 nginx 或负载均衡器安装一样。 ingress 资源(种类:Ingress)更像是旧 VM 上的 nginx-config,您可以在其中定义主机映射、路径和代理。
这个概念一开始有点难以理解。 Nginx 入口控制器不过是 LoadBalancer
类型的服务。所做的是为您的服务提供面向 public 的端点。分配给此服务的 IP 地址可以将流量路由到多个服务。因此,您可以继续将您的服务定义为 ClusterIP
并通过 Nginx 入口控制器公开它们。
这里有一张图表可以更好地描述这个概念:
关于这一点,如果您已经为您的服务获取了一个静态 IP,则需要将其分配给您的 Nginx ingress-controller。那么什么是入口? Ingress 基本上是您与 Nginx ingress-controller 通信的一种方式,可以将传入的流量定向到您的 LB public IP。所以现在很清楚,您有一个负载均衡器服务和多个入口资源。每个入口对应一个服务,该服务可以根据您定义服务的方式进行更改,但您明白了。
让我们进入一些 yaml 代码。如前所述,无论您拥有多少入口资源,您都需要入口控制器服务。因此,继续在您的 EKS 集群上应用 this code。
现在让我们看看如何通过 Nginx-ingress 将您的 pod 公开给全世界。假设您有一个 wordpress
部署。您可以为此应用程序定义一个简单的 ClusterIP
服务:
apiVersion: v1
kind: Service
metadata:
labels:
app: ${WORDPRESS_APP}
namespace: ${NAMESPACE}
name: ${WORDPRESS_APP}
spec:
type: ClusterIP
ports:
- port: 9000
targetPort: 9000
name: ${WORDPRESS_APP}
- port: 80
targetPort: 80
protocol: TCP
name: http
- port: 443
targetPort: 443
protocol: TCP
name: https
selector:
app: ${WORDPRESS_APP}
这会为您的 wordpress
应用程序创建一个服务,该服务无法在集群外部访问。现在您可以创建一个入口资源来公开此服务:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
namespace: ${NAMESPACE}
name: ${INGRESS_NAME}
annotations:
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
spec:
tls:
- hosts:
- ${URL}
secretName: ${TLS_SECRET}
rules:
- host: ${URL}
http:
paths:
- path: /
backend:
serviceName: ${WORDPRESS_APP}
servicePort: 80
现在如果你 运行 kubectl get svc
你可以看到以下内容:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wordpress ClusterIP 10.23.XXX.XX <none> 9000/TCP,80/TCP,443/TCP 1m
nginx-ingress-controller LoadBalancer 10.23.XXX.XX XX.XX.XXX.XXX 80:X/TCP,443:X/TCP 1m
现在您可以通过定义的 URL 访问您的 wordpress
服务,它映射到入口控制器 LB 服务的 public IP。