Kubernetes 是一个用于容器编排的开源平台,它可以帮助我们管理和部署容器化应用程序。在 Kubernetes 中,Service 和 Ingress 是两个非常重要的概念,它们可以帮助我们实现容器之间的通信和负载均衡。
Service
Service 是 Kubernetes 中的一种抽象,它定义了一组逻辑上相同的 Pod,它们提供相同的服务。Service 可以帮助我们实现容器之间的通信,而不必关心它们的 IP 地址和端口号。Service 可以通过 ClusterIP、NodePort 和 LoadBalancer 三种方式来暴露应用程序。
ClusterIP
ClusterIP 是 Service 的默认方式,它会为 Service 分配一个 ClusterIP 地址,这个地址只能在 Kubernetes 集群内部使用。当我们在 Kubernetes 集群内部访问 Service 时,就可以使用这个 ClusterIP 地址来访问。例如:
// javascriptcn.com 代码示例 apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app ports: - name: http port: 80 targetPort: 8080 type: ClusterIP
这个 Service 会为标签为 app=my-app
的 Pod 分配一个 ClusterIP 地址,并将它们暴露在 80 端口上。当我们在 Kubernetes 集群内部访问这个 Service 时,可以使用 http://my-service:80
来访问。
NodePort
NodePort 可以将 Service 暴露在 Kubernetes 集群节点的某个端口上,这个端口可以从集群外部访问。例如:
// javascriptcn.com 代码示例 apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app ports: - name: http port: 80 targetPort: 8080 type: NodePort
这个 Service 会为标签为 app=my-app
的 Pod 分配一个 ClusterIP 地址,并将它们暴露在 80 端口上。此外,它还会为这个 Service 分配一个 NodePort 端口,我们可以使用这个端口来从集群外部访问这个 Service。例如,如果我们的集群节点的 IP 地址为 192.168.0.100
,那么可以使用 http://192.168.0.100:NodePort
来访问。
LoadBalancer
LoadBalancer 可以将 Service 暴露在外部负载均衡器上,以便外部客户端可以访问它。例如:
// javascriptcn.com 代码示例 apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app ports: - name: http port: 80 targetPort: 8080 type: LoadBalancer
这个 Service 会为标签为 app=my-app
的 Pod 分配一个 ClusterIP 地址,并将它们暴露在 80 端口上。此外,它还会在外部负载均衡器上创建一个负载均衡器,我们可以使用这个负载均衡器来从外部访问这个 Service。
Ingress
Ingress 是 Kubernetes 中的一种资源对象,它可以帮助我们实现 HTTP 和 HTTPS 流量的路由和负载均衡。Ingress 需要配合 Ingress Controller 来使用,Ingress Controller 会根据 Ingress 规则来配置负载均衡器,将流量路由到不同的 Service 上。
使用 Ingress
要使用 Ingress,需要先安装 Ingress Controller。Kubernetes 社区提供了多种 Ingress Controller 的实现,例如 Nginx Ingress Controller、Traefik Ingress Controller、HAProxy Ingress Controller 等等。这里以 Nginx Ingress Controller 为例,介绍如何使用 Ingress。
首先,我们需要安装 Nginx Ingress Controller:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/cloud/deploy.yaml
然后,我们需要创建一个 Ingress 资源对象,来定义流量的路由规则:
// javascriptcn.com 代码示例 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: rules: - host: my-domain.com http: paths: - path: /app1 pathType: Prefix backend: service: name: app1-service port: name: http - path: /app2 pathType: Prefix backend: service: name: app2-service port: name: http
这个 Ingress 会将 my-domain.com/app1
的流量路由到 app1-service
Service 上,将 my-domain.com/app2
的流量路由到 app2-service
Service 上。
Ingress 的路由规则
Ingress 的路由规则非常灵活,可以根据不同的 URL 路径、主机名、协议等来进行路由。下面是一些常见的路由规则:
host
:指定要路由的主机名。path
:指定要路由的 URL 路径。pathType
:指定 URL 路径的类型,可以是Prefix
、Exact
或ImplementationSpecific
。backend
:指定要路由的 Service。
例如,下面的路由规则将 my-domain.com/app1
的流量路由到 app1-service
Service 上,将 my-domain.com/app2
的流量路由到 app2-service
Service 上:
// javascriptcn.com 代码示例 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: rules: - host: my-domain.com http: paths: - path: /app1 pathType: Prefix backend: service: name: app1-service port: name: http - path: /app2 pathType: Prefix backend: service: name: app2-service port: name: http
Ingress 的 TLS 支持
Ingress 还支持 HTTPS 流量的路由和负载均衡。要启用 HTTPS 支持,需要先创建一个 Secret 对象,用于存储 SSL 证书和私钥:
kubectl create secret tls my-tls-secret --key tls.key --cert tls.crt
然后,在 Ingress 中指定 TLS 配置:
// javascriptcn.com 代码示例 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: rules: - host: my-domain.com http: paths: - path: /app1 pathType: Prefix backend: service: name: app1-service port: name: http - path: /app2 pathType: Prefix backend: service: name: app2-service port: name: http tls: - hosts: - my-domain.com secretName: my-tls-secret
这个 Ingress 会将 my-domain.com/app1
的 HTTP 流量路由到 app1-service
Service 上,将 my-domain.com/app2
的 HTTP 流量路由到 app2-service
Service 上,将 my-domain.com
的 HTTPS 流量路由到 my-tls-secret
Secret 中存储的 SSL 证书和私钥上。
总结
Service 和 Ingress 是 Kubernetes 中非常重要的概念,它们可以帮助我们实现容器之间的通信和负载均衡。Service 可以通过 ClusterIP、NodePort 和 LoadBalancer 三种方式来暴露应用程序,而 Ingress 可以帮助我们实现 HTTP 和 HTTPS 流量的路由和负载均衡。在实际使用中,需要根据实际情况选择不同的方式来暴露应用程序和路由流量。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/656d3eefd2f5e1655d58d28f