W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
本文介紹在 Kubernetes 中如何使用 PersistentVolume 和 Deployment 運行一個單實例有狀態(tài)應(yīng)用。該應(yīng)用是 MySQL.
要獲知版本信息,請輸入 ?kubectl version
?。
StorageClass
?的 動態(tài) ?PersistentVolume
?供應(yīng)程序, 或者自己靜態(tài)的提供 ?PersistentVolume
?來滿足這里使用的 ?PersistentVolumeClaim
?。你可以通過創(chuàng)建一個 Kubernetes Deployment 并使用 PersistentVolumeClaim 將其連接到 某已有的 PV 卷來運行一個有狀態(tài)的應(yīng)用。 例如,這里的 YAML 描述的是一個運行 MySQL 的 Deployment,其中引用了 PVC 申領(lǐng)。 文件為 /var/lib/mysql 定義了加載卷,并創(chuàng)建了一個 PVC 申領(lǐng),尋找一個 20G 大小的卷。 該申領(lǐng)可以通過現(xiàn)有的滿足需求的卷來滿足,也可以通過動態(tài)供應(yīng)卷的機制來滿足。
注意:在配置的 YAML 文件中定義密碼的做法是不安全的。
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
clusterIP: None
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
# Use secret in real usage
- name: MYSQL_ROOT_PASSWORD
value: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
kubectl apply -f https://k8s.io/examples/application/mysql/mysql-pv.yaml
kubectl apply -f https://k8s.io/examples/application/mysql/mysql-deployment.yaml
kubectl describe deployment mysql
輸出類似于:
Name: mysql
Namespace: default
CreationTimestamp: Tue, 01 Nov 2016 11:18:45 -0700
Labels: app=mysql
Annotations: deployment.kubernetes.io/revision=1
Selector: app=mysql
Replicas: 1 desired | 1 updated | 1 total | 0 available | 1 unavailable
StrategyType: Recreate
MinReadySeconds: 0
Pod Template:
Labels: app=mysql
Containers:
mysql:
Image: mysql:5.6
Port: 3306/TCP
Environment:
MYSQL_ROOT_PASSWORD: password
Mounts:
/var/lib/mysql from mysql-persistent-storage (rw)
Volumes:
mysql-persistent-storage:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: mysql-pv-claim
ReadOnly: false
Conditions:
Type Status Reason
---- ------ ------
Available False MinimumReplicasUnavailable
Progressing True ReplicaSetUpdated
OldReplicaSets: <none>
NewReplicaSet: mysql-63082529 (1/1 replicas created)
Events:
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
33s 33s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set mysql-63082529 to 1
kubectl get pods -l app=mysql
輸出類似于:
NAME READY STATUS RESTARTS AGE
mysql-63082529-2z3ki 1/1 Running 0 3m
kubectl describe pvc mysql-pv-claim
輸出類似于:
Name: mysql-pv-claim
Namespace: default
StorageClass:
Status: Bound
Volume: mysql-pv-volume
Labels: <none>
Annotations: pv.kubernetes.io/bind-completed=yes
pv.kubernetes.io/bound-by-controller=yes
Capacity: 20Gi
Access Modes: RWO
Events: <none>
前面 YAML 文件中創(chuàng)建了一個允許集群內(nèi)其他 Pod 訪問的數(shù)據(jù)庫服務(wù)。該服務(wù)中選項 ?clusterIP: None
? 讓服務(wù) DNS 名稱直接解析為 Pod 的 IP 地址。 當在一個服務(wù)下只有一個 Pod 并且不打算增加 Pod 的數(shù)量這是最好的.
運行 MySQL 客戶端以連接到服務(wù)器:
kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword
此命令在集群內(nèi)創(chuàng)建一個新的 Pod 并運行 MySQL 客戶端,并通過 Service 連接到服務(wù)器。 如果連接成功,你就知道有狀態(tài)的 MySQL 數(shù)據(jù)庫正處于運行狀態(tài)。
Waiting for pod default/mysql-client-274442439-zyp6i to be running, status is Pending, pod ready: false
If you don't see a command prompt, try pressing enter.
mysql>
Deployment 中鏡像或其他部分同往常一樣可以通過 ?kubectl apply
? 命令更新。 以下是特定于有狀態(tài)應(yīng)用的一些注意事項:
strategy:
? ?type: Recreate
?。 該選項指示 Kubernetes 不 使用滾動升級。滾動升級無法工作,因為這里一次不能 運行多個 Pod。在使用更新的配置文件創(chuàng)建新的 Pod 前,?Recreate
?策略將 保證先停止第一個 Pod。通過名稱刪除部署的對象:
kubectl delete deployment,svc mysql
kubectl delete pvc mysql-pv-claim
kubectl delete pv mysql-pv-volume
如果通過手動的方式供應(yīng) PersistentVolume, 那么也需要手動刪除它以釋放下層資源。 如果是用動態(tài)供應(yīng)方式創(chuàng)建的 PersistentVolume,在刪除 PersistentVolumeClaim 后 PersistentVolume 將被自動刪除。 一些存儲服務(wù)(比如 EBS 和 PD)也會在 PersistentVolume 被刪除時自動回收下層資源。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: