什么是 Ingress?
在 Kubernetes 中,Ingress 是一种 API 对象,它允许外部用户访问 Kubernetes 中的服务。它提供了一种在群集中集中处理入站网络流量的方法,而不是分散在群集中的每个服务或 Pod 上。
相对于 Service 和 Endpoint,Ingress 是逻辑实体,为每个域名或者共享的 IP 地址提供统一入口。通过 Ingress 控制器控制外部流量的访问,并将流量路由到各个服务中去。
在 Kubernetes 中使用 Ingress 可以使得服务和流量管理变得简单和方便。
什么时候需要使用 Ingress?
当我们需要将多个服务或者不同端口的服务使用统一的入口进行管理的时候,就可以使用 Ingress。
举个例子,假设我们有两个服务,分别提供以下服务:
- 提供 HTTP 的服务,暴露的端口是:8080。
- 提供 HTTPS的服务,暴露的端口是:8443。
现在我们需要在 K8S 中对外提供这两个服务,并且我们希望用户能够访问一个入口。
通过 Ingress 可以轻松实现上述需求。
Ingress 资源定义
Ingress 资源定义,可以理解为外部访问的路由定义。Ingress 的定义可以通过以下方式实现:
// javascriptcn.com 代码示例 apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/rewrite-target: "/" name: my-ingress namespace: my-namespace spec: rules: - host: www.example.com http: paths: - path: /service1 backend: serviceName: service1 servicePort: 8080 - path: /service2 backend: serviceName: service2 servicePort: 8443
安装 Ingress 控制器
在 K8S 中,Ingress 控制器是通过第三方插件进行安装和配置的。在本文中,我们以 nginx Ingress 为例,讲述 Ingress 的实践应用。
通过 Helm,可以轻松安装 nginx Ingress:
helm install ingress-nginx ingress-nginx/ingress-nginx
安装完成后,可以通过如下命令查看安装的状态:
helm list | grep ingress-nginx
Ingress 资源的负载均衡
通过 Ingress 资源的定义已经实现了外部流量的访问路由定义。但是对于流量的负载均衡,我们还需要对 Ingress 控制器进行配置。
可以通过 configMap 进行 Ingress 的负载均衡配置:
// javascriptcn.com 代码示例 apiVersion: v1 kind: ConfigMap metadata: name: nginx-configuration labels: app: ingress-nginx data: proxy-connect-timeout: "10" proxy-send-timeout: "120" proxy-read-timeout: "120" http2-max-field-size: "32768" http2-max-header-size: "4000" proxy-body-size: "4m"
以上配置实现了代理连接超时设置,以及 HTTP/2 的配置。
Ingress 资源的安全配置
对于 Ingress 资源的安全配置,我们可以通过 SSL/TLS 的设置实现。可以通过如下方式进行配置:
// javascriptcn.com 代码示例 apiVersion: v1 kind: Secret metadata: name: my-secret type: Opaque data: tls.crt: base64_encoded_certificate_data tls.key: base64_encoded_private_key_data --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: my-ingress annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" spec: tls: - hosts: - www.example.com secretName: my-secret rules: - host: www.example.com http: paths: - backend: serviceName: service1 servicePort: 8080 path: /service1 - backend: serviceName: service2 servicePort: 8443 path: /service2
如上配置中,通过 Secret 配置 SSL/TLS,然后通过 Ingress 资源中的 tls 部分设置使用 SSL/TLS 的域名列表。这样就可以保证数据传输的安全性。
总结
本文主要介绍了 Kubernetes 中的 Ingress 以及其应用实践。通过 Ingress 可以方便地实现流量的管理和控制,同时也能保证服务的安全性。本文的示例代码也可以方便的进行实践和测试。
在实践中,需要结合自身的具体业务场景进行配置和调整,从而达到最佳的使用效果。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653512877d4982a6ebb01f5d