公開外部 IP 位址以存取叢集中的應用程式

此頁面說明如何建立 Kubernetes 服務物件,以公開外部 IP 位址。

準備開始

  • 安裝 kubectl
  • 使用雲端供應商 (例如 Google Kubernetes Engine 或 Amazon Web Services) 建立 Kubernetes 叢集。本教學課程建立外部負載平衡器,這需要雲端供應商。
  • 設定 kubectl 以與您的 Kubernetes API 伺服器通訊。如需指示,請參閱您的雲端供應商的文件。

目標

  • 執行 Hello World 應用程式的五個執行個體。
  • 建立公開外部 IP 位址的服務物件。
  • 使用服務物件存取執行中的應用程式。

為在五個 Pod 中執行的應用程式建立服務

  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
    

    上述命令會建立部署和相關聯的ReplicaSet。ReplicaSet 有五個Pod,每個 Pod 都執行 Hello World 應用程式。

  2. 顯示關於部署的資訊

    kubectl get deployments hello-world
    kubectl describe deployments hello-world
    
  3. 顯示關於您的 ReplicaSet 物件的資訊

    kubectl get replicasets
    kubectl describe replicasets
    
  4. 建立公開部署的服務物件

    kubectl expose deployment hello-world --type=LoadBalancer --name=my-service
    
  5. 顯示關於服務的資訊

    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
    
  6. 顯示關於服務的詳細資訊

    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。另請注意 PortNodePort 的值。在本範例中,Port 為 8080,而 NodePort 為 32377。

  7. 在上述輸出中,您可以看到服務有數個端點:10.0.0.6:8080、10.0.1.6:8080、10.0.1.7:8080 + 另外 2 個。這些是執行 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 訊息

    Hello, world!
    Version: 2.0.0
    Hostname: 0bd46b45f32f
    

清理

若要刪除服務,請輸入此命令

kubectl delete services my-service

若要刪除部署、ReplicaSet 和執行 Hello World 應用程式的 Pod,請輸入此命令

kubectl delete deployment hello-world

下一步

深入瞭解使用服務連接應用程式

上次修改時間為 2024 年 6 月 2 日 凌晨 2:43 PST:修改映像檔 node-hello 為 hello-app (#46582) (d5b194da5b)