文档说明
本文面向容器初学者,作者先简单的用MySQL官方镜像搭建一个可运行的单实例数据库,而后考虑生产或现实需求,一步一步完善并揉合K8S多个技术,从而构建一个复杂且可供生产用的MySQL单实例库。
简单部署
如下所示,我们仅需设置root用户密码(环境变量MYSQL_ROOT_PASSWORD), 便可轻松的使用MySQL官方镜像构建一个MySQL数据库。
# kubectl create -f - <
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: mysql
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql
name: mysql
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_ROOT_PASSWORD
value: Changeme
EOF
注意:若你的K8S集群是minishift、openshift、origin,因其为安全考虑,不允许容器以root用户运行,而官方MySQL镜像却需root权限,故为使其能顺利运行,我们需将anyuid scc赋予default serviceaccount:
# oc adm policy add-scc-to-user anyuid -z default
创建一Service以便集群内外均可访问数据库,其中集群外需通过nodePort设置的30006端口访问。
# kubectl create -f - <
apiVersion: v1
kind: Service
metadata:
labels:
app: mysql
name: mysql
spec:
type: NodePort
ports:
- port: 3306
nodePort: 30006
protocol: TCP
targetPort: 3306
selector:
app: mysql
EOF
接着,访问数据库并验证其运行正常:
# kubectl get pod # 当前Pod名称
NAME READY STATUS RESTARTS AGE
mysql-5b5668c448-t44ml 1/1 Running 0 3h
# 通过本机访问
# kubectl exec -it mysql-5b5668c448-t44ml -- mysql -uroot -pChangeme
mysql> select 1;
+---+
| 1 |
+---+
| 1 |
+---+
# 集群内部通过mysql service访问:
# kubectl exec -it mysql-5b5668c448-t44ml -- mysql -uroot -pChangeme -hmysql
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2018-05-21 07:19:14 |
+---------------------+
# 集群外部,可通过任何一个K8S节点访问数据库:
# mysql -uroot -pChangeme -horigin-lb-01 -P30006
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
扩展部署
持久化存储
若要确保MySQL重启后数据仍然存在,我们需为其配置可持久化存储,作者的实验环境配置了GlusterFS分布式存储,其支持K8S动态提供特性,故可执行如下命令创建PVC:
# kubectl create -f - <
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mysql
spec:
accessModes: