在 Kubernetes 中,使用 Ingress 可以方便地将服务暴露给外部网络,而不需要暴露每个服务的 IP 地址和端口。本文将详细介绍 Kubernetes 中使用 Ingress 进行服务暴露的方法,并提供示例代码。
什么是 Ingress?
Ingress 是 Kubernetes 中的一种资源对象,它允许将多个服务暴露给外部网络,同时提供负载均衡和 HTTPS 支持等功能。Ingress 可以通过定义规则来将请求路由到不同的服务,还可以通过配置 TLS 证书来提供 HTTPS 支持。
如何使用 Ingress?
使用 Ingress 需要满足以下条件:
- Kubernetes 集群中已经安装了 Ingress Controller。
- Ingress Controller 已经正确配置并运行。
安装 Ingress Controller
Kubernetes 并没有提供默认的 Ingress Controller,因此需要选择安装一个 Ingress Controller。常见的 Ingress Controller 有 Nginx、Traefik、HAProxy 等。本文以 Nginx Ingress Controller 为例进行介绍。
安装 Nginx Ingress Controller
在 Kubernetes 集群中安装 Nginx Ingress Controller 可以使用 Helm 工具。首先需要添加 Nginx Ingress Controller 的 Helm 仓库:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
接下来可以使用 Helm 安装 Nginx Ingress Controller:
helm install nginx-ingress ingress-nginx/ingress-nginx
安装完成后,可以使用以下命令查看 Ingress Controller 是否正常运行:
kubectl get pods -n ingress-nginx
如果输出类似以下内容,则表示 Ingress Controller 正常运行:
NAME READY STATUS RESTARTS AGE nginx-ingress-controller-5c5b4f4b4f-z6nsz 1/1 Running 0 2m
配置 Ingress
在安装完成 Ingress Controller 后,就可以开始配置 Ingress 了。
创建 Ingress 资源
首先需要创建一个 Ingress 资源对象,例如下面的示例:
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: my-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: example.com http: paths: - path: /service1 backend: serviceName: service1 servicePort: 80 - path: /service2 backend: serviceName: service2 servicePort: 80
该示例定义了一个名为 my-ingress
的 Ingress 资源,将请求路由到两个服务。其中,nginx.ingress.kubernetes.io/rewrite-target: /
注解可以将请求路径重写为 /
,以便服务可以正确处理请求。
配置服务
需要将服务暴露给 Ingress,可以使用以下示例配置文件:
apiVersion: v1 kind: Service metadata: name: service1 spec: selector: app: service1 ports: - name: http port: 80 targetPort: 80 --- apiVersion: v1 kind: Service metadata: name: service2 spec: selector: app: service2 ports: - name: http port: 80 targetPort: 80
该示例定义了两个名为 service1
和 service2
的服务,它们将在 Ingress 中被暴露。
部署应用程序
创建完 Ingress 和服务后,需要部署应用程序。可以使用以下示例部署文件:
apiVersion: apps/v1 kind: Deployment metadata: name: service1 spec: replicas: 1 selector: matchLabels: app: service1 template: metadata: labels: app: service1 spec: containers: - name: service1 image: nginx:latest ports: - containerPort: 80 --- apiVersion: apps/v1 kind: Deployment metadata: name: service2 spec: replicas: 1 selector: matchLabels: app: service2 template: metadata: labels: app: service2 spec: containers: - name: service2 image: nginx:latest ports: - containerPort: 80
该示例定义了两个名为 service1
和 service2
的应用程序,它们将被部署到 Kubernetes 集群中。
验证 Ingress
部署完成后,可以使用以下命令查看 Ingress 是否正常运行:
kubectl get ingress
如果输出类似以下内容,则表示 Ingress 正常运行:
NAME CLASS HOSTS ADDRESS PORTS AGE my-ingress <none> example.com 192.168.1.100 80 2m
可以使用浏览器访问 http://example.com/service1
和 http://example.com/service2
,验证服务是否正常运行。
总结
本文介绍了 Kubernetes 中使用 Ingress 进行服务暴露的方法,并提供了示例代码。使用 Ingress 可以方便地将多个服务暴露给外部网络,同时提供负载均衡和 HTTPS 支持等功能。在实际使用中,需要根据具体情况进行配置和调整。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65897a8eeb4cecbf2decdd16