公开外部 IP 地址以访问集群中应用程序

此页面显示如何创建公开外部 IP 地址的 Kubernetes 服务对象。

准备开始

  • 安装 kubectl.

  • 使用 Google Kubernetes Engine 或 Amazon Web Services 等云供应商创建 Kubernetes 群集。 本教程创建了一个外部负载均衡器,需要云供应商。

  • 配置 kubectl 与 Kubernetes API 服务器通信。有关说明,请参阅云供应商文档。

教程目标

  • 运行 Hello World 应用程序的五个实例。
  • 创建一个公开外部 IP 地址的 Service 对象。
  • 使用 Service 对象访问正在运行的应用程序。

为一个在五个 pod 中运行的应用程序创建服务

  1. 在集群中运行 Hello World 应用程序:

service/load-balancer-example.yaml 公开外部 IP 地址以访问集群中应用程序 - 图1

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. labels:
  5. app.kubernetes.io/name: load-balancer-example
  6. name: hello-world
  7. spec:
  8. replicas: 5
  9. selector:
  10. matchLabels:
  11. app.kubernetes.io/name: load-balancer-example
  12. template:
  13. metadata:
  14. labels:
  15. app.kubernetes.io/name: load-balancer-example
  16. spec:
  17. containers:
  18. - image: gcr.io/google-samples/node-hello:1.0
  19. name: hello-world
  20. ports:
  21. - containerPort: 8080
  1. kubectl apply -f https://k8s.io/examples/service/load-balancer-example.yaml

前面的命令创建一个 Deployment 对象和一个关联的 ReplicaSet对象。 ReplicaSet 有五个 Pod,每个都运行 Hello World 应用程序。

  1. 显示有关 Deployment 的信息:

    1. kubectl get deployments hello-world
    2. kubectl describe deployments hello-world
  1. 显示有关 ReplicaSet 对象的信息:

    1. kubectl get replicasets
    2. kubectl describe replicasets
  1. 创建公开 deployment 的 Service 对象:

    1. kubectl expose deployment hello-world --type=LoadBalancer --name=my-service
  1. 显示有关 Service 的信息:

    1. kubectl get services my-service

输出类似于:

  1. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  2. my-service ClusterIP 10.3.245.137 104.198.205.71 8080/TCP 54s

注意:type=LoadBalancer 服务由外部云服务提供商提供支持,本例中不包含此部分,详细信息请参考此页

注意:如果外部 IP 地址显示为 ,请等待一分钟再次输入相同的命令。

  1. 显示有关 Service 的详细信息:

    1. kubectl describe services my-service

输出类似于:

  1. Name: my-service
  2. Namespace: default
  3. Labels: run=load-balancer-example
  4. Annotations: <none>
  5. Selector: run=load-balancer-example
  6. Type: LoadBalancer
  7. IP: 10.3.245.137
  8. LoadBalancer Ingress: 104.198.205.71
  9. Port: <unset> 8080/TCP
  10. NodePort: <unset> 32377/TCP
  11. Endpoints: 10.0.0.6:8080,10.0.1.6:8080,10.0.1.7:8080 + 2 more...
  12. Session Affinity: None
  13. Events: <none>

记下服务公开的外部 IP 地址(LoadBalancer Ingress)。 在本例中,外部 IP 地址是 104.198.205.71。还要注意 PortNodePort 的值。 在本例中,Port 是 8080,NodePort 是32377。

  1. 在前面的输出中,您可以看到服务有几个端点: 10.0.0.6:8080、10.0.1.6:8080、10.0.1.7:8080 和另外两个, 这些都是正在运行 Hello World 应用程序的 pod 的内部地址。 要验证这些是 pod 地址,请输入以下命令:

    1. kubectl get pods --output=wide

输出类似于:

  1. NAME ... IP NODE
  2. hello-world-2895499144-1jaz9 ... 10.0.1.6 gke-cluster-1-default-pool-e0b8d269-1afc
  3. hello-world-2895499144-2e5uh ... 10.0.1.8 gke-cluster-1-default-pool-e0b8d269-1afc
  4. hello-world-2895499144-9m4h1 ... 10.0.0.6 gke-cluster-1-default-pool-e0b8d269-5v7a
  5. hello-world-2895499144-o4z13 ... 10.0.1.7 gke-cluster-1-default-pool-e0b8d269-1afc
  6. hello-world-2895499144-segjf ... 10.0.2.5 gke-cluster-1-default-pool-e0b8d269-cpuc
  1. 使用外部 IP 地址(LoadBalancer Ingress)访问 Hello World 应用程序:

    1. curl http://<external-ip>:<port>

其中 <external-ip> 是您的服务的外部 IP 地址(LoadBalancer Ingress), <port> 是您的服务描述中的 port 的值。 如果您正在使用 minikube,输入 minikube service my-service 将在浏览器中自动打开 Hello World 应用程序。

成功请求的响应是一条问候消息:

  1. Hello Kubernetes!

清理现场

要删除服务,请输入以下命令:

  1. kubectl delete services my-service

要删除正在运行 Hello World 应用程序的 Deployment,ReplicaSet 和 Pod,请输入以下命令:

  1. kubectl delete deployment hello-world

接下来

了解更多关于将应用程序与服务连接