了解 Kubernetes 中的 Service

学习目标

  • 识别 Service 的功能特性

  • 说明 Kubernetes 中的服务发现机制

Kubernetes 中的 Service

视频:本节含 SAP 官方视频(视频 ID 1_zbfke7l7),需在 learning.sap.com 在线观看。

Service 是 Kubernetes 中的一个核心概念。当你创建一个 Deployment 时,该 Deployment 管理一个 ReplicaSet,而 ReplicaSet 管理底层的 Pod。

然而,Pod 是短暂的,随时可能被终止和替换。与由 StatefulSet 管理的 Pod 不同,由 Deployment 管理的 Pod 没有稳定的名称——其名称的一部分会被赋予一个随机哈希后缀。因此,当一个 Pod 被终止并由新的 Pod 替换时,新 Pod 的名称和 IP 地址都与旧 Pod 不同。

要访问你的应用,你需要为底层 Pod 提供一个稳定的端点。这正是 Service 发挥作用的地方。

Service 将 Pod 分组

Service 将 Pod 分组在一起,并提供一个稳定的端点来访问这些 Pod。标签选择器(label selector)用于对 Service 清单中定义的 Pod 进行分组。

定义 Service

一个简单的 Service 清单如下所示:

apiVersion: v1
kind: Service
metadata:
name: hello-kyma-svc
spec:
selector:
app: 'hello-kyma'
ports:
- protocol: 'TCP'
port: 80
targetPort: 8080

此示例 Service 清单定义了一个名为 hello-kyma-svc 的 Service,它把带有标签 app: hello-kyma-svc 的 Pod 分组在一起。该 Service 暴露端口 80,并将所有流量转发到 Pod 的端口 8080

访问 Service

Service 将一组 Pod 作为网络服务提供,集群中的其他 Pod 可以访问它。你将在使用 API Gateway 模块暴露 Service一课中了解如何从集群外部访问 Service。

在集群内部,你只需提供服务名称作为 DNS 名称即可访问该 Service。以下模式用于构造 DNS 名称:

<service-name>.<namespace>.svc.cluster.local

因此,如果你在 default 命名空间中有一个名为 hello-kyma-svc 的 Service,就可以使用 DNS 名称 hello-kyma-svc.default.svc.cluster.local 来访问它。

在同一命名空间内,你可以使用短名称 hello-kyma-svc 访问该 Service。你还可以从集群中的其他命名空间使用简短形式 hello-kyma-svc.default 来访问该 Service。

检查 Pod 何时完全就绪

对于某些应用而言,了解应用是已准备好接收流量还是仍处于启动阶段至关重要。例如,如果你有一个 Web 应用,就必须确保应用完全启动后再向其发送流量。

Kubernetes 提供了两种机制,用于在向应用发送流量之前检查其健康状况。这些机制称为就绪探针存活探针

借助就绪探针,你可以检查应用是否已准备好接收流量。如果就绪探针失败,Pod 就不会收到来自 Service 的任何流量。Service 只会向已就绪的 Pod 发送流量。

以下示例展示了一个定义了就绪探针的 Deployment 清单:

apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-kyma
spec:
replicas: 1
selector:
matchLabels:
app: hello-kyma
template:
metadata:
labels:
app: hello-kyma
spec:
containers:
- name: hello-kyma
image: ghcr.io/sap-samples/kyma-runtime-learning-journey/hello-kyma:1.0.0
readinessProbe:
httpGet:
path: /ready
port: 8080
periodSeconds: 5
failureThreshold: 3
successThreshold: 1

就绪探针定义在 readinessProbe 部分。该就绪探针是对端口 8080 上路径 /ready 的 HTTP GET 请求。就绪探针每 5 秒执行一次。如果就绪探针连续失败三次,则该 Pod 被视为未就绪。如果就绪探针连续成功一次,则该 Pod 被视为已就绪。要了解更多信息,请参阅定义就绪探针

Kyma 仪表板中的 Service 管理

Kyma 仪表板提供了一种管理 Service 的简便方式。你可以使用它来创建、编辑和删除 Service。此外,在 Kyma 仪表板中,你可以创建 APIRule 以将 Service 暴露给外部世界,或者使用 Subscription 订阅事件。

管理 service

Service 的其他用途

Service 不仅用于将 Pod 分组在一起并提供访问 Pod 的稳定端点。Service 还可用于将 Pod 暴露给外部世界。在 Kyma 中,有几种将 Service 暴露给外部世界的方式。你将在下一课中了解这些概念。

总结

Kubernetes 中的 Service 为访问由 Deployment 管理的 Pod 提供了稳定的端点。Service 使用 Service 清单中定义的标签选择器将 Pod 分组在一起,即使 Pod 被终止和替换也能确保地址一致。它们暴露特定端口并将流量转发到底层 Pod,使应用可在集群内访问。此外,Kubernetes 中的就绪探针确保只有完全就绪的 Pod 才会接收流量。

延伸阅读

Kubernetes Services