Kubernetes 使用服務(wù)來(lái)訪問(wèn)集群中的應(yīng)用

2022-06-15 11:23 更新

使用服務(wù)來(lái)訪問(wèn)集群中的應(yīng)用

本文展示如何創(chuàng)建一個(gè) Kubernetes 服務(wù)對(duì)象,能讓外部客戶(hù)端訪問(wèn)在集群中運(yùn)行的應(yīng)用。 該服務(wù)為一個(gè)應(yīng)用的兩個(gè)運(yùn)行實(shí)例提供負(fù)載均衡。

在開(kāi)始之前

你必須擁有一個(gè) Kubernetes 的集群,同時(shí)你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個(gè)節(jié)點(diǎn)的集群上運(yùn)行本教程,且這些節(jié)點(diǎn)不作為控制平面主機(jī)。 如果你還沒(méi)有集群,你可以通過(guò) Minikube 構(gòu)建一個(gè)你自己的集群,或者你可以使用下面任意一個(gè) Kubernetes 工具構(gòu)建:

要獲知版本信息,請(qǐng)輸入 ?kubectl version?。

教程目標(biāo)

  • 運(yùn)行 Hello World 應(yīng)用的兩個(gè)實(shí)例。
  • 創(chuàng)建一個(gè)服務(wù)對(duì)象來(lái)暴露 node port。
  • 使用服務(wù)對(duì)象來(lái)訪問(wèn)正在運(yùn)行的應(yīng)用。

為運(yùn)行在兩個(gè) pod 中的應(yīng)用創(chuàng)建一個(gè)服務(wù)

這是應(yīng)用程序部署的配置文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
spec:
  selector:
    matchLabels:
      run: load-balancer-example
  replicas: 2
  template:
    metadata:
      labels:
        run: load-balancer-example
    spec:
      containers:
        - name: hello-world
          image: gcr.io/google-samples/node-hello:1.0
          ports:
            - containerPort: 8080
              protocol: TCP
  1. 在你的集群中運(yùn)行一個(gè) Hello World 應(yīng)用: 使用上面的文件創(chuàng)建應(yīng)用程序 Deployment:
  2. kubectl apply -f https://k8s.io/examples/service/access/hello-application.yaml
    

    上面的命令創(chuàng)建一個(gè) Deployment 對(duì)象 和一個(gè)關(guān)聯(lián)的 ReplicaSet 對(duì)象。 這個(gè) ReplicaSet 有兩個(gè) Pod, 每個(gè) Pod 都運(yùn)行著 Hello World 應(yīng)用。

  3. 展示 Deployment 的信息:
  4. kubectl get deployments hello-world
    kubectl describe deployments hello-world
  5. 展示你的 ReplicaSet 對(duì)象信息:
  6. kubectl get replicasets
    kubectl describe replicasets
  7. 創(chuàng)建一個(gè)服務(wù)對(duì)象來(lái)暴露 Deployment:
  8. kubectl expose deployment hello-world --type=NodePort --name=example-service
    
  9. 展示 Service 信息:
  10. kubectl describe services example-service
    

    輸出類(lèi)似于:

    Name:                   example-service
    Namespace:              default
    Labels:                 run=load-balancer-example
    Annotations:            <none>
    Selector:               run=load-balancer-example
    Type:                   NodePort
    IP:                     10.32.0.16
    Port:                   <unset> 8080/TCP
    TargetPort:             8080/TCP
    NodePort:               <unset> 31496/TCP
    Endpoints:              10.200.1.4:8080,10.200.2.5:8080
    Session Affinity:       None
    Events:                 <none>

    注意服務(wù)中的 NodePort 值。例如在上面的輸出中,NodePort 是 31496。

  11. 列出運(yùn)行 Hello World 應(yīng)用的 Pod:
  12. kubectl get pods --selector="run=load-balancer-example" --output=wide
    

    輸出類(lèi)似于:

    NAME                           READY   STATUS    ...  IP           NODE
    hello-world-2895499144-bsbk5   1/1     Running   ...  10.200.1.4   worker1
    hello-world-2895499144-m1pwt   1/1     Running   ...  10.200.2.5   worker2
  13. 獲取運(yùn)行 Hello World 的 pod 的其中一個(gè)節(jié)點(diǎn)的公共 IP 地址。如何獲得此地址取決于你設(shè)置集群的方式。 例如,如果你使用的是 Minikube,則可以通過(guò)運(yùn)行 ?kubectl cluster-info? 來(lái)查看節(jié)點(diǎn)地址。 如果你使用的是 Google Compute Engine 實(shí)例,則可以使用 ?gcloud compute instances list? 命令查看節(jié)點(diǎn)的公共地址。
  14. 在你選擇的節(jié)點(diǎn)上,創(chuàng)建一個(gè)防火墻規(guī)則以開(kāi)放節(jié)點(diǎn)端口上的 TCP 流量。 例如,如果你的服務(wù)的 NodePort 值為 31568,請(qǐng)創(chuàng)建一個(gè)防火墻規(guī)則以允許 31568 端口上的 TCP 流量。 不同的云提供商提供了不同方法來(lái)配置防火墻規(guī)則。
  15. 使用節(jié)點(diǎn)地址和 node port 來(lái)訪問(wèn) Hello World 應(yīng)用:
  16. curl http://<public-node-ip>:<node-port>
    

    這里的 ?<public-node-ip>? 是你節(jié)點(diǎn)的公共 IP 地址,?<node-port>? 是你服務(wù)的 NodePort 值。 對(duì)于請(qǐng)求成功的響應(yīng)是一個(gè) hello 消息:

    Hello Kubernetes!
    

使用服務(wù)配置文件 

作為 ?kubectl expose? 的替代方法,你可以使用 服務(wù)配置文件 來(lái)創(chuàng)建服務(wù)。

清理現(xiàn)場(chǎng)

想要?jiǎng)h除服務(wù),輸入以下命令:

kubectl delete services example-service

想要?jiǎng)h除運(yùn)行 Hello World 應(yīng)用的 Deployment、ReplicaSet 和 Pod,輸入以下命令:

kubectl delete deployment hello-world


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)