k8s
官方教程
Stateless Application
Expose External Ip Address

Exposing an External IP Address to Access an Application in a Cluster

本页面展示了如何创建一个能暴露外部 IP 地址的 Kubernetes 服务(Service)对象。

Before you begin

安装 kubectl。

使用像谷歌 Kubernetes 引擎(Google Kubernetes Engine)或亚马逊网络服务(Amazon Web Services)这样的云服务提供商来创建一个 Kubernetes 集群。本教程会创建一个外部负载均衡器,这需要借助云服务提供商来实现。 配置 kubectl 以与你的 Kubernetes API 服务器进行通信。有关具体操作说明,请参阅你所使用的云服务提供商的文档。

Objectives

💡
  • 运行五个 “Hello World” 应用程序实例。
  • 创建一个能暴露外部 IP 地址的Serice对象。
  • 使用该Service对象来访问正在运行的应用程序。

Creating a service for an application running in five pods

1.在你的集群中运行一个 “Hello World” 应用程序。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: load-balancer-example
  name: hello-world
spec:
  replicas: 5
  selector:
    matchLabels:
      app.kubernetes.io/name: load-balancer-example
  template:
    metadata:
      labels:
        app.kubernetes.io/name: load-balancer-example
    spec:
      containers:
      - image: gcr.io/google-samples/hello-app:2.0
        name: hello-world
        ports:
        - containerPort: 8080
kubectl apply -f https://k8s.io/examples/service/load-balancer-example.yaml

上述命令会创建一个 Deployment 以及一个与之关联的 ReplicaSet。该副本集包含五个 Pod,每个 Pod 都运行着 “Hello World” 应用程序。

2.显示有关该 Deployment 的信息:

kubectl get deployments hello-world
kubectl describe deployments hello-world

3.显示你的副本集对象的相关信息:

kubectl get replicasets
kubectl describe replicasets

4.创建一个用于暴露该部署的Service:

kubectl expose deployment hello-world --type=LoadBalancer --name=my-service

5.显示有关该 Service 的信息:

kubectl get services my-service

输出类似于:

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

“type=LoadBalancer” 类型的Service由外部云服务提供商提供支持,本示例不涉及相关内容,具体详情请参考此页面。

如果外部 IP 地址显示为 <pending>,请等待一分钟,然后再次输入相同的命令。

6.显示有关该 Service 的信息:

kubectl describe services my-service

响应内容应如下类似:

Name:           my-service
Namespace:      default
Labels:         app.kubernetes.io/name=load-balancer-example
Annotations:    <none>
Selector:       app.kubernetes.io/name=load-balancer-example
Type:           LoadBalancer
IP:             10.3.245.137
LoadBalancer Ingress:   104.198.205.71
Port:           <unset> 8080/TCP
NodePort:       <unset> 32377/TCP
Endpoints:      10.0.0.6:8080,10.0.1.6:8080,10.0.1.7:8080 + 2 more...
Session Affinity:   None
Events:         <none>

记录下你的服务所暴露的外部 IP 地址(即 LoadBalancer Ingress)。在这个示例中,外部 IP 地址是 104.198.205.71。 同时,记下 Port(端口)和 NodePort(节点端口)的值。在这个示例中,Port 是 8080,NodePort 是 32377。

7.在前面的输出中,你可以看到该服务有多个端点: 10.0.0.6:8080、10.0.1.6:8080、10.0.1.7:8080 以及另外两个。这些是运行 “Hello World” 应 用程序的 Pod 的内部地址。要验证这些是否为 Pod 地址,请输入以下命令:

kubectl get pods --output=wide

输出类似于:

NAME                         ...  IP         NODE
hello-world-2895499144-1jaz9 ...  10.0.1.6   gke-cluster-1-default-pool-e0b8d269-1afc
hello-world-2895499144-2e5uh ...  10.0.1.8   gke-cluster-1-default-pool-e0b8d269-1afc
hello-world-2895499144-9m4h1 ...  10.0.0.6   gke-cluster-1-default-pool-e0b8d269-5v7a
hello-world-2895499144-o4z13 ...  10.0.1.7   gke-cluster-1-default-pool-e0b8d269-1afc
hello-world-2895499144-segjf ...  10.0.2.5   gke-cluster-1-default-pool-e0b8d269-cpuc

8.使用外部 IP 地址(即 LoadBalancer Ingress)来访问 “Hello World” 应用程序:

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

其中 <external-ip> 是你的服务的外部 IP 地址(即 LoadBalancer Ingress),<port> 是你的服务描述中 Port 的值。 如果你使用的是 Minikube,输入 minikube service my-service 命令会自动在浏览器中打开 “Hello World” 应用程序。 成功发出请求后得到的响应是一条问候消息:

Hello, world!
Version: 2.0.0
Hostname: 0bd46b45f32f

Cleaning up

要删除该Service,请输入以下命令:

kubectl delete services my-service

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

kubectl delete deployment hello-world