如何将MySQL Server 5.7部署到Kubernetes
说明
使用此指南了解如何在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映像。