本页内容

  • 前置条件
  • 我们将要做的内容
  • 创建 Service
  • 关于在 Kubernetes 中创建 Service 的常见问题
  • 总结

Service 是 Pod 之上的一层抽象。它定义了一组逻辑上的 Pod 集合。它提供一个单一的 IP 地址和 DNS 名称,Pod 可以通过它们被访问。它用于对外暴露 Pod。

Kubernetes 中有 3 种不同类型的 Service:

  • ClusterIP:它在 Kubernetes 集群内部暴露 Service。该 Service 只能从集群内部访问,无法从集群外部访问。
  • NodePort:它会在已部署节点上的一个静态端口上暴露 Service。可以通过 NodeIP:Nodeport 从集群外部访问该 Service。
  • Load Balancer:使用云提供商的负载均衡器将 Service 对外暴露,这会在云提供商上创建一个公网 IP。
  • ExternalName:它通过返回一条 CNAME 记录,将 Service 映射到 externalName 字段的内容。

点击此处了解更多关于 Kubernetes Service 的内容。

在本文中,我们将了解如何创建 NodePort 类型的 Service。

前置条件

  • 至少包含 1 个工作节点的 Kubernetes 集群。如果你想学习如何创建一个 Kubernetes 集群,请点击此处。本指南将帮助你在 AWS Ubuntu EC2 实例上创建一个包含 1 个 Master 和 2 个 Node 的 Kubernetes 集群。

我们将要做的内容

  • 创建 Service

创建 Service

首先,我们将使用以下定义创建一个 deployment,Service 会将所有发往它的请求重定向到该 deployment。

创建一个新文件并向其中添加以下内容,这将为 Nginx 创建一个 deployment。

vim my-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nginx
  replicas: 3 
  template: 
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

Kubernetes 中 Service 的创建与使用

要创建 deployment,请执行以下命令。

kubectl create -f my-deployment.yml

Kubernetes 中 Service 的创建与使用

这将创建一个包含 3 个副本的 Nginx deployment。

你可以使用以下命令获取 deployment、replicaset 和 pod 的详细信息。

kubectl get deployment | grep nginx
kubectl get replicaset | grep nginx
kubectl get pod | grep nginx

Kubernetes 中 Service 的创建与使用

在上面的截图中,你可以看到已经创建了 3 个 Nginx 副本。

现在,使用以下内容创建一个 Service 定义。

vim my-service.yml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  labels:
    app: nginx
spec:
  externalTrafficPolicy: Local
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:    
    app: nginx
  type: NodePort

Kubernetes 中 Service 的创建与使用

上述 Service 定义将使用 default 命名空间创建一个 NodePort 类型的 Service,并将请求重定向到标签为 nginx 的 Pod,即我们之前通过 deployment 创建步骤所创建的 Pod。

执行以下命令来创建 Service。

kubectl create -f my-service.yml

Kubernetes 中 Service 的创建与使用

获取 Service 的详细信息,并查看该 Service 可用的 NodePort。

kubectl get service | grep nginx
kubectl describe service nginx

Kubernetes 中 Service 的创建与使用

在上面的截图中,可以看到该 Service 在端口 30747 上可用。你的情况可能不同,因为该端口是从可用范围中随机分配的。

现在,可以通过 NodeIp:NodePort 经由该 Service 访问 nginx 应用。

这里为:106.210.138.189:30747

Kubernetes 中 Service 的创建与使用

关于在 Kubernetes 中创建 Service 的常见问题

什么是 Kubernetes Service?为什么它很重要?

Kubernetes Service 是一种抽象,它定义了一组逻辑上的 Pod 集合以及访问它们的策略。Service 能够实现 Kubernetes 集群内部和外部不同组件之间的通信,并为可能随时间变化的 Pod 提供稳定的接口。

如何在 Kubernetes 中创建 Service?

要创建 Service,你可以使用 YAML 文件来定义 Service 配置。定义完成后,使用 kubectl apply -f [filename.yaml] 应用它。该命令会根据 YAML 文件中的规范创建一个 Service。

Kubernetes 中的 Service 有哪些不同类型?

主要类型有 ClusterIP(默认类型,可在集群内部访问)、NodePort(在集群中每个 Node 的 IP 上以静态端口暴露 Service)、LoadBalancer(与基于云的负载均衡器集成)以及 ExternalName(将 Service 映射到 DNS 名称)。

如何将我的 Service 暴露到 Kubernetes 集群之外?

使用 NodePort 或 LoadBalancer 类型的 Service。NodePort 会在 Node 的 IP 上的静态端口暴露 Service。LoadBalancer 使用云提供商的负载均衡器来暴露 Service。

我可以在没有 YAML 文件的情况下创建 Service 吗?

可以,你可以使用 kubectl expose 通过命令行创建 Service。例如,kubectl expose deployment [deployment-name] --type=LoadBalancer --name=[service-name]。

如何确定我的 Kubernetes Service 的 IP 地址和端口?

使用 kubectl get services 列出所有 Service。这将显示分配给每个 Service 的内部 IP 地址和端口。

Service 在 Kubernetes 中是如何发现 Pod 的?

Service 使用标签来选择 Pod。当你定义一个 Service 时,你需要指定一个与目标任务 Pod 标签相匹配的 selector。

Kubernetes Service 能否将流量负载均衡到 Pod?

可以,Service 会自动将流量负载均衡到所有匹配该 Service selector 的 Pod。

如何在 Kubernetes 中更新 Service?

更新 Service 的 YAML 配置文件,然后使用 kubectl apply -f [filename.yaml] 应用更改。Kubernetes 会根据修改后的规范更新 Service。

如果 Service 所指向的 Pod 被删除了,会发生什么?

Service 会继续存在,但在创建出匹配其 selector 的新 Pod 之前,它不会转发流量。

如何在 Kubernetes 中删除 Service?

使用 kubectl delete service [service-name] 删除 Service。这不会影响 Pod,但它们将不再能通过该 Service 被访问。

Kubernetes 中的 Service 可以跨多个命名空间吗?

不能,Service 是特定于命名空间的。要在命名空间之间通信,你需要将命名空间作为 Service DNS 名称的一部分来使用。

总结

在本文中,我们创建了一个包含 3 个副本的 Nginx deployment,并创建了一个 NodePort 类型的 Service。我们了解了如何通过在 NodeIP:Port 上访问由 deployment 创建的 Nginx 应用。