此文档中的信息可能已过时
此文档的更新日期比原文晚,因此其中的信息可能已过时。如果能阅读英文,请查看英文版本以获取最新信息: Exposing an External IP Address to Access an Application in a Cluster
公开外部 IP 地址以访问集群中的应用
此页面显示如何创建公开外部 IP 地址的 Kubernetes 服务对象。
准备开始
- 安装 kubectl。
- 使用 Google Kubernetes Engine 或 Amazon Web Services 等云供应商创建 Kubernetes 集群。 本教程创建了一个外部负载均衡器, 需要云供应商。
- 配置
kubectl
与 Kubernetes API 服务器通信。有关说明,请参阅云供应商文档。
教程目标
- 运行 Hello World 应用的五个实例。
- 创建一个公开外部 IP 地址的 Service 对象。
- 使用 Service 对象访问正在运行的应用。
为在五个 Pod 中运行的应用创建服务
-
在集群中运行 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 对象。 ReplicaSet 有五个 Pod, 每个都运行 Hello World 应用。
-
显示有关 Deployment 的信息:
kubectl get deployments hello-world kubectl describe deployments hello-world
-
显示有关 ReplicaSet 对象的信息:
kubectl get replicasets kubectl describe replicasets
-
创建公开 Deployment 的 Service 对象:
kubectl expose deployment hello-world --type=LoadBalancer --name=my-service
-
显示有关 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
服务由外部云服务提供商提供支持,本例中不包含此部分, 详细信息请参考此页说明:
如果外部 IP 地址显示为 <pending>,请等待一分钟再次输入相同的命令。
-
显示有关 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。
-
在前面的输出中,你可以看到服务有几个端点: 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
-
使用外部 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
清理现场
要删除 Service,请输入以下命令:
kubectl delete services my-service
要删除正在运行 Hello World 应用的 Deployment、ReplicaSet 和 Pod,请输入以下命令:
kubectl delete deployment hello-world
接下来
进一步了解使用 Service 连接到应用。
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.