mysql基于k8s的多个实例配置:
#mysql-cluster.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-cluster
namespace: default
spec:
serviceName: "mysql-cluster"
replicas: 3
selector:
matchLabels:
app: mysql-cluster
template:
metadata:
labels:
app: mysql-cluster
spec:
containers:
- name: mysql
image: mysql:8.0
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "rootpassword"
- name: MYSQL_DATABASE
value: "testdb"
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
name: mysql-cluster
namespace: default
spec:
ports:
- port: 3306
targetPort: 3306
nodePort: 30036
selector:
app: mysql-cluster
type: NodePort
这个只是一个具有多实例的mysql集群,通过nodePort访问数据库
$ kubectl apply -f mysql-cluster.yaml
statefulset.apps/mysql-cluster created
service/mysql-cluster created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-cluster-0 1/1 Running 0 18s
mysql-cluster-1 1/1 Running 0 14s
mysql-cluster-2 1/1 Running 0 7s
$ kubectl get svc mysql-cluster
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql-cluster NodePort 10.101.179.247 <none> 3306:30036/TCP 11m
可以从宿主机使用以下命令连接到集群节点:
mysql -h <minikube-ip> -P 30036 -u root -p
其中 <minikube-ip> 可以通过以下命令获取:
$ minikube ip
192.168.49.2
使用: $ mysql -h 192.168.49.2 -P 30036 -u root -p
上面配置service端口解析:
ports:
- port: 3306 # Kubernetes 服务的逻辑端口
targetPort: 3306 # Pod 内容器的端口
nodePort: 30036 # 暴露到宿主机的高位端口
port: 3306
表示服务的逻辑端口,客户端通过此端口访问服务。
当客户端发送请求到服务时,它会通过这个端口进行访问。
在 Kubernetes 集群内,其他 Pod 可以通过 mysql-cluster:3306 访问该服务。
targetPort: 3306
表示后端容器的端口,即运行在 Pod 内部容器的实际端口。
服务会将从 port 接收的请求转发到 Pod 中监听 targetPort 的容器。
nodePort: 30036
表示服务暴露在 Kubernetes 节点上的固定端口。
通过 NodePort 类型的服务,外部客户端可以通过 NodeIP:nodePort 访问该服务。
例如,如果 minikube ip 的值是 192.168.49.2,则可以通过 192.168.49.2:30036 从外部访问 MySQL。
