如何使用不同类型公开 Kubernetes 服务

KubernetesKubernetesBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本教程全面概述了 Kubernetes 服务,这是一种强大的抽象概念,可实现运行在 Kubernetes 集群上的应用程序不同组件之间的通信。你将了解可用的各种服务类型、如何公开这些服务,并探索 Kubernetes 服务管理的常见用例和最佳实践。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/ConfigurationandVersioningGroup(["Configuration and Versioning"]) kubernetes/BasicCommandsGroup -.-> kubernetes/expose("Expose") kubernetes/BasicCommandsGroup -.-> kubernetes/run("Run") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/config("Config") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/version("Version") subgraph Lab Skills kubernetes/expose -.-> lab-414652{{"如何使用不同类型公开 Kubernetes 服务"}} kubernetes/run -.-> lab-414652{{"如何使用不同类型公开 Kubernetes 服务"}} kubernetes/describe -.-> lab-414652{{"如何使用不同类型公开 Kubernetes 服务"}} kubernetes/config -.-> lab-414652{{"如何使用不同类型公开 Kubernetes 服务"}} kubernetes/version -.-> lab-414652{{"如何使用不同类型公开 Kubernetes 服务"}} end

Kubernetes 服务基础

Kubernetes 提供了一种名为服务(Services)的强大抽象,它能够在运行于 Kubernetes 集群上的应用程序的不同组件之间实现通信。服务充当一组 Pod 的抽象层,提供稳定的网络端点和负载均衡功能。

Kubernetes 服务类型

Kubernetes 支持不同类型的服务,以满足各种网络需求:

  1. ClusterIP:这是默认的服务类型,它在集群内部 IP 地址上公开服务。这种类型的服务只能从集群内部访问。
apiVersion: v1
kind: Service
metadata:
  name: my-clusterip-service
spec:
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080
  1. NodePort:这种服务类型在每个节点的 IP 地址上的静态端口公开服务。这使得可以使用 <节点IP>:<节点端口> 从集群外部访问该服务。
apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080
  1. LoadBalancer:这种服务类型为服务配置一个负载均衡器,通常在云环境中,并分配一个可从集群外部访问的稳定 IP 地址。
apiVersion: v1
kind: Service
metadata:
  name: my-loadbalancer-service
spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080
  1. ExternalName:这种服务类型将服务映射到一个 DNS 名称,使你能够无缝地将外部服务集成到你的 Kubernetes 应用程序中。
apiVersion: v1
kind: Service
metadata:
  name: my-externalname-service
spec:
  type: ExternalName
  externalName: example.com

这些服务类型提供了不同级别的可访问性和集成性,使你能够根据应用程序的需求选择最合适的选项。

公开 Kubernetes 服务

将 Kubernetes 服务公开到外部世界是使你的应用程序可访问的关键方面。Kubernetes 提供了几种公开服务的方法,每种方法都有其自身的优点和用例。

NodePort 服务

NodePort 服务类型在每个节点的 IP 地址上的静态端口公开服务。这使你能够使用 <节点IP>:<节点端口> 从集群外部访问该服务。这是公开服务的一种简单而有效的方法,但在可扩展性和负载均衡方面存在局限性。

apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080

负载均衡器服务

LoadBalancer 服务类型为服务配置一个负载均衡器,通常在云环境中,并分配一个可从集群外部访问的稳定 IP 地址。这是一个更具可扩展性和健壮性的解决方案,但根据云提供商的不同,可能会产生额外的成本和配置复杂性。

apiVersion: v1
kind: Service
metadata:
  name: my-loadbalancer-service
spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080

入口

入口(Ingress)是一种 Kubernetes 资源,提供高级路由和负载均衡功能。入口允许你在单个 IP 地址下公开多个服务,并使用规则将流量路由到相应的服务。对于复杂的网络需求,入口是一个强大的解决方案,但它需要额外的设置和配置。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - http:
      paths:
      - path: /app1
        pathType: Prefix
        backend:
          service:
            name: app1-service
            port:
              number: 80
      - path: /app2
        pathType: Prefix
        backend:
          service:
            name: app2-service
            port:
              number: 80

这些公开方法提供了不同程度的复杂性和功能,使你能够根据应用程序的需求选择最合适的选项。

Kubernetes 服务的用例和最佳实践

Kubernetes 服务为管理集群内的网络连接提供了一种通用且强大的抽象。让我们来探讨一些 Kubernetes 服务的常见用例和最佳实践。

服务部署模式

Kubernetes 服务可用于实现各种部署模式,例如:

  1. 蓝绿部署:使用一个选择器指向应用程序“蓝色”版本的服务,以及另一个指向“绿色”版本的服务,这样你就可以在不中断用户流量的情况下无缝切换版本。
  2. 金丝雀部署:通过使用具有不同选择器的多个服务,你可以逐步向一部分用户推出应用程序的新版本,从而在全面推出之前对新版本进行测试。

服务扩展

Kubernetes 服务与 Deployment 和 ReplicaSet 资源无缝协作,使你能够水平扩展应用程序。当你扩展 Deployment 时,相应的服务会自动在新的 Pod 之间负载均衡流量。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:v1

服务监控与高可用性

Kubernetes 服务提供了内置的健康检查和负载均衡功能,这对于确保应用程序的高可用性至关重要。你可以配置存活探针和就绪探针来监控 Pod 的健康状况,服务会自动将流量从不健康的 Pod 转移开。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080
  type: ClusterIP

通过利用 Kubernetes 服务,你可以构建高可用、可扩展且易于维护的应用程序,并与 Kubernetes 生态系统无缝集成。

总结

Kubernetes 服务在实现 Kubernetes 集群内的通信和负载均衡方面发挥着关键作用。本教程涵盖了 Kubernetes 服务的基础知识,包括不同的服务类型(ClusterIP、NodePort、LoadBalancer 和 ExternalName),以及如何使用它们来公开你的应用程序。通过了解每种服务类型的功能和用例,你可以做出明智的决策,并有效地管理基于 Kubernetes 的应用程序的网络需求。