DaLei@home:~$

使用Kubernetes部署mysql



介绍:

Mysql是常用的数据库,本文介绍怎么在Kubernetes中部署和使用mysql。

Mysql与redis不同的是,MySQL默认用到磁盘存储数据,Mysql默认需要账号和密码。

下文中所有的资源来自Kubernetes-Deployment

细节:

  • 使用Secret存储密码信息, 如下所示,使用Secret存储两个变量,name和key,使用base64码表示
    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    data:
      name: YWRtaW4=
      # admin
      key: MWYyZDFlMmU2N2Rm
      # 1f2d1e2e67df
  • 使用PersistentVolumeClaim使用磁盘资源,可以指定访问模式,存储大小和存储类名
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: mysql-pvc
      labels:
        app: mysql-pvc
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 2Gi
      storageClassName: standard
  • 在mysql中使用Secret和PersistentVolumeClaim资源,环境变量MYSQL_ROOT_PASSWORD使用secret中的内容,容器内的/var/lib/mysql路径挂载在PersistentVolumeClaim申请的资源上。
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: mysql-server
    labels:
      app: python
  spec:
    replicas: 1
    selector:
      matchLabels:
        app: python
        tier: mysql
    strategy:
        type: Recreate
    template:
      metadata:
        labels:
          app: python
          tier: mysql
      spec:
        containers:
          - image: mysql
            name: mysql
            env:
              - name: MYSQL_ROOT_PASSWORD
                valueFrom:
                  secretKeyRef:
                    name: mysecret
                    key: key
            ports:
              - containerPort: 3306
                name: mysql
            volumeMounts:
              - name: mysql-persistent-storage
                mountPath: /var/lib/mysql
        volumes:
          - name: mysql-persistent-storage
            persistentVolumeClaim:
              claimName: mysql-pvc
  • app yaml配置,指定环境变量来自于mysecret
   ...
    - name: MYSQL_ROOT_PASSWORD
      valueFrom:
        secretKeyRef:
          name: mysecret
          key: key
   ...

部署:

kubectl create -f mysql-server-secret.yaml
kubectl create -f mysql-server-pvc.yaml

kubectl apply -f mysql-server-deployment.yaml
kubectl apply -f mysql-server-service.yaml

这样就可以把MySQL部署好,下面部署app

cd ../redis-server/
kubectl apply -f redis-master-deployment.yaml
kubectl apply -f redis-master-service.yaml

cd ../app
kubectl apply -f app-deployment.yaml
kubectl apply -f app-service.yaml

这样就把app部署好了,可能需要一定时间下载和部署镜像

kubectl get pods

  NAME                            READY   STATUS    RESTARTS   AGE
  app-698fdccc9f-j7bs5            1/1     Running   3          4d23h
  mysql-server-69f77698bb-6q6jg   1/1     Running   1          4d23h
  redis-master-6c7fcffddf-qsxch   1/1     Running   1          4d23h

# 进入pod内部
kubectl exec -it app-698fdccc9f-j7bs5 bash

apt install iputils-ping
ping mysql-server
  PING mysql-server.default.svc.cluster.local (10.101.116.243) 56(84) bytes of data.

echo $MYSQL_ROOT_PASSWORD
  1f2d1e2e67df

# 输入删除密码
mysql -h mysql-server -uroot -p

# 登陆成功