Kubernetes Expose 命令

KubernetesKubernetesBeginner
立即练习

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

介绍

Kubernetes 中的 expose 命令是一个简单但功能强大的工具,用于使 Pod 或 Deployment 通过网络服务可访问。本实验将指导你完成启动 Kubernetes 集群、创建 Deployment、将其暴露为服务以及访问服务以验证功能的整个过程。通过本实验,你将清楚地了解如何在 Kubernetes 中暴露 Deployment 并处理服务。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/BasicsGroup(["Basics"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("Initialization") kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/BasicCommandsGroup -.-> kubernetes/delete("Delete") kubernetes/BasicCommandsGroup -.-> kubernetes/expose("Expose") kubernetes/BasicCommandsGroup -.-> kubernetes/run("Run") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/port_forward("Port-Forward") subgraph Lab Skills kubernetes/initialization -.-> lab-8452{{"Kubernetes Expose 命令"}} kubernetes/get -.-> lab-8452{{"Kubernetes Expose 命令"}} kubernetes/create -.-> lab-8452{{"Kubernetes Expose 命令"}} kubernetes/delete -.-> lab-8452{{"Kubernetes Expose 命令"}} kubernetes/expose -.-> lab-8452{{"Kubernetes Expose 命令"}} kubernetes/run -.-> lab-8452{{"Kubernetes Expose 命令"}} kubernetes/describe -.-> lab-8452{{"Kubernetes Expose 命令"}} kubernetes/port_forward -.-> lab-8452{{"Kubernetes Expose 命令"}} end

启动 Minikube

要在本地运行 Kubernetes,我们使用 Minikube,它会设置一个单节点的 Kubernetes 集群。在进行任何 Kubernetes 操作之前,请确保 Minikube 已启动并运行。

  1. 打开终端并使用以下命令启动 Minikube:

    minikube start

    这将初始化集群。如果需要,你可以使用 --cpus--memory 等标志指定资源限制,以确保集群有足够的资源。

  2. 验证 Minikube 是否正在运行:

    minikube status

    你应该会看到集群及其组件正在成功运行。

启动 Minikube 可确保 Kubernetes 已准备好管理后续步骤中的部署和服务。

创建 Deployment

在 Kubernetes 中,Deployment 是一种资源对象,用于确保你的应用程序始终运行所需数量的副本。Deployment 管理 Pod 并帮助维护它们在集群中的状态。在此步骤中,你将创建一个运行 Nginx Web 服务器的 Deployment。

  1. 使用以下命令创建一个名为 hello-world 的 Deployment,并使用 nginx 镜像:

    kubectl create deployment hello-world --image=nginx

    此命令会创建一个运行 Nginx Web 服务器的单 Pod 的 Deployment。--image 标志指定了要使用的容器镜像。由于未显式设置副本数量,Kubernetes 默认会创建一个 Pod。

  2. 通过运行以下命令检查 Deployment 是否成功创建:

    kubectl get deployments

    此命令会列出当前命名空间中的所有 Deployment,显示它们的名称、所需副本数量和状态。

通过创建此 Deployment,你可以确保 Kubernetes 自动处理 Pod 的创建和重启,以维持所需的应用程序状态。

探索 kubectl expose 命令

kubectl expose 命令用于创建一个新的 Kubernetes 服务,以暴露现有的资源,例如 Pod、Deployment 或 Replication Controller。它通过基于提供的资源自动创建服务,简化了网络配置。

运行以下命令以查看 kubectl expose 的可用选项:

kubectl expose -h

你将看到以下输出:

将资源暴露为新的 Kubernetes 服务。

通过名称查找 Deployment、Service、Replica Set、Replication Controller 或 Pod,并使用该资源的选择器作为新服务的选择器,指定端口。只有当 Deployment 或 Replica Set 的选择器可以转换为服务支持的选择器时(即选择器仅包含 matchLabels 组件),才会将其暴露为服务。请注意,如果未通过 --port 指定端口且暴露的资源具有多个端口,则所有端口都将被新服务重用。此外,如果未指定标签,新服务将重用其暴露资源的标签。

可能的资源包括(不区分大小写):
  pod (po), service (svc), replicationcontroller (rc), deployment (deploy), replicaset (rs)

示例:
  ## 为复制的 nginx 创建一个服务,该服务在端口 80 上提供服务并连接到容器上的端口 8000
  kubectl expose rc nginx --port=80 --target-port=8000

  ## 为通过 "nginx-controller.yaml" 中指定的类型和名称标识的 Replication Controller 创建一个服务,该服务在端口 80 上提供服务并连接到容器上的端口 8000
  kubectl expose -f nginx-controller.yaml --port=80 --target-port=8000

  ## 为 Pod valid-pod 创建一个服务,该服务在端口 444 上提供服务,名称为 "frontend"
  kubectl expose pod valid-pod --port=444 --name=frontend

  ## 基于上述服务创建第二个服务,将容器端口 8443 暴露为端口 443,名称为 "nginx-https"
  kubectl expose service nginx --port=443 --target-port=8443 --name=nginx-https

  ## 为复制的流媒体应用程序创建一个服务,在端口 4100 上平衡 UDP 流量,名称为 'video-stream'
  kubectl expose rc streamer --port=4100 --protocol=UDP --name=video-stream

  ## 为使用 Replica Set 复制的 nginx 创建一个服务,该服务在端口 80 上提供服务并连接到容器上的端口 8000
  kubectl expose rs nginx --port=80 --target-port=8000

  ## 为 nginx Deployment 创建一个服务,该服务在端口 80 上提供服务并连接到容器上的端口 8000
  kubectl expose deployment nginx --port=80 --target-port=8000

暴露 Deployment

为了使 Deployment 可以从 Kubernetes 集群外部访问,你需要将其暴露为一个服务。Kubernetes 中的服务充当稳定的网络端点,即使底层 Pod 发生变化。

  1. 运行以下命令以创建一个名为 hello-service 的 NodePort 服务:

    kubectl expose deployment hello-world --name=hello-service --port=80 --target-port=80 --type=NodePort
    • --port 标志指定服务将向外部客户端暴露的端口。
    • --target-port 标志定义服务将流量路由到的容器端口。
    • --type=NodePort 标志使服务可以在集群中每个节点的特定端口上访问。
  2. 验证服务是否成功创建:

    kubectl get services hello-service

    此命令显示服务的详细信息,包括其类型和分配的 NodePort。

像 NodePort 这样的服务允许外部客户端通过将请求转发到正确的容器端口与 Kubernetes 集群中的 Pod 进行交互。

获取服务详细信息

要访问暴露的服务,你需要获取分配给服务的 NodePort 以及集群中某个节点的内部 IP 地址。这些详细信息使外部客户端能够连接到你的应用程序。

  1. 通过运行以下命令获取分配给 hello-service 的 NodePort:

    kubectl get service hello-service -o jsonpath='{.spec.ports[0].nodePort}'

    此命令从服务定义中提取 NodePort 值。

  2. 使用以下命令获取集群中任意节点的内部 IP 地址:

    kubectl get nodes -o wide

    注意输出中的 INTERNAL-IP 字段。此 IP 地址表示节点的私有网络地址。

有了 NodePort 和 InternalIP,你现在具备了从外部访问服务所需的详细信息。

访问服务

通过 NodePort 和节点的 IP 地址,你可以使用 curl 或浏览器等工具测试服务。

  1. <NODE_IP><NODE_PORT> 替换为上一步中获取的值,然后运行:

    curl <NODE_IP>:<NODE_PORT>
  2. 如果一切配置正确,你应该在终端中看到默认的 Nginx 欢迎页面。此输出确认服务正在运行并且可以从外部访问。

<!doctype html>
<html>
  <head>
    <title>Welcome to nginx!</title>
    <style>
      html {
        color-scheme: light dark;
      }
      body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
      }
    </style>
  </head>
  <body>
    <h1>Welcome to nginx!</h1>
    <p>
      If you see this page, the nginx web server is successfully installed and
      working. Further configuration is required.
    </p>

    <p>
      For online documentation and support please refer to
      <a href="http://nginx.org/">nginx.org</a>.<br />
      Commercial support is available at
      <a href="http://nginx.com/">nginx.com</a>.
    </p>

    <p><em>Thank you for using nginx.</em></p>
  </body>
</html>

访问服务展示了 Kubernetes 如何处理客户端与适当容器端口之间的流量路由。

清理资源

完成实验后,清理你创建的资源非常重要,以避免 Kubernetes 集群中不必要的资源消耗。

  1. 通过运行以下命令删除 hello-service

    kubectl delete service hello-service
  2. 使用以下命令删除 hello-world 部署:

    kubectl delete deployment hello-world

清理资源可确保你的集群保持干净状态,为未来的实验做好准备。

总结

在本实验中,你学习了如何在 Kubernetes 中使用 expose 命令创建 NodePort 服务。你暴露了一个 Nginx 部署,通过 NodePort 访问它,并验证了其功能。此练习展示了 Kubernetes 服务的核心概念,以及它们如何为你的负载提供网络访问。