京東雲Kubernetes叢集最佳實踐

京東科技開發者發表於2019-03-25

容器是Cloud Native的基石,它們之間的關係不言而喻。瞭解容器對於學習Cloud Native也是十分重要的。 近期,京東雲Cloud Native的“ 線上公開課 ”從理論和實踐兩個層面為大家分享了Cloud Native相關的技術知識。在本週的週日,我們還將迎來” Cloud Native時代的應用之路與開源創新“專場技術沙龍。

因此我們今天的文章將會和大家分享關於京東雲Kubernetes叢集的部分最佳實踐。感興趣的小夥伴也可以跟著文件自己動手進行建立。



京東雲Kubernetes叢集採用管理節點全託管的方式,為使用者提供簡單易用、高可靠、功能強大的容器管理服務。該產品完全相容標準Kubernetes API ,整合京東雲網路、儲存等外掛。Kubernetes叢集服務簡化了Kubernetes部署、管理,降低了Kubernetes使用門檻,增強應用的可靠性,提升開發的效率,同時,也能更好地幫助使用者減少資源投入的成本。





最佳實踐——部署應用




1

部署持久化儲存


京東雲Kubernetes叢集服務整合了京東云云硬碟,您可以在叢集中使用京東云云硬碟作為持久化儲存;


使用京東云云盤定義靜態儲存


1.  建立PV

kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv-static
  labels:
    type: jdcloud-ebs
spec:
  capacity:
    storage: 30Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  jdcloudElasticBlockStore:
    volumeID: vol-ogcbkdjg7x
    fsType: xfs


引數說明:

1、如您需要在京東雲Kubernetes叢集服務中使用京東云云硬碟作為持久化儲存,請在PersistentVolume定義時,指定外掛jdcloudElasticBlockStore;

2、VolumeID:指定同地域下為Kubernetes叢集服務提供持久化儲存的雲硬碟ID;

3、Fstype:指定檔案系統型別;目前僅支援ext4和xfs兩種;

4、Capacity:PV 將具有特定的儲存容量。這是使用 PV 的容量屬性設定的;

5、PersistentVolume 可以以資源提供者支援的任何方式掛載到主機上。

京東云云硬碟目前只支援一種模式ReadWriteOnce——該卷可以被單個節點以讀/寫模式掛載;

訪問模式包括:
ReadWriteOnce——該卷可以被單個節點以讀/寫模式掛載

在命令列中,訪問模式縮寫為:
RWO - ReadWriteOnce
京東云為PersistentVolume提供了外掛,外掛型別為:jdcloudElasticBlockStore

注:
- 由於雲硬碟限制一個雲硬碟只能同時掛載一個雲主機,在使用基於PVC的Pod時,建議使用replicas=1來建立一個部署集。StatefulSet可解決多副本問題。

- Pod遷移,PVC遷移(解除安裝舊例項/掛載新例項)預設35秒。

- 透過Deployment部署,刪除Deployment之後,可重新掛載原有PVC到新的Pod裡面。


2.  建立PVC

宣告可以指定一個標籤選擇器來進一步過濾該組卷。只有標籤與選擇器匹配的卷可以繫結到宣告。選擇器由兩個欄位組成:

所有來自 MatchLabels 和 MatchExpressions 的要求都被“與”在一起——它們必須全部滿足才能匹配。

本例使用MatchLabels作為過濾條件,將匹配的PersistentVolume繫結到Persistent Volume Claim。

M atchLabels:Volume 必須有具有該值的標籤

matchExpressions:這是一個要求列表,透過指定關鍵字,值列表以及與關鍵字和值相關的運算子組成。有效的運算子包括 In、NotIn、Exists 和 DoesNotExist。

訪問模式包括:ReadWriteOnce——該卷可以被單個節點以讀/寫模式掛載。

在命令列中,訪問模式縮寫為:RWO - ReadWriteOnce

京東云為Persistent Volume提供了外掛,外掛型別為:jdcloudElasticBlockStore

注:副本數只能指定1。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-static-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName:  ""
  resources:
    requests:
      storage: 30Gi
  selector:
    matchLabels:
      type: jdcloud-ebs



3.  建立Pod

kind: Pod

apiVersion: v1
metadata:
  name: pod- static
spec:
  volumes:
    - name: pv- static
      persistentVolumeClaim:
        claimName: pv- static-pvc
  containers:
    - name: busybox- static
      image: busybox
      command:
         - sleep
         -  "600"
      imagePullPolicy: Always
      volumeMounts:
        - mountPath:  "/usr/share/mybusybox/"
          name: pv- static




使用京東云云盤定義動態儲存


當叢集中的靜態 PV 都不匹配新建的 Persistent Volume Claim 時,叢集可能會嘗試動態地為 PVC 建立卷。

關於京東云云硬碟規格:


建立PVC


apiVersion: v1

kind: PersistentVolumeClaim
metadata:
  name: pvc1
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: jdcloud-ssd
  resources:
    requests:
      storage: 20Gi


檢視叢集的PVC

kubectl get pvc


輸出

NAME                                         STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE

pvc1                                         Bound     pvc -73d8538b-ebd6 -11e8-a857-fa163eeab14b    20Gi       RWO            jdcloud-ssd     18s


  檢視叢集的PV

kubectl 
get pv

  

  輸出

NAME                                       
CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    
CLAIM                                                STORAGECLASS   REASON    AGE

pvc -73d8538b-ebd6 -11e8-a857-fa163eeab14b    20Gi       RWO            Delete           Bound      default/pvc1                                         jdcloud-ssd               2m


基於Storage Class jdcloud-ssd,為PVC建立了卷。一旦 PV 和 PVC 繫結後,Persistent Volume Claim 繫結是排他性的,不管它們是如何繫結的。 PVC 跟 PV 繫結是一對一的對映。




2

部署Service


Kubernetes Service

- Kubernetes Service定義了這樣一種抽象:一個 Pod 的邏輯分組,一種可以訪問它們的策略-通常稱為微服務。這一組 Pod 能夠被 Service 訪問到,通常是透過 Label Selector(檢視下面瞭解,為什麼可能需要沒有 Selector 的 Service)實現的。一個 Service 在 Kubernetes 中是一個REST物件,和Pod類似.像所有的 REST 物件一樣, Service 定義可以基於 POST 方式,請求 API Server 建立新的例項。


京東雲Kubernetes整合負載均衡服務,支援建立Load Balance型別的Service,為應用提供安全、可靠的網路。

- 建立的負載均衡會佔用本地域的負載均衡配額,需要保證有足夠配額。

1、建立支援Load Balance型別的Service,命名為myservice.yaml檔案定義如下:


kind: Service

apiVersion: v1
metadata:
  name: servicetest
  labels:
    run: myapp
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30062
  type: LoadBalancer
  selector:
     run: myapp

2、執行Kubectl建立命令,建立一個Service;其中使用相應的YAML檔名稱替換:

kubectl create -f myservice.yaml

3、建立一組Nginx Pod,mynginx.yaml檔案定義如下:


apiVersion: apps/v1beta1

kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: myapp
  replicas: 2
  template:
    metadata:
      labels:
        run: myapp
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:

        - containerPort: 80

4、執行Kubectl建立命令,建立一個Deployment;其中使用相應的YAML檔名稱替換

kubectl create -f mynginx.yaml

5、 檢視已建立成功的Deployment,執行以下命令:

kubectl  get pods -l run=myapp -o wide

 返回結果如下:


NAME       DESIRED   CURRENT   UP-
TO-DATE   AVAILABLE   AGE

my-nginx    2          2          2             2            4m

6、檢視相應的Pod執行狀態,

kubectl 
get pods -l run=myapp -o wide

返回結果如下:


NAME                        READY     STATUS    RESTARTS   AGE       IP            NODE

my-nginx-864b5bfdc7- 6297s    1/ 1       Running               23m        172.16.0.10   k8s-node-vmtwjb-0vy9nuo0ym
my-nginx-864b5bfdc7-lr7gq    1/ 1       Running               23m        172.16.0.42   k8s-node-vm25q1-0vy9nuo0ym
7、檢視service

7、檢視Service詳情:


kubectl describe service servicetest

可以檢視繫結到Service的Endpoints:


Name:                     servicetest

Namespace:                default
Labels:                   run=myapp
Annotations:              <none>
Selector:                 run=myapp
Type:                     LoadBalancer
IP:                       172.16.61.58
LoadBalancer Ingress:     114.67.227.25
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30062/TCP
Endpoints:                172.16.0.10:80,172.16.0.42:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type     Reason                      Age                From                Message
  ----     ------                      ----               ----                -------
  Normal   EnsuringLoadBalancer        11m (x9 over 26m)  service-controller  Ensuring load balancer
  Normal   EnsuredLoadBalancer         10m                service-controller  Ensured load balancer

注:Load Balancer Ingress:114.67.227.25為外部公網IP

8、執行如下命令查詢繫結到service的enpoints列表:

kubectl 
get ep servicetest

返回


NAME          
ENDPOINTS                       
AGE

servicetest   172 .16.0.10 :80,172 .16.0.42 :80   28 m

9、在瀏覽器中輸入與Service關聯的Load Balance公網IP及埠,看到如下頁面,即表明Nginx服務正常。

京東雲Kubernetes叢集最佳實踐

歡迎點選“ 京東雲 ”瞭解更多精彩內容


·END·


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69912185/viewspace-2639309/,如需轉載,請註明出處,否則將追究法律責任。

相關文章