溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何進行Kubernetes服務(wù)類型的淺析

發(fā)布時間:2021-12-18 18:18:35 來源:億速云 閱讀:139 作者:柒染 欄目:云計算

這篇文章將為大家詳細講解有關(guān)如何進行Kubernetes服務(wù)類型的淺析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

如何進行Kubernetes服務(wù)類型的淺析

在Kubernetes中,服務(wù)總是能使其網(wǎng)絡(luò)訪問到一個或一組Pod上。服務(wù)將會根據(jù)標簽選擇Pod并且當對這些服務(wù)建立網(wǎng)絡(luò)時,它會選擇集群中所有與服務(wù)的selector相匹配的Pod,并選擇其中的一個,然后將網(wǎng)絡(luò)請求轉(zhuǎn)發(fā)給它。

如何進行Kubernetes服務(wù)類型的淺析

Kubernetes 服務(wù)vs Deployment

在K8S中我們應(yīng)該如何區(qū)分Deployment和服務(wù)呢?

  • Deployment主要負責讓一組pod在集群中保持運行

  • 服務(wù)主要負責在集群中啟用對一組pod的網(wǎng)絡(luò)訪問

我們可以使用deployment而不使用服務(wù),所以我們可以保持幾個相同的Pod在K8S集群中運行。此外,Deployment的規(guī)??梢詳U大和縮小,pod也可以復制。在Kubernetes中,單個pod可以直接通過網(wǎng)絡(luò)請求單獨訪問,因此要跟蹤pod會有些困難。

我們也可以使用一個服務(wù)類型而不需要deployment。如果我們這樣做,將創(chuàng)建一個單一的pod,而不是像我們在deployment中那樣一起創(chuàng)建所有pod。不過,我們還有另一種替代方案,即我們的服務(wù)能夠根據(jù)分配給它們的標簽進行選擇,從而將網(wǎng)絡(luò)請求路由到這些Pod。

我們?nèi)绾伟l(fā)現(xiàn)Kubernetes服務(wù)呢?

在Kubernetes中,有兩種方式可以發(fā)現(xiàn)服務(wù):

  • DNS類型。DNS server被添加到集群中,以便觀察Kubernetes API為每個新服務(wù)創(chuàng)建DNS record set。當整個集群啟用DNS后,所有的Pod都應(yīng)該能夠自動進行服務(wù)名稱解析。

  • ENV變量。在這一發(fā)現(xiàn)方法中,一個pod運行在一個節(jié)點上,所以 kubelet為每個active服務(wù)添加環(huán)境變量。

ClusterIP、NodePort和LoadBalancer是什么?

服務(wù)規(guī)范中的類型屬性決定了服務(wù)如何暴露在網(wǎng)絡(luò)中。比如,ClusterIP、NodePort和LoadBalancer。

  • ClusterIP—默認值。該服務(wù)只能從Kubernetes集群內(nèi)訪問。

  • NodePort—這使得服務(wù)可以通過集群中每個節(jié)點上的靜態(tài)端口訪問。

  • LoadBalancer—服務(wù)通過云提供商的負載均衡器功能可以從外部訪問。阿里云、AWS、Azure都提供了這一功能。

如何創(chuàng)建一個服務(wù)

通過deployment kind的幫助,以“Hello World” App形式的簡單示例將會幫助你更好地理解如何創(chuàng)建服務(wù)。

我們的操作流程是,當我們看到應(yīng)用程序已經(jīng)部署完成并且以up狀態(tài)運行的時候,我們將創(chuàng)建服務(wù)(Cluster IP)來訪問Kubernetes中的應(yīng)用程序。

現(xiàn)在,讓我們創(chuàng)建一個正在運行的deployment

“kubectl run hello-world –replicas=3 –labels=”run=load-balancer-example” –image=gcr.io/google-samples/node-hello:1.0 –port=8080”.

這里,這個命令在Kubernetes中創(chuàng)建了一個有兩個應(yīng)用程序副本的deployment。

接下來,

run "kubectl get deployment hello-world" so see that the deployment is running.
Now we can check the replicaset and pods that the deployment created.
$ kubectl get deployments hello-world
NAME          DESIRED   CURRENT   UP-TO-DATE   AVAILABLE       AGE
hello-world    3          3            3        3              76s

應(yīng)用程序現(xiàn)在正在運行,如果你想要訪問新創(chuàng)建的應(yīng)用程序,我們需要創(chuàng)建ClusterIP類型的服務(wù):

  • 為服務(wù)創(chuàng)建一個YAML manifest并應(yīng)用它,或

  • 使用kubectl expose命令,這是一個更為簡單的選項。因為這一命令可以無需創(chuàng)建YAML文件即可創(chuàng)建一個服務(wù)。

$ kubectl expose deployment hello-world --type=ClusterIP --name=example-service
service "example-service" exposed

在這里,我們將創(chuàng)建一個名為example-service的服務(wù),類型為ClusterIP。

那么,現(xiàn)在我們將訪問我們的應(yīng)用程序:

run “kubectl get service example-service” to get our port number.

然后,我們需要執(zhí)行port-forward命令。因為我們的服務(wù)類型是ClusterIP,所以只能在集群內(nèi)訪問,因此我們必須通過轉(zhuǎn)發(fā)端口到集群中的本地端口才能訪問我們的應(yīng)用程序。

我們可以使用其他類型,如LoadBalancer,這將在AWS或GCP中創(chuàng)建一個LB,然后我們可以使用給LB的DNS地址和我們端口號來訪問應(yīng)用程序。

$ kubectl get service example-service

NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
example-service   ClusterIP   100.20.167.76   <none>        8080/TCP   1h

$ kubectl port-forward service/example-service 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080

現(xiàn)在我們可以從工作站瀏覽http://localhost:8080,并且我們應(yīng)該會看到:

Hello Kubernetes!

Kubernetes 服務(wù) NodePort YAML示例

此示例YAML創(chuàng)建了可用于外部網(wǎng)絡(luò)請求的服務(wù)。在這里,我們提到了帶Value的NodePort,因此服務(wù)被映射到集群中每個節(jié)點上的端口。

如何進行Kubernetes服務(wù)類型的淺析

下面是一個yaml的例子,它將展示我們?nèi)绾卧贙ubernetes中使用NodePort服務(wù)類型。

kind: Service 
apiVersion: v1 
metadata:
  name: hostname-service 
spec:
  # Expose the service on a static port on each node
  # so that we can access the service from outside the cluster 
  type: NodePort
# When the node receives a request on the static port (30163)
  # "select pods with the label 'app' set to 'echo-hostname'"
  # and forward the request to one of them
  selector:
    app: echo-hostname
ports:
    # Three types of ports for a service
    # nodePort - a static port assigned on each the node
    # port - port exposed internally in the cluster
    # targetPort - the container port to send requests to
    - nodePort: 30163
      port: 8080 
      targetPort: 80

關(guān)于如何進行Kubernetes服務(wù)類型的淺析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI