京東雲Kubernetes集羣最佳實踐

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

所以咱們今天的文章將會和你們分享關於京東雲Kubernetes集羣的部分最佳實踐。感興趣的小夥伴也能夠跟着文檔本身動手進行建立。nginx

京東雲Kubernetes集羣採用管理節點全託管的方式,爲用戶提供簡單易用、高可靠、功能強大的容器管理服務。該產品徹底兼容標準Kubernetes API ,集成京東雲網絡、存儲等插件。Kubernetes集羣服務簡化了Kubernetes部署、管理,下降了Kubernetes使用門檻,加強應用的可靠性,提高開發的效率,同時,也能更好地幫助用戶減小資源投入的成本。api

最佳實踐——部署應用瀏覽器


部署持久化存儲

京東雲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
複製代碼

參數說明:app

一、如您須要在京東雲Kubernetes集羣服務中使用京東云云硬盤做爲持久化存儲,請在PersistentVolume定義時,指定插件jdcloudElasticBlockStore;負載均衡

二、VolumeID:指定同地域下爲Kubernetes集羣服務提供持久化存儲的雲硬盤ID;ide

三、Fstype:指定文件系統類型;目前僅支持ext4和xfs兩種;微服務

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

五、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。

MatchLabels: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
複製代碼
  1. 建立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,爲應用提供安全、可靠的網絡。

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

一、建立支持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
複製代碼

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

kubectl create -f myservice.yaml
複製代碼

三、建立一組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
複製代碼

四、執行Kubectl建立命令,建立一個Deployment;其中使用相應的YAML文件名稱替換 kubectl create -f mynginx.yaml

五、查看已建立成功的Deployment,執行如下命令:

kubectl get pods -l run=myapp -o wide
複製代碼

返回結果以下:

NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
my-nginx   2         2         2            2           4m
複製代碼

六、查看相應的Pod運行狀態,

kubectl get pods -l run=myapp -o wide
複製代碼

返回結果以下:

NAME                        READY     STATUS    RESTARTS   AGE       IP            NODE
my-nginx-864b5bfdc7-6297s   1/1       Running   0          23m       172.16.0.10   k8s-node-vmtwjb-0vy9nuo0ym
my-nginx-864b5bfdc7-lr7gq   1/1       Running   0          23m       172.16.0.42   k8s-node-vm25q1-0vy9nuo0ym
複製代碼

七、查看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

八、執行以下命令查詢綁定到service的enpoints列表:

kubectl get ep servicetest
返回

NAME          ENDPOINTS                       AGE
servicetest   172.16.0.10:80,172.16.0.42:80   28m
複製代碼

九、在瀏覽器中輸入與Service關聯的Load Balance公網IP及端口,看到以下頁面,即代表Nginx服務正常。

歡迎點擊「連接」瞭解京東雲更多精彩內容

·END·

相關文章
相關標籤/搜索