Kubernetes (K8s) 提供了多种方式来向外部提供服务。以下是其中一些常用的方式:

  1. Service类型:

    • ClusterIP(集群内部服务): 默认的 Service 类型,Service 将分配一个 ClusterIP(仅在集群内可访问的虚拟 IP 地址),在集群内提供服务发现和负载均衡。
    • NodePort(主机端口映射): Service 将在每个节点上的相同端口(NodePort)上公开服务。通过 <NodeIP>:<NodePort> 可以从集群外访问服务。
    • LoadBalancer(云厂商负载均衡器): 在云环境中,Service 可以通过云提供商的负载均衡器公开。这将导致在云提供商上创建一个外部负载均衡器,并为该负载均衡器配置一个唯一的 IP 地址。

    示例:

    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: MyApp
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
      type: NodePort
    
  2. Ingress: Ingress 是一种 API 对象,定义了如何将外部流量引导到集群中的 Service。Ingress 可以通过不同的规则和路径将请求路由到不同的 Service。通常需要一个 Ingress Controller 来处理 Ingress 规则。

    示例:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-ingress
    spec:
      rules:
      - host: mydomain.com
        http:
          paths:
          - path: /app
            pathType: Prefix
            backend:
              service:
                name: my-service
                port:
                  number: 80
    
  3. ExternalIP: Service 可以通过 externalIPs 字段指定外部 IP 地址,该地址将映射到 Service 的 ClusterIP。这种方式仅适用于某些特殊场景,因为它涉及到手动配置和管理外部 IP。

    示例:

    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: MyApp
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
      externalIPs:
        - 203.0.113.1
    
  4. ExternalName: Service 类型 ExternalName 允许将服务映射到集群外的某个外部 DNS 名称。它不提供负载均衡和服务发现,而是充当 DNS 别名。

    示例:

    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      type: ExternalName
      externalName: external-service.example.com
    

选择使用哪种方式取决于需求和环境,通常使用 NodePortLoadBalancer 在集群外公开服务,而使用 Ingress 来实现高级的路由和负载均衡。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐