kubernetes
里2
个概念:
PersistentVolume
(持久卷) 和 PersistentVolumeClaim
(持久卷申请)。
PersistentVolume(PV)
是集群之中的一块网络存储。跟Node
一样,也是集群的资源。PV
跟Volume
类似,不过会有独立于Pod
的生命周期。这一API
对象包含了存储的实现细节,例如NFS
、iSCSI
或者其他的云提供商的存储系统。PersistentVolumeClaim (PVC)
是用户的一个请求。他跟Pod
类似。Pod
消费Node
的资源,PVC
消费PV
的资源。Pod
能够申请特定的资源(CPU
和 内存);Claim
能够请求特定的尺寸和访问模式(例如可以加载一个读写,以及多个只读实例)
部署mysql
PVC
申请20G
的资源
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-mysql
labels:
app: my-mysql
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
storageClassName: rbd
deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-mysql
labels:
app: my-mysql
spec:
selector:
matchLabels:
app: my-mysql
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: my-mysql
spec:
containers:
- image: mysql:5.6
name: my-mysql
args:
- "--ignore-db-dir=lost+found"
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
key: mysql-root-password
name: my-mysql
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
key: mysql-password
name: my-mysql
- name: MYSQL_USER
value: user_xxx
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: my-mysql
需要注意args
这个配置,如果不加这个参数,mysql
会初始化失败,github
的某个issues
里发现这个方法可以解决。
mysql-persistent-storage
指定了pvc
;MYSQL_PASSWORD
,MYSQL_ROOT_PASSWORD
来自名为my-mysql
的secret
;
secret
apiVersion: v1
kind: Secret
metadata:
name: my-mysql
type: Opaque
data:
mysql-root-password: xxx
mysql-password: xxx
data
里的配置密码都需要经过base64
。
service
apiVersion: v1
kind: Service
metadata:
name: my-mysql
labels:
app: my-mysql
spec:
type: NodePort
ports:
- port: 3306
selector:
app: my-mysql
- 这里
type
设置为NodePort
,你可以使用k8s
集群的任何一个node ip
连接mysql
。对应的端口需要看一下service
映射的端口。 - 使用
1
里的ip:port
,就可以使用mysql workbench
连上数据库。