新聞中心
運行一個單實例有狀態(tài)應(yīng)用
本文介紹在 Kubernetes 中如何使用 PersistentVolume 和 Deployment 運行一個單實例有狀態(tài)應(yīng)用。該應(yīng)用是 MySQL.

創(chuàng)新互聯(lián)公司不只是一家網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司;我們對營銷、技術(shù)、服務(wù)都有自己獨特見解,公司采取“創(chuàng)意+綜合+營銷”一體化的方式為您提供更專業(yè)的服務(wù)!我們經(jīng)歷的每一步也許不一定是最完美的,但每一步都有值得深思的意義。我們珍視每一份信任,關(guān)注我們的做網(wǎng)站、成都網(wǎng)站設(shè)計質(zhì)量和服務(wù)品質(zhì),在得到用戶滿意的同時,也能得到同行業(yè)的專業(yè)認(rèn)可,能夠為行業(yè)創(chuàng)新發(fā)展助力。未來將繼續(xù)專注于技術(shù)創(chuàng)新,服務(wù)升級,滿足企業(yè)一站式全網(wǎng)營銷推廣需求,讓再小的品牌網(wǎng)站制作也能產(chǎn)生價值!
教程目標(biāo)
- 在你的環(huán)境中創(chuàng)建一個引用磁盤的 PersistentVolume
- 創(chuàng)建一個 MySQL Deployment.
- 在集群內(nèi)以一個已知的 DNS 名稱將 MySQL 暴露給其他 Pod
在開始之前
- 你必須擁有一個 Kubernetes 的集群,同時你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個節(jié)點的集群上運行本教程,且這些節(jié)點不作為控制平面主機。 如果你還沒有集群,你可以通過 Minikube 構(gòu)建一個你自己的集群,或者你可以使用下面任意一個 Kubernetes 工具構(gòu)建:
- Katacoda
- 玩轉(zhuǎn) Kubernetes
- 你需要有一個帶有默認(rèn) ?
StorageClass?的 動態(tài) ?PersistentVolume?供應(yīng)程序, 或者自己靜態(tài)的提供 ?PersistentVolume?來滿足這里使用的 ?PersistentVolumeClaim?。
要獲知版本信息,請輸入 ?kubectl version?。
部署 MySQL
你可以通過創(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
- 部署 YAML 文件中定義的 PV 和 PVC:
- 部署 YAML 文件中定義的 Deployment:
kubectl apply -f https://k8s.io/examples/application/mysql/mysql-deployment.yaml - 展示 Deployment 相關(guān)信息:
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: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 - 列舉出 Deployment 創(chuàng)建的 pods:
kubectl get pods -l app=mysql輸出類似于:
NAME READY STATUS RESTARTS AGE mysql-63082529-2z3ki 1/1 Running 0 3m - 查看 PersistentVolumeClaim:
kubectl describe pvc mysql-pv-claim輸出類似于:
Name: mysql-pv-claim Namespace: default StorageClass: Status: Bound Volume: mysql-pv-volume Labels:Annotations: pv.kubernetes.io/bind-completed=yes pv.kubernetes.io/bound-by-controller=yes Capacity: 20Gi Access Modes: RWO Events:
kubectl apply -f https://K8S.io/examples/application/mysql/mysql-pv.yaml
訪問 MySQL 實例
前面 YAML 文件中創(chuàng)建了一個允許集群內(nèi)其他 Pod 訪問的數(shù)據(jù)庫服務(wù)。該服務(wù)中選項 ?clusterIP: None? 讓服務(wù) DNS 名稱直接解析為 Pod 的 IP 地址。 當(dāng)在一個服務(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)用的一些注意事項:
- 不要對應(yīng)用進行規(guī)模擴縮。這里的設(shè)置僅適用于單實例應(yīng)用。下層的 PersistentVolume 僅只能掛載到一個 Pod 上。
- 在 Deployment 的 YAML 文件中使用 ?
strategy:? ?type: Recreate?。 該選項指示 Kubernetes 不 使用滾動升級。滾動升級無法工作,因為這里一次不能 運行多個 Pod。在使用更新的配置文件創(chuàng)建新的 Pod 前,?Recreate?策略將 保證先停止第一個 Pod。
刪除 Deployment
通過名稱刪除部署的對象:
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 被刪除時自動回收下層資源。
當(dāng)前題目:創(chuàng)新互聯(lián)kubernetes教程:Kubernetes運行一個單實例有狀態(tài)應(yīng)用
標(biāo)題鏈接:http://fisionsoft.com.cn/article/cdoodcp.html


咨詢
建站咨詢
