如何将MySQL Server 5.7部署到Kubernetes

时间:2020-01-09 10:34:19  来源:igfitidea点击:

说明

使用此指南了解如何在Kuberbetes上运行MySQL,该指南将向我们展示如何部署MySQL 5.7和MySQL 8.

将为我们介绍如何为数据库服务器创建Pod,以及添加持久性存储,configMaps以及通过服务资源公开数据库。

入门

Github中提供了本教程使用的资源文件。使用它们作为模板或者遵循。

  • Kubernetes模板

组态

Dockerhub提供了MySQL的基本Docker容器,允许通过环境变量设置许多配置。

机密

绝不能将机密信息与Docker映像一起存储,也不应将其以明文形式保存在服务器配置存储库中。它们应始终存储在安全的地方。

Kubernetes具有一种称为Secret的资源类型,可用于存储敏感信息。在此示例中,将创建一个临时的YAML文件,并将其用于以声明方式在Kubernetes中创建一个机密。

以这种方式创建机密时,该机密的密钥值必须存储为base64编码的字符串。要将字符串在OSX和大多数Linux发行版上转换为base64,请使用base64命令。

echo -n "my-super-secret-password" | base64

bXktc3VwZXItc2VjcmV0LXBhc3N3b3JkCg==

-n标志被添加到echo命令中,以防止换行符包含在base64编码中。使用此方法对root密码进行编码时,请始终将-n标志与echo一起使用。否则,密码可能不是我们所期望的,并且我们会发现自己不爱数据库服务器。

记下输出值,并创建一个名为secret.yml的新文件。

touch secret.yml

向其中添加以下内容。我们正在数据密钥下设置一个名为ROOT_PASSWORD的新密钥。 ROOT_PASSWORD的值是我们之前生成的base64编码的密码。

---
apiVersion: v1
kind: Secret
metadata:
  name: mysql-secrets
type: Opaque
data:
  ROOT_PASSWORD: c3VwZXItc2VjcmV0LXBhc3N3b3JkCg==

现在运行kubectl apply命令在Kubernetes中创建密钥。

kubectl apply -f secret.yml

我们可以使用kubectl get secret命令列出添加到Kubernetes集群的所有秘密资源。但是,提供的信息是基本信息。

kubectl get secret

NAME                  TYPE                                  DATA   AGE
 default-token-fhdgj   kubernetes.io/service-account-token   3      13m
 mysql-secrets         Opaque                                1      10m

我们可以看到已经创建了mysql-secrets资源,并且它具有1个数据对象,要保存该对象仅具有一对键值对。我们可以使用kubectl describe secret命令显示有关资源的其他信息。

kubectl describe secret mysql-secrets

Name:         mysql-secrets
 Namespace:    default
 Labels:       
 Annotations:
 Type:         Opaque
 Data
 ROOT_PASSWORD:  22 bytes

在数据下,我们可以看到在secrets.yml文件中定义的密钥,但是看不到实际值。我们只知道该值的长度为22个字节。我们不会期望看到该值,因为如果可以的话,它将不会很安全。

永久储存

容器是短暂的构造。当容器停止运行时,对正在运行的容器的任何更改都将丢失。

出于明显的原因,这对于数据库而言并不理想,因为它们是对数据具有持久性的期望。

Kubenetes容器不会在运行时自动添加持久卷存储。必须创建存储声明,然后必须将容器配置为装入声明的存储。

创建一个PersistentVolumeClaim资源

PersistentVolumeClaim资源定义存储卷的属性,包括访问模式,类和大小。此示例中使用的声明非常基础,因为我们仅定义访问模式和大小。

该存储将为ReadWriteOnce,这意味着它只能安装到一个节点,并且该节点将具有写访问权限。大小也将是1GiB。

创建一个名为persistentVolumeClaim.yml的新YAML文件。

touch persistentVolumeClaim.yml

向其中添加以下内容。

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-data-disk
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

现在,使用kubectl apply命令创建存储声明。

kubectl apply -f persistentVolumeClaim.yml

使用kubectl get PersistentStorageClaim命令,我们可以验证它是否已成功创建。

kubectl get persistentvolumeclaim mysql-data-disk

NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
 mysql-data-disk   Bound    pvc-e466493a-7ce2-11e9-baed-42010a800086   1Gi        RWO            standard       22m

要获取有关名为mysql-data-disk的StorageVolumeClaim的更多详细信息,我们使用kubectl describe storagevolumeclaim命令。

kubectl describe persistentvolumeclaim mysql-data-disk

             {"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"mysql-data-disk","namespace":"default"},"spec":{"ac...            pv.kubernetes.io/bind-completed: yes            pv.kubernetes.io/bound-by-controller: yes            volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/gce-pd
 Finalizers:    [kubernetes.io/pvc-protection]
 Capacity:      1Gi
 Access Modes:  RWO
 Events:
   Type       Reason                 Age   From                         Message
   ----       ------                 ----  ----                         -------
   Normal     ProvisioningSucceeded  23m   persistentvolume-controller  Successfully provisioned volume pvc-e466493a-7ce2-11e9-baed-42010a800086 using kubernetes.io/gce-pd
 Mounted By:  mysql-deployment-6b89d9cc44-v4qnz

在Kubernetes上部署MySQL 5.7

创建部署资源

有了机密信息和持久存储后,就可以创建MySQL部署了。部署资源将创建MySQL POD并维护其生命周期。它也可以用于扩展Pods,但是,使用MySQL进行扩展不在本教程的讨论范围之内。

创建一个名为deployment.yml的新YAML文件

touch deployment.yml

向其中添加以下内容。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
  labels:
    app: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:5.7
          ports:
            - containerPort: 3306
          volumeMounts:
            - mountPath: "/var/lib/mysql"
              subPath: "mysql"
              name: mysql-data
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secrets
                  key: ROOT_PASSWORD
      volumes:
        - name: mysql-data
          persistentVolumeClaim:
            claimName: mysql-data-disk

仔细查看yaml文件。请注意,我们如何使用容器键下的" env"键设置环境变量。环境变量的名称为MYSQL_ROOT_PASSWORD,这是传递给MySQL Docker映像以设置root密码的变量。

MYSQL_ROOT_PASSWORD变量的值是从前面在教程mysql-secrets中创建的秘密资源中提取的。

另外,请注意正在安装到/ var / lib / mysql路径的卷。挂载的卷来自本教程前面创建的PersistentStorageClaim资源。

使用kubectl apply命令在Kubernetes中创建部署。

kubectl apply -f deployment.yml

通过服务资源公开MySQL

由于MySQL Pod是短暂的,如果我们将应用程序指向Pod的IP地址,则当新Pod替换发生故障的Pod时,将无法访问MySQL服务器。新的Pod不太可能获得与故障Pod相同的IP地址,这意味着该应用程序将不再能够连接到数据库。

服务资源用于创建静态IP地址,然后通过标签向与该服务相连的任何Pod提供流量。

在此示例中,MySQL服务不会在Kubernetes集群之外公开。群集中只有其他Pod才能访问它。

创建一个名为service.yml的新文件

touch service.yml

向其中添加以下内容。

---
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  selector:
    app: mysql
  ports:
  - protocol: TCP
    port: 3306
    targetPort: 3306

使用kubectl apply命令创建服务资源。

kubectl apply -f service.yml

使用PhpMyAdmin管理数据库

在另一个教程中将介绍在Kubernetes中部署PhpMyAdmin pod来管理MySQL Server pod。但是,我们在这里提到它,因为它是可用于管理服务器的一种解决方案。

可以从Dockerhub获得官方的PhpMyAdmin Docker映像。