使用 Kubernetes Service 连接 Pod

KubernetesKubernetesBeginner
立即练习

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

介绍

在 Kubernetes 中,Pod 是短暂的,可以随时被终止和重新创建。这在网络方面带来了挑战,因为直接连接到 Pod 是很困难的。为了解决这个问题,Kubernetes 提供了一个更高层次的抽象,称为 Service。Service 为一组 Pod 提供了一个稳定的 IP 地址和 DNS 名称,使得其他组件可以轻松地连接到它们。在本实验中,你将学习如何在 Kubernetes 中使用 Service 进行 Pod 的网络连接。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicsGroup(["`Basics`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicCommandsGroup(["`Basic Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/AdvancedCommandsGroup(["`Advanced Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["`Troubleshooting and Debugging Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/ConfigurationandVersioningGroup(["`Configuration and Versioning`"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("`Initialization`") kubernetes/BasicCommandsGroup -.-> kubernetes/get("`Get`") kubernetes/BasicCommandsGroup -.-> kubernetes/create("`Create`") kubernetes/BasicCommandsGroup -.-> kubernetes/set("`Set`") kubernetes/BasicCommandsGroup -.-> kubernetes/expose("`Expose`") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("`Apply`") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("`Describe`") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/exec("`Exec`") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/label("`Label`") subgraph Lab Skills kubernetes/initialization -.-> lab-15815{{"`使用 Kubernetes Service 连接 Pod`"}} kubernetes/get -.-> lab-15815{{"`使用 Kubernetes Service 连接 Pod`"}} kubernetes/create -.-> lab-15815{{"`使用 Kubernetes Service 连接 Pod`"}} kubernetes/set -.-> lab-15815{{"`使用 Kubernetes Service 连接 Pod`"}} kubernetes/expose -.-> lab-15815{{"`使用 Kubernetes Service 连接 Pod`"}} kubernetes/apply -.-> lab-15815{{"`使用 Kubernetes Service 连接 Pod`"}} kubernetes/describe -.-> lab-15815{{"`使用 Kubernetes Service 连接 Pod`"}} kubernetes/exec -.-> lab-15815{{"`使用 Kubernetes Service 连接 Pod`"}} kubernetes/label -.-> lab-15815{{"`使用 Kubernetes Service 连接 Pod`"}} end

启动 Minikube 集群

在创建资源之前,你需要一个正在运行的 Kubernetes 集群。Minikube 是一个轻量级的 Kubernetes 环境,可以在你的本地机器上运行。

  1. 导航到工作目录

    打开终端并导航到默认的项目文件夹:

    cd /home/labex/project
  2. 启动 Minikube

    启动 Minikube 以初始化一个 Kubernetes 集群:

    minikube start
    • 此命令将在你的本地机器上设置一个单节点的 Kubernetes 集群。
    • 根据系统性能,Minikube 可能需要几分钟才能启动。
  3. 验证 Minikube 是否正在运行

    检查 Minikube 集群的状态:

    minikube status
    • 查找 kubeletapiserver 等组件是否显示为 Running
    • 如果集群未运行,请重新运行 minikube start

如果启动 Minikube 时遇到问题,可以使用 minikube delete 来重置环境(如有需要)。

创建一个 Pod

第一步是创建一个简单的 Pod。创建一个名为 /home/labex/project/myapp-pod.yaml 的文件,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod-1
  labels:
    app: nginx
spec:
  containers:
    - name: my-container
      image: nginx

保存文件后,运行以下命令来创建 Pod:

kubectl apply -f /home/labex/project/myapp-pod.yaml

这将创建一个名为 my-pod-1 的 Pod,其中包含一个运行 Nginx 镜像的容器。

创建一个 Service

第二步是创建一个 Service,该 Service 将指向你在上一步中创建的 Pod。创建一个名为 /home/labex/project/service.yaml 的文件,内容如下:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: nginx
  ports:
    - name: http
      port: 80
      targetPort: 80

保存文件后,运行以下命令来创建 Service:

kubectl apply -f /home/labex/project/service.yaml

这将创建一个名为 my-service 的 Service,该 Service 会指向带有标签 app=nginx 的 Pod,并暴露端口 80。

测试 Service

第三步是通过从另一个 Pod 访问 Service 来测试其功能。创建一个名为 /home/labex/project/test-pod-1.yaml 的文件,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: test-pod-1
spec:
  containers:
    - name: my-container
      image: nginx
      command:
        - sleep
        - "3600"

保存文件后,运行以下命令来创建测试 Pod:

kubectl apply -f /home/labex/project/test-pod-1.yaml

这将创建一个名为 test-pod-1 的 Pod,其中包含一个运行 Busybox 镜像的容器。

接下来,你需要进入容器并使用 curl 访问 Service。运行以下命令以进入容器:

kubectl exec -it test-pod-1 -- sh

这将打开容器内的 shell。在 shell 中,运行以下命令以访问 Service:

curl http://my-service

这将返回默认的 Nginx 页面,表明 Service 工作正常。

更新 Service

第四步是更新 Service,使其指向另一组 Pod。将 /home/labex/project/service.yaml 文件中的 selector 字段更新为以下内容:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: busybox
  ports:
    - name: http
      port: 80
      targetPort: 8

保存文件后,运行以下命令以更新 Service:

kubectl apply -f service.yaml

这将更新 Service,使其指向带有标签 app=busybox 的 Pod。

测试更新后的 Service

第五步是通过从另一个 Pod 访问更新后的 Service 来测试其功能。使用以下命令创建一个新的测试 Pod:

kubectl run my-pod-2 --image=nginx --restart=Never

这将创建一个名为 test-pod-2 的新 Pod,其中包含一个运行 Busybox 镜像的容器。

像第三步一样,进入容器并使用 curl 访问 Service。这一次,你应该会收到一个连接被拒绝的错误提示。

这是因为 Service 现在指向的 Pod 与测试 Pod 运行的 Pod 不同。要解决此问题,你可以更新测试 Pod 的标签以匹配 Service 中的新选择器。

运行以下命令以更新测试 Pod 的标签:

kubectl label pod my-pod-2 app=busybox

这将为测试 Pod 添加标签 app=busybox

现在,如果你再次运行 curl 命令,你应该会看到默认的 Nginx 页面,表明 Service 工作正常。

总结

在本实验中,你学习了如何在 Kubernetes 中使用 Service 进行 Pod 的网络连接。你创建了一个运行 Nginx 镜像的简单 Pod,创建了一个 Service 以指向该 Pod,并通过从另一个 Pod 访问 Service 来测试其功能。你还学习了如何更新 Service 以指向另一组 Pod,以及如何更新 Pod 的标签以匹配 Service 中的新选择器。Service 是 Kubernetes 网络中的重要组件,它使你能够以可靠且可扩展的方式连接到 Pod。

您可能感兴趣的其他 Kubernetes 教程