部署mariaDb

 

一、部署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

posted @ 2023-02-10 17:38  Mars.wang  阅读(118)  评论(0)    收藏  举报