如何从节点连接到 Kubernetes 服务

KubernetesKubernetesBeginner
立即练习

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

简介

本教程全面介绍了 Kubernetes 服务,包括其类型、工作原理以及如何从集群内的节点连接到它们。你将学习服务发现的基础知识,并通过实际示例来公开你的应用程序并从集群外部访问它们。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/BasicCommandsGroup -.-> kubernetes/expose("Expose") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/exec("Exec") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/logs("Logs") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/port_forward("Port-Forward") subgraph Lab Skills kubernetes/get -.-> lab-418971{{"如何从节点连接到 Kubernetes 服务"}} kubernetes/create -.-> lab-418971{{"如何从节点连接到 Kubernetes 服务"}} kubernetes/expose -.-> lab-418971{{"如何从节点连接到 Kubernetes 服务"}} kubernetes/describe -.-> lab-418971{{"如何从节点连接到 Kubernetes 服务"}} kubernetes/exec -.-> lab-418971{{"如何从节点连接到 Kubernetes 服务"}} kubernetes/logs -.-> lab-418971{{"如何从节点连接到 Kubernetes 服务"}} kubernetes/port_forward -.-> lab-418971{{"如何从节点连接到 Kubernetes 服务"}} end

理解 Kubernetes 服务

Kubernetes 服务是 Kubernetes 生态系统中的一个基本概念,它提供了一种将在集群上运行的应用程序暴露给外部世界或集群内其他应用程序的方式。在本节中,我们将探讨对 Kubernetes 服务的基本理解、它们的类型以及工作原理。

什么是 Kubernetes 服务?

Kubernetes 服务是一种抽象,它定义了一组逻辑 Pod 以及访问它们的策略。服务实现了依赖 Pod 之间的松散耦合,使它们能够相互通信而无需了解对方实现的细节。服务还为客户端提供了一个稳定的端点来连接,而不管正在运行的底层 Pod 是什么。

Kubernetes 服务的类型

Kubernetes 提供了几种类型的服务来满足不同的用例:

  1. ClusterIP 服务:这是默认的服务类型,它在集群内部 IP 地址上暴露服务。这种类型的服务只能从集群内部访问。

  2. NodePort 服务:这种类型的服务在节点的 IP 地址上的一个静态端口上暴露应用程序。这允许使用节点的 IP 地址和 NodePort 从集群外部访问应用程序。

  3. LoadBalancer 服务:这种服务类型为应用程序配置一个负载均衡器,通常在云环境中。负载均衡器将流量转发到服务,然后服务将其路由到适当的 Pod。

  4. ExternalName 服务:这种服务类型将服务映射到一个 DNS 名称而不是选择 Pod。这可用于将 Kubernetes 服务与外部服务进行桥接。

服务发现和组件

Kubernetes 服务为客户端提供了一种发现和连接到集群中运行的应用程序的方式。这是通过以下组件实现的:

  1. 服务 IP:每个服务都被分配一个唯一的集群内部 IP 地址,它充当客户端访问应用程序的入口点。

  2. 端点:端点表示作为服务一部分的 Pod 的 IP 地址。Kubernetes 根据正在运行且与服务选择器匹配的 Pod 自动管理端点。

  3. kube-proxy:在每个节点上运行的 kube-proxy 组件负责实现网络代理,该代理根据服务配置将流量重定向到适当的 Pod。

graph LR Client --> Service Service --> Endpoints Endpoints --> Pods

通过理解 Kubernetes 服务的基本概念和组件,你可以开始构建和部署能够在你的 Kubernetes 集群中轻松访问和扩展的应用程序。

连接到 Kubernetes 服务

一旦你对 Kubernetes 服务有了基本的了解,接下来的步骤就是学习如何从集群内部和外部连接到这些服务。在本节中,我们将探讨访问 Kubernetes 服务的不同方法和技巧。

从集群内部访问服务

在 Kubernetes 集群内部,Pod 可以使用服务的集群内部 IP 地址或服务名称来访问其他服务。这可以通过以下方法实现:

  1. 环境变量:创建 Pod 时,Kubernetes 会自动注入包含服务的 IP 地址和端口的环境变量。

  2. 基于 DNS 的服务发现:Kubernetes 提供了一个内置的 DNS 服务器,它将服务名称解析为相应的集群内部 IP 地址,使 Pod 能够通过名称连接到其他服务。

graph LR Pod --> Service Service --> Endpoints Endpoints --> Pods

从集群外部访问服务

要从集群外部访问 Kubernetes 服务,可以使用以下方法:

  1. NodePort 服务:如前所述,这种服务类型在节点的 IP 地址上的一个静态端口上暴露应用程序,允许外部客户端连接到该应用程序。

  2. LoadBalancer 服务:这种服务类型通常在云环境中配置一个负载均衡器,它将流量转发到服务,然后再转发到适当的 Pod。

  3. Ingress:Ingress 是一种 Kubernetes 资源,它提供高级路由和负载均衡功能,允许你在单个 IP 地址或域名下暴露多个服务。

graph LR Client --> Ingress Ingress --> Service Service --> Endpoints Endpoints --> Pods

通过了解这些连接到 Kubernetes 服务的不同方法,你可以根据应用程序的需求和正在运行的基础架构选择合适的方法。

Kubernetes 服务实践示例

为了更好地理解 Kubernetes 服务的实际应用,让我们来探讨一些实践示例。在本节中,我们将逐步介绍不同类型 Kubernetes 服务的部署和配置,以及解决常见问题的方法。

部署 ClusterIP 服务

让我们从一个简单的 ClusterIP 服务示例开始。首先,我们将为后端应用创建一个 Deployment,然后将其作为 ClusterIP 服务暴露出来:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
        - name: backend
          image: backend:v1
          ports:
            - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: backend
spec:
  selector:
    app: backend
  ports:
    - port: 8080
      targetPort: 8080

在这个示例中,ClusterIP 服务在端口 8080 上暴露后端应用,并且 Kubernetes 会根据运行后端应用的 Pod 自动管理端点。

部署 NodePort 服务

接下来,让我们创建一个 NodePort 服务以在外部暴露应用:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
spec:
  replicas: 2
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
        - name: frontend
          image: frontend:v1
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: frontend
spec:
  type: NodePort
  selector:
    app: frontend
  ports:
    - port: 80
      targetPort: 80

在这个示例中,NodePort 服务在节点的 IP 地址上的一个随机端口上暴露前端应用,允许外部客户端访问该应用。

解决 Kubernetes 服务问题

如果你在 Kubernetes 服务中遇到任何问题,可以采取以下步骤进行故障排除:

  1. 使用 kubectl get service <service-name> -o yaml 验证服务配置。
  2. 使用 kubectl get endpoints <service-name> 检查与服务关联的端点。
  3. 使用 kubectl logs <pod-name> 检查与服务关联的 Pod 的日志。
  4. 确保存在必要的网络策略和防火墙规则以允许流量访问服务。

通过探索这些实践示例和故障排除技术,你将更深入地了解如何在应用程序中有效地部署和管理 Kubernetes 服务。

总结

Kubernetes 服务是 Kubernetes 生态系统中的一个关键概念,它使你能够将在集群上运行的应用程序暴露给外部世界或集群内的其他应用程序。在本教程中,你已经了解了 Kubernetes 服务的不同类型、它们的工作原理以及如何从节点连接到它们。通过理解服务发现和各种服务类型,你可以有效地暴露和访问你的应用程序,无论它们是在集群内运行还是需要从外部访问。