部署mariaDb
1、configmap
apiVersion: v1
kind: ConfigMap
metadata:
name: maria-cm
data:
DATABASE: 'db'
USER: 'wb'
PASSWORD: '1234'
ROOT_PASSWORD: '1234'
2、Maria-pod
apiVersion: v1
kind: Pod
metadata:
name: maria-pod
labels:
app: wordpress
role: database
spec:
containers:
- image: mariadb/server:10.3
name: maria
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
envFrom:
- prefix: 'MARIADB_'
configMapRef:
name: maria-cm
3、测试数据库
#拉取镜像 docker pull mariadb/server:10.3 kubectl exec maria-pod -it -- sh # mysql -uroot -p
这样的mariaDb是部署好了,但是如果这个pod挂掉,里面的数据也没有了,在实际生产中,这是不能容忍的。
所以,我们要对pod进行升级,支持将数据持久化,并且pod重启后,数据还能访问。
二、数据持久化
数据持久化需要用到两个新的api对象,PV和PVC,我们只需要知道PV描述的是实际的存储,PVC是需求方对存储的描述即可。
下面是两个对象的配置文件
下面这个PV的意思是,使用一个本地存储,类型是host-test,数据放在hostPath指定目录,只允许一个pod读写,容量大小是100Mi
pv.yaml
apiVersion: v1 kind: PersistentVolume metadata: name: host-10m-pv spec: storageClassName: host-test accessModes: - ReadWriteOnce capacity: storage: 100Mi hostPath: path: /opt/module/minikube/tmp
下面这个PVC的意思是我需要一个只允许一个pod读写的本地存储,类型是host-test,大小要求是100Mi
pvc.yaml
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: host-5m-pvc spec: storageClassName: host-test accessModes: - ReadWriteOnce resources: requests: storage: 100Mi
通过kubectl apply -f pv.yaml,kubectl apply -f pvc.yaml,
然后就可以看到生成了一个pv对象和一个pvc对象。
三、高可用
接下来我们改造我们的pod,改使用deployment来创建pod,这样pod挂掉之后,deployment会立即创建一个新的pod
创建deploy的命令
`kubectl create deploy maria-deploy --image=mariadb/server:10.3 --dry-run=client -o yaml`
对模板进行改造后,最终的配置文件mariadb-deploy.yaml如下
apiVersion: apps/v1 kind: Deployment metadata: labels: app: maria-deploy name: maria-deploy spec: replicas: 1 selector: matchLabels: app: maria-deploy template: metadata: labels: app: maria-deploy spec: volumes: - name: host-pvc-vol persistentVolumeClaim: claimName: host-5m-pvc containers: - image: mariadb/server:10.3 name: maria imagePullPolicy: IfNotPresent ports: - containerPort: 3306 volumeMounts: - name: host-pvc-vol mountPath: /var/lib/mysql envFrom: - prefix: 'MARIADB_' configMapRef: name: maria-cm
这样我们就是想了mariadb的高可用,但是访问这个Mariadb还是比较困难,因为pod的ip是动态的,我们在代码中需要一个静态的ip来访问数据库
四、负载均衡
给动态的pod生成一个静态的ip,这时就需要用到service对象。
#给上面的deploy生成一个service
kubectl expose deploy maria-deploy --port=3306 --target-port=3306 --dry-run=client -o yaml
最终的配置文件如下
apiVersion: v1 kind: Service metadata: labels: app: maria-deploy name: maria-deploy spec: ports: - port: 3306 protocol: TCP targetPort: 3306 selector: app: maria-deploy type: NodePort
service对象的ip是稳定的,我们可以在集群内部访问它。
但如果你需要在集群外访问MariaDb,可以指定他的type类型是NodePort,这样集群就会给这个service分配一个主机端口,在外部服务器上就可以通过访问节点ip+节点port来访问这个service服务,进而实现将访问从节点到service,然后再到pod