本章节展示了如何使用PersistentVolume和Deployment部署一个有状态的Mysql服务。
在环境里面启动一块磁盘
可以给应用程序使用任何有状态的存储卷。参考Types of Persistent Volumes查看支持的磁盘环境列表。如果是Google Compute Engine运行:
gcloud compute disks create --size=20GB mysql-disk
下一步创建一个PersistentVolume指向刚刚创建的mysql-disk磁盘。下面是创建PersistentVolume的配置文件:
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
gcePersistentDisk:
pdName: mysql-disk
fsType: ext4
注意:pdName:mysql-disk这一行匹配的是计算机环境磁盘的名称。写其他环境的PersistentVolume配置文件可以参考Persistent Volumes。
创建一个存储卷:
kubectl create -f gce-volume.yaml
部署Mysql
可以使用Deployment部署一个有状态的服务,并且可以使用PersistentVolumeClaim链接已经存在的PersistentVolume。例如,例如这个配置文件描述了运行了Mysql的Deployment并引用PersistentVolumeClaim。这个文件定义了一个卷挂载到了/var/lib/mysql,然后创建了一个PersistentVolumeClaim查找20G的卷。
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: mysql
spec:
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
1.部署YAML文件
kubectl create -f mysql.yaml
2.显示Deployment的详细信息
kubectl describe deployment mysql
Name: mysql
Namespace: default
CreationTimestamp: Tue, 01 Nov 2016 11:18:45 -0700
Labels: app=mysql
Selector: app=mysql
Replicas: 1 updated | 1 total | 0 available | 1 unavailable
StrategyType: Recreate
MinReadySeconds: 0
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
3.查看创建的Deployment列表
kubectl get pods -l app=mysql
NAME READY STATUS RESTARTS AGE
mysql-63082529-2z3ki 1/1 Running 0 3m
4.检查Persistent Volume
kubectl describe pv mysql-pv
Name: mysql-pv
Labels: <none>
Status: Bound
Claim: default/mysql-pv-claim
Reclaim Policy: Retain
Access Modes: RWO
Capacity: 20Gi
Message:
Source:
Type: GCEPersistentDisk (a Persistent Disk resource in Google Compute Engine)
PDName: mysql-disk
FSType: ext4
Partition: 0
ReadOnly: false
No events.
5.检查PersistentVolumeClaim:
kubectl describe pvc mysql-pv-claim
Name: mysql-pv-claim
Namespace: default
Status: Bound
Volume: mysql-pv
Labels: <none>
Capacity: 20Gi
Access Modes: RWO
No events.
访问Mysql进程
在之前的YAML文件创建了一个Service允许集群里面别的Pod访问数据库。Service配置项clusterIP: None 让服务的DNS名字直接解析为Pod的地址。当你在服务后面只有一个Pod并不打算增加Pod的数量,这是最佳的选择。
运行Mysql Client连接服务:
kubectl run -it --rm --image=mysql:5.6 mysql-client -- mysql -h <pod-ip> -ppassword
这个命令在集群里面创建了一个运行mysql client的Pod,并且通过Service连接到Mysql后端服务。如果已经连接,就证明Mysql有状态服务已经起来并成功运行。
更新
可以使用kubectl apply命令更新Deployment的镜像或其他选项。一下是针对有状态应用的一些注意事项:
- 不要扩缩应用。此设置只适用于单实例的应用。基础的PersistentVolume只能挂载到一个Pod。
- 在Deployment的YAML配置文件里面使用strategy: type: Recreate。这是让Kubernetes不适用滚动更新。滚动更新不工作在同一时间同时运行的Pod不能大于一个。Recreate策略如果更新配置文件创建了一个新的pod将杀掉之前的pod。
网友评论