k8s怎么部署mysql
时间 : 2023-03-19 08:54:02声明: : 文章内容来自网络,不保证准确性,请自行甄别信息有效性

在 Kubernetes 中部署 MySQL 可以有效地管理和扩展数据库实例。Kubernetes 提供了一个简单的方法来管理 MySQL 实例,使我们可以更加方便地扩容、备份、恢复等操作。下面是一个基本的 Kubernetes 部署 MySQL 的过程说明。

## 准备工作

在开始部署 MySQL 之前,需要确保以下条件已经满足。

### 创建 Secret

为 MySQL 创建一个 Kubernetes Secret,用于存储 MySQL 的用户名和密码等敏感信息。可以使用以下命令创建 Secret。

```bash

kubectl create secret generic mysql-secret --from-literal=username=<username> --from-literal=password=<password>

其中 `username` 和 `password` 是 MySQL 实例的用户名和密码。

### 创建 PersistentVolumeClaim

为 MySQL 创建一个 PV(Persistent Volume),用于持久化存储数据。可以使用以下命令创建 PVC(Persistent Volume Claim)。

```bash

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

name: mysql-pvc

spec:

accessModes:

- ReadWriteOnce

resources:

requests:

storage: 1Gi

其中 `mysql-pvc` 是 PVC 的名称,`storage` 是 PVC 请求的存储容量大小。

## 创建 MySQL Deployment

现在,我们已经准备好了所需的 Secret 和 PVC,可以创建 MySQL 的 Deployment 了。Deployment 可以保证 ReplicaSet 按照用户的期望管理 Pod,即通过设置副本数目控制 Pod 的数量。

以下是 MySQL 的 Deployment 配置文件示例,供参考。

```yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: mysql

spec:

replicas: 1

selector:

matchLabels:

app: mysql

template:

metadata:

labels:

app: mysql

spec:

containers:

- name: mysql

image: mysql:5.7

env:

- name: MYSQL_ROOT_PASSWORD

valueFrom:

secretKeyRef:

name: mysql-secret

key: password

ports:

- containerPort: 3306

name: mysql

volumeMounts:

- name: mysql-persistent-storage

mountPath: /var/lib/mysql

volumes:

- name: mysql-persistent-storage

persistentVolumeClaim:

claimName: mysql-pvc

上面的配置文件指定了应该运行的容器镜像,环境变量 MYSQL_ROOT_PASSWORD,它在 Secret 中指定,将它提供为 MySQL 的数据库密码。另外,容器需要将挂载到 /var/lib/mysql 的持久化卷。

为了创建 Deployment,请使用以下命令。

```bash

kubectl apply -f mysql-deployment.yaml

## 创建 MySQL Service

现在,我们已经有了 MySQL 的 Deployment,但它只能从 Kubernetes 集群内部访问,不能从外部进行连接。下一步是将 MySQL 实例服务化。

以下是将 MySQL 实例暴露到外部的 Service 配置文件示例。

```yaml

apiVersion: v1

kind: Service

metadata:

name: mysql-service

spec:

type: LoadBalancer

selector:

app: mysql

ports:

- name: mysql

port: 3306

targetPort: 3306

这里的 `type: LoadBalancer` 将使得 Service 在外部创建负载均衡器,并公开一个可从公共网络访问的 IP 地址。

为创建 Service,请使用以下命令。

```bash

kubectl apply -f mysql-service.yaml

## 配置应用

现在,MySQL 已经运行并可以从 Kubernetes 集群外部访问。下一步是在应用程序中配置 MySQL 以使用我们的新数据库实例。

应用程序需要使用 `mysql-service` 的 IP 地址和端口号,而该信息可以通过以下命令找到。

```bash

kubectl get services

这将显示服务和其分配的 IP 列表。现在,应用程序可以使用该 IP 地址和端口访问 MySQL。

## 结论

通过 Kubernetes 部署 MySQL,我们可以快速、可靠地创建和管理 MySQL 实例。使用 Kubernetes 可以方便地增加、缩减实例,持久化存储数据,设置数据库密码等等。

Kubernetes (k8s) 是一种开源的容器编排工具,可用于自动化部署、扩展和管理应用程序容器。在使用 Kubernetes 部署应用程序的过程中,MySQL是最常见的一种数据库管理系统之一。本文将介绍如何在 k8s 中部署 MySQL。

## 步骤

以下是部署 MySQL 的步骤:

### 1. 准备 Docker 镜像

首先,我们需要准备一个 MySQL Docker 镜像。可以使用 Dockerfile 自定义 MySQL 镜像。Dockerfiel 文件如下:

FROM mysql:5.7

COPY ./my.cnf /etc/mysql/my.cnf

CMD ["mysqld"]

上述 Dockerfile 使用了 mysql:5.7 镜像,并将自定义的 my.cnf 文件拷贝到容器中。这样做是为了启用外部访问。

构建Docker 镜像:

```bash

$ docker build -t my-mysql .

### 2. 创建 PersistentVolume 和 PersistentVolumeClaim

PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 是 Kubernetes 中用于管理存储的重要对象。

使用以下 YAML 配置文件创建 PV:

```yaml

apiVersion: v1

kind: PersistentVolume

metadata:

name: mysql-pv

spec:

accessModes:

- ReadWriteOnce

persistentVolumeReclaimPolicy: Retain

capacity:

storage: 5Gi

hostPath:

path: "/mnt/data/"

这里使用的是主机上的路径作为存储,需要在主机上创建 /mnt/data 数据存储路径。

接下来,使用以下 YAML 配置文件创建 PVC:

```yaml

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

name: mysql-pvc

spec:

accessModes:

- ReadWriteOnce

volumeMode: Filesystem

resources:

requests:

storage: 5Gi

在这里,我们使用 PVC 来引用 PV 的存储容量。

### 3. 部署 MySQL

现在,我们使用下面的 YAML 配置文件来部署 MySQL:

```yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: mysql

labels:

app: mysql

spec:

replicas: 1

selector:

matchLabels:

app: mysql

template:

metadata:

labels:

app: mysql

spec:

containers:

- name: mysql

image: my-mysql

env:

- name: MYSQL_ROOT_PASSWORD

valueFrom:

secretKeyRef:

name: mysql-pass

key: password

ports:

- containerPort: 3306

volumeMounts:

- name: mysql-persistent-storage

mountPath: /var/lib/mysql

volumes:

- name: mysql-persistent-storage

persistentVolumeClaim:

claimName: mysql-pvc

这个 YAML 文件定义了一个名为 mysql 的 Deployment,将应用程序容器定义为具有 1 个副本并使用 my-mysql 映像,并暴露了容器端口 3306。此外,volumeMounts 链接了 PersistentVolumeClaim,这将Volumes 挂在容器中,以便数据持久化存储。

### 4. 暴露端口

最后,我们创建一个 Kubernetes 服务,用于暴露 MySQL 部署:

```yaml

apiVersion: v1

kind: Service

metadata:

name: mysql

spec:

selector:

app: mysql

ports:

- protocol: TCP

port: 3306

targetPort: 3306

type: NodePort

由于 NodePort 类型要求每个 Node 上运行的容器都可以通过主机 IP 和 NodePort 进行访问,此服务将公开在随机 NodePort 上。

### 5. 访问 MySQL

现在,MySQL 已经部署好了。我们可以使用以下命令来查看 MySQL 服务的 NodePort 端口:

```bash

$ kubectl get svc mysql

使用 master 主机的 IP 地址访问 MySQL 服务:

```bash

$ mysql -uroot -p -h <master_node_IP> -P <NodePort>

其中 NodePort 对应于部署中暴露的 Node 端口。

## 结论

Kubernetes 是一个灵活的平台,它可以轻松部署和管理 MySQL 数据库,同时支持数据容错和水平扩展。通过上面的步骤,我们可以在 Kubernetes 中轻松地部署 MySQL。