k8s部署的mysql怎么访问
时间 : 2023-03-22 23:30:01声明: : 文章内容来自网络,不保证准确性,请自行甄别信息有效性

在 Kubernetes 上部署 MySQL 数据库是一个常见的场景。但是,由于容器化应用程序的特殊性质,访问 MySQL 这样的数据库可能需要一些额外的步骤和注意事项。

本文将介绍如何在 Kubernetes 上部署 MySQL,并解决访问 MySQL 数据库时可能遇到的一些常见问题。

## 部署 MySQL

首先,我们要在 Kubernetes 上部署 MySQL。这里我们使用 [Bitnami](https://bitnami.com/) 提供的 MySQL 镜像作为例子,在 Kubernetes 上使用 Helm 进行部署。

安装 Helm:

brew install helm

添加 Bitnami 的 Helm repo:

helm repo add bitnami https://charts.bitnami.com/bitnami

helm repo update

创建一个新的命名空间:

kubectl create namespace my-namespace

安装 MySQL:

helm install my-mysql bitnami/mysql \

--set auth.rootPassword=my-password \

--namespace my-namespace

这里我们设置了 MySQL root 用户的密码为 `my-password`。

接着,我们可以使用以下命令检查 MySQL 是否成功运行:

kubectl exec -it my-mysql-0 -- mysql -uroot -pmy-password

## 访问 MySQL

一旦 MySQL 在 Kubernetes 上成功运行,我们需要考虑如何访问该数据库。

在 Kubernetes 中,Pod 可能会被重新调度,IP 地址和端口可能会发生变化。因此,最好不要直接访问 Pod 的 IP 和端口,而是使用 Kubernetes 提供的其他方法。

### 使用 Service

在 Kubernetes 中,Service 是一种抽象,它为 Pod 提供了固定的 IP 和端口。我们可以创建一个 Service 来暴露一个 Pod 内部的 MySQL 服务。

首先,我们需要创建一个 Service YAML 文件:

apiVersion: v1

kind: Service

metadata:

name: my-mysql-service

namespace: my-namespace

spec:

ports:

- name: mysql

port: 3306

targetPort: 3306

selector:

app: my-mysql

type: ClusterIP

然后,我们可以将该 Service 应用到我们的 MySQL Pod 上:

kubectl apply -f my-mysql-service.yaml

现在,我们可以使用 `my-mysql-service` 来访问 MySQL:

mysql -h my-mysql-service.my-namespace.svc.cluster.local -uroot -pmy-password

### 使用外部 IP

如果我们要从集群外部访问 MySQL,我们可以将 Service 类型设置为 `LoadBalancer` 或 `NodePort`。这样,Kubernetes 会自动为 Service 分配一个可访问的外部 IP。

例如,下面是将 Service 类型设置为 `LoadBalancer` 的 YAML 文件:

apiVersion: v1

kind: Service

metadata:

name: my-mysql-service

namespace: my-namespace

spec:

ports:

- name: mysql

port: 3306

targetPort: 3306

selector:

app: my-mysql

type: LoadBalancer

部署后,我们可以使用分配给该 Service 的外部 IP 地址来访问 MySQL。

### 使用 Ingress

除了使用 Service 和外部 IP,我们还可以使用 Kubernetes 的 Ingress 来处理网络流量。使用 Ingress 可以轻松地将多个服务映射到同一个外部 URL。

例如,下面是使用 Nginx Ingress 控制器创建的 Ingress 配置文件:

apiVersion: networking.k8s.io/v1beta1

kind: Ingress

metadata:

name: my-mysql-ingress

namespace: my-namespace

annotations:

nginx.ingress.kubernetes.io/rewrite-target: /

spec:

rules:

- host: my-mysql.example.com

http:

paths:

- backend:

serviceName: my-mysql-service

servicePort: mysql

path: /mysql

上述配置会将 `my-mysql-service` 映射到 `my-mysql.example.com/mysql`。

使用 Ingress 需要安装 Ingress 控制器,例如 Nginx Ingress 或 Traefik。

## 总结

部署 MySQL 在 Kubernetes 上并不困难,但访问 MySQL 可能需要一些额外的步骤和注意事项。我们可以使用 Kubernetes 提供的 Service、外部 IP 和 Ingress 来访问 MySQL,在此过程中需要注意 Pod 的重新调度和 IP 地址变化的问题。

在Kubernetes集群中,如果使用MySQL进行数据存储,并且希望从Kubernetes集群外访问该数据库,则需要进行一些配置。本文将介绍如何在Kubernetes集群中部署MySQL,并使其可以从Kubernetes集群外部访问。

1. 创建MySQL Deployment

可以使用如下yaml文件来创建一个MySQL Deployment:

apiVersion: apps/v1

kind: Deployment

metadata:

name: mysql

spec:

selector:

matchLabels:

app: mysql

template:

metadata:

labels:

app: mysql

spec:

containers:

- name: mysql

image: mysql:5.7

env:

- name: MYSQL_ROOT_PASSWORD

value: "root_password"

- name: MYSQL_USER

value: "user"

- name: MYSQL_PASSWORD

value: "user_password"

- name: MYSQL_DATABASE

value: "database_name"

ports:

- containerPort: 3306

name: mysql

volumeMounts:

- name: data

mountPath: /var/lib/mysql

volumes:

- name: data

persistentVolumeClaim:

claimName: mysql-pv-claim

该文件创建了一个Deployment并使用MySQL5.7镜像进行部署。在容器中设置了数据库的root用户密码,普通用户、用户密码、数据库名。在容器中暴露了3306端口用于MySQL访问,并将/var/lib/mysql目录作为持久卷的目录。

2. 创建MySQL Service

可以使用如下yaml文件来创建一个MySQL Service:

apiVersion: v1

kind: Service

metadata:

name: mysql-service

spec:

type: NodePort

ports:

- port: 3306

targetPort: mysql

nodePort: 30000

selector:

app: mysql

该文件创建了一个Service用于向外暴露MySQL在Kubernetes集群中的访问端口,将其类型设置为NodePort,使其可以通过Kubernetes集群的节点IP和端口访问。

3. 访问MySQL

首先可以通过kubectl get pods命令获取MySQL的Pod名称:

$ kubectl get pods

NAME READY STATUS RESTARTS AGE

mysql-65d9b84c94-6lvln 1/1 Running 0 12m

可以通过kubectl port-forward命令将MySQL Pod的3306端口映射到本地端口:

$ kubectl port-forward mysql-65d9b84c94-6lvln 3306:3306

现在可以使用类似以下的命令,连接到MySQL数据库:

$ mysql -h localhost -u root -proot_password

接下来,为了从外部访问MySQL数据库,需要使用Kubernetes集群的节点IP和NodePort来访问。在本例中,NodePort为30000,所以可以使用以下命令进行连接:

$ mysql -h NODE_IP -P 30000 -u root -proot_password

其中,NODE_IP为Kubernetes集群任意节点的IP地址。

综上所述,通过上述步骤,就可以在Kubernetes集群中部署MySQL,并使其可以从Kubernetes集群外部访问。