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: 8080kubectl 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-world3.显示你的副本集对象的相关信息:
kubectl get replicasets
kubectl describe replicasets4.创建一个用于暴露该部署的Service:
kubectl expose deployment hello-world --type=LoadBalancer --name=my-service5.显示有关该 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-cpuc8.使用外部 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: 0bd46b45f32fCleaning up
要删除该Service,请输入以下命令:
kubectl delete services my-service要删除正在运行 “Hello World” 应用程序的 Deployment、ReplicaSet和 Pod,请输入以下命令:
kubectl delete deployment hello-world