1. 程式人生 > >kubernetes1 4 基礎篇 Learn Kubernetes 1 4 by 6 steps(5) Step 4

kubernetes1 4 基礎篇 Learn Kubernetes 1 4 by 6 steps(5) Step 4

們的 scribe 鍵值對 rip 畫面 利用 演示 多項目 就是

在上一篇文章中我們了解了如何在kubectl get/describe等確認進一步的信息以進行故障排除等,本文我們將圍繞kubernetes中的lable和service兩個概念展開。

Kubernetes Services

Pod在整個集群中有他們自己的惟一IP,但是這些IP是不對Kubernetes外部暴露的,換句話說,外部是無法直接訪問它們的.
而且我們還需要考慮在使用的過程中,這些pod有可能會發生很多變化,被停止,被刪除,被其他pod替換等,比如被刪除之後IP就不存在了,如何訪問呢?加之總體的pod的量可能會非常之大,因此我們需要一種方式讓pod和應用能夠自動的發現彼此.

Kubernetes使用service的概念將pod分組,service是一個邏輯上的抽象層,然後在此基礎上進行對外提供訪問的接口同時使得負載均衡和服務發現變得可能.

Kubernetes支持如下LoadBalancer和NodePort兩種方式對外提供服務訪問

類型說明
LoadBalancer 此種應用場景一般在於當部署kubernetes到雲上得時候為最多。一般雲服務商會提供外接的負載均衡器(LoadBalancer), 這種方式需要指定一個公共的IP地址。
NodePort 在所有的node上使用相同的port暴露服務,最為直接的可以理解的結果是使用任何一個Node的IP加此Port的URL即可訪問

理解了這些之後,我們再來重新審視一下service在kubernetes中的使用方式. 如下圖所示我們有Service A和Service B兩個服務. Service A由一個pod組成,而Service B由3個port分別在兩個node上所組成,每個pod都有集群內部所提供的唯一IP,但是對外則通過Service層所提供的對外接口的IP. 在前面講過的Deployment和Service的關系在此也可以看得更加清楚,Service A和Deployment A之間實現互關聯的,在使用yaml文件創建kubernetes的Deployment時候為什麽同時也創建了一個service,就是希望能夠訪問dashboard而已。現在再看一下kubernetes-dashboard.yaml的內容你會發現其實那裏面就是kind: Deployment和kind: Service的定義而已,自然會兩個都創建。

技術分享圖片

service職責

負載均衡

Service是一組pod在邏輯意義上所組成的抽象層,它能夠在這一層上進行整體的協調,負載均衡是其中的一個作用。在service由多個pod組成的時候這個功能變得非常有用。

服務發現

service同時也負責在整個集群之內的服務發現,後面我們會進一步展開相關內容。

Lable

Service在kubernetes中扮演的這樣重要的一個角色,Service是一組pod在邏輯意義上所組成的抽象層,它是如何將pod進行分組的,答案就是Lable。

Label是key/value的可以設定到pod上的鍵值對,使用Lable對pod進行分組,而Service使用Lable Selector對其所用到的lable進行選擇,這樣就將pod進行了分組和設定。
使用lable可以使得這些pod邏輯意義上的組合更具實際意義,更加可讀,比如:

  • 環境:production, test, dev
  • 版本:beta, v1.3
  • service/server類型:frontend, backend, database

下面這張圖則非常清晰地描述了Lable是在service中盡職盡責的。

技術分享圖片

sonarqube是在很多項目中都會用到的一個可以完成代碼審查等功能的開源平臺,lable和service在kubernetes中是如何使用的,接下來我們將會利用kubectl來演示一下如何將sonarqube導入進去。

事前確認

沒有任何sonar相關的deployment和service以及pod在運行

[root@host31 ~]# kubectl get pods
[root@host31 ~]# kubectl get deployments
[root@host31 ~]# kubectl get services
NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   10.0.0.1     <none>        443/TCP   11h
[root@host31 ~]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

創建一個Deployment

註意label在此處的使用,–lables指定要設定到其上的Label為app=sonarqube

[root@host31 ~]# kubectl run sonar --replicas=2 --labels="app=sonarqube" --image=docker.io/sonarqube  --port=9000
deployment "sonar" created
[root@host31 ~]#
  • 1
  • 2
  • 3

創建後確認,此時生成了pod和deployment,但是還沒有生成service

[root@host31 ~]# kubectl get pods
NAME                     READY     STATUS              RESTARTS   AGE
sonar-2095694103-eqyxe   1/1       Running             0          7s
sonar-2095694103-htvml   0/1       ContainerCreating   0          7s
[root@host31 ~]# kubectl get deployments
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
sonar     2         2         2            2           14s
[root@host31 ~]# kubectl get services
NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   10.0.0.1     <none>        443/TCP   11h
[root@host31 ~]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

生成service

[root@host31 ~]# kubectl expose deployment/sonar --type="NodePort" --port 9000
service "sonar" exposed
[root@host31 ~]#
  • 1
  • 2
  • 3

生成後確認

[root@host31 ~]# kubectl get services
NAME         CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
kubernetes   10.0.0.1       <none>        443/TCP    11h
sonar        10.0.186.102   <nodes>       9000/TCP   16s
[root@host31 ~]#
[root@host31 ~]# kubectl describe services
Name:                   kubernetes
Namespace:              default
Labels:                 component=apiserver
                        provider=kubernetes
Selector:               <none>
Type:                   ClusterIP
IP:                     10.0.0.1
Port:                   https   443/TCP
Endpoints:              192.168.32.31:6443
Session Affinity:       ClientIP
No events.

Name:                   sonar
Namespace:              default
Labels:                 app=sonarqube
Selector:               app=sonarqube
Type:                   NodePort
IP:                     10.0.186.102
Port:                   <unset> 9000/TCP
NodePort:               <unset> 30097/TCP
Endpoints:              10.42.0.1:9000,10.44.0.1:9000
Session Affinity:       None
No events.[root@host31 ~]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

使用label確認

[root@host31 ~]# kubectl get pods -l app=sonarqube
NAME                     READY     STATUS    RESTARTS   AGE
sonar-2095694103-eqyxe   1/1       Running   0          3m
sonar-2095694103-htvml   1/1       Running   0          3m
[root@host31 ~]#
[root@host31 ~]#
[root@host31 ~]# kubectl get services -l app=sonarqube
NAME      CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
sonar     10.0.186.102   <nodes>       9000/TCP   3m
[root@host31 ~]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Sonarqube畫面

技術分享圖片

Dashboard確認

技術分享圖片

技術分享圖片

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

kubernetes1 4 基礎篇 Learn Kubernetes 1 4 by 6 steps(5) Step 4