容器是Cloud Native的基石,它們之間的關係不言而喻。瞭解容器對於學習Cloud Native也是十分重要的。近期,京東雲Cloud Native的「在線公開課」從理論和實踐兩個層面爲你們分享了Cloud Native相關的技術知識。在本週的週日,咱們還將迎來」Cloud Native時代的應用之路與開源創新「專場技術沙龍。node
所以咱們今天的文章將會和你們分享關於京東雲Kubernetes集羣的部分最佳實踐。感興趣的小夥伴也能夠跟着文檔本身動手進行建立。nginx
京東雲Kubernetes集羣採用管理節點全託管的方式,爲用戶提供簡單易用、高可靠、功能強大的容器管理服務。該產品徹底兼容標準Kubernetes API ,集成京東雲網絡、存儲等插件。Kubernetes集羣服務簡化了Kubernetes部署、管理,下降了Kubernetes使用門檻,加強應用的可靠性,提高開發的效率,同時,也能更好地幫助用戶減小資源投入的成本。api
最佳實踐——部署應用瀏覽器
京東雲Kubernetes集羣服務集成了京東云云硬盤,您能夠在集羣中使用京東云云硬盤做爲持久化存儲;安全
使用京東云云盤定義靜態存儲網絡
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裏面。
聲明能夠指定一個標籤選擇器來進一步過濾該組卷。只有標籤與選擇器匹配的卷能夠綁定到聲明。選擇器由兩個字段組成:
全部來自 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
複製代碼
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 綁定是一對一的映射。
Kubernetes Service
京東雲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·