> 文章列表 > 【云原生】Kubernetes(k8s)部署 MySQL+Dubbo+Nacos服务

【云原生】Kubernetes(k8s)部署 MySQL+Dubbo+Nacos服务

【云原生】Kubernetes(k8s)部署 MySQL+Dubbo+Nacos服务

    • 一、说明
    • 二、部署 MySQL
    • 三、部署 Nacos
    • 四、部署 Dubbo 服务
      • 4.1. 创建镜像仓库的密钥
      • 4.2. 部署 provider 服务
      • 4.3. 部署 consumer 服务
    • 五、测试

一、说明

本文介绍基于 Kubernetes(k8s) 环境集成阿里云 私有镜像仓库 来部署一套 Dubbo + Nacos 的微服务系统,并使用 Kubernetes DNS 以及 port-forward 的方式来打通网络访问。

Kubernetes基础入门
K8S集群管理平台Rancher(1):基础入门
K8S集群管理平台Rancher(2):安装与使用

【云原生】Kubernetes(k8s)部署 MySQL+Dubbo+Nacos服务

二、部署 MySQL

创建配置文件 mysql-local.yaml 内容如下:

apiVersion: v1
kind: ReplicationController
metadata:name: mysqllabels:name: mysql
spec:replicas: 1selector:name: mysqltemplate:metadata:labels:name: mysqlspec:containers:- name: mysqlimage: nacos/nacos-mysql:5.7ports:- containerPort: 3306volumeMounts:- name: mysql-datamountPath: /var/lib/mysqlenv:- name: MYSQL_ROOT_PASSWORDvalue: "root"- name: MYSQL_DATABASEvalue: "nacos_devtest"- name: MYSQL_USERvalue: "nacos"- name: MYSQL_PASSWORDvalue: "nacos"volumes:- name: mysql-datahostPath:path: /var/lib/mysql
---
apiVersion: v1
kind: Service
metadata:name: mysqllabels:name: mysql
spec:ports:- port: 3306targetPort: 3306selector:name: mysql

ReplicationController 简称 RC 可以保证在任意时间运行 Pod 的副本数量,能够保证 Pod 总是可用的。

执行以下命令,部署 MySQL 5.7:

kubectl apply -f mysql-local.yaml

三、部署 Nacos

创建配置文件 nacos-standalone-start.yaml 内容如下:

---
apiVersion: v1
kind: Service
metadata:name: nacos-standalonelabels:app: nacos-standalone
spec:type: ClusterIPclusterIP: Noneports:- port: 8848name: servertargetPort: 8848- port: 9848name: client-rpctargetPort: 9848- port: 9849name: raft-rpctargetPort: 9849## 兼容1.4.x版本的选举端口- port: 7848name: old-raft-rpctargetPort: 7848selector:app: nacos
---
apiVersion: v1
kind: ConfigMap
metadata:name: nacos-cm
data:mysql.host: "mysql"mysql.db.name: "nacos_devtest"mysql.port: "3306"mysql.user: "nacos"mysql.password: "nacos"
---
apiVersion: apps/v1
kind: Deployment
metadata:name: nacos
spec:replicas: 1template:metadata:labels:app: nacosannotations:pod.alpha.kubernetes.io/initialized: "true"spec:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: "app"operator: Invalues:- nacostopologyKey: "kubernetes.io/hostname"containers:- name: nacosimagePullPolicy: Alwaysimage: nacos/nacos-server:latestresources:requests:memory: "1Gi"cpu: "500m"ports:- containerPort: 8848name: client- containerPort: 9848name: client-rpc- containerPort: 9849name: raft-rpc- containerPort: 7848name: old-raft-rpcenv:- name: SPRING_DATASOURCE_PLATFORMvalue: "mysql"- name: MYSQL_SERVICE_HOSTvalueFrom:configMapKeyRef:name: nacos-cmkey: mysql.host- name: MYSQL_SERVICE_DB_NAMEvalueFrom:configMapKeyRef:name: nacos-cmkey: mysql.db.name- name: MYSQL_SERVICE_PORTvalueFrom:configMapKeyRef:name: nacos-cmkey: mysql.port- name: MYSQL_SERVICE_USERvalueFrom:configMapKeyRef:name: nacos-cmkey: mysql.user- name: MYSQL_SERVICE_PASSWORDvalueFrom:configMapKeyRef:name: nacos-cmkey: mysql.password- name: MODEvalue: "standalone"- name: NACOS_SERVER_PORTvalue: "8848"- name: PREFER_HOST_MODEvalue: "hostname"selector:matchLabels:app: nacos

使用 ConfigMap 对象来配置 MySQL 的参数;Nacos 通过 DNS 来访问数据库的 Service。

执行以下命令,部署 Nacos 最新版本:

kubectl apply -f nacos-standalone-start.yaml

执行以下命令,暴露 Nacos 的端口到宿主机中给外部访问:

nohup kubectl port-forward svc/nacos-standalone 8848:8848 9848:9848 9849:9849 7848:7848 --address='0.0.0.0' &

kubectl port-forward 通过端口转发映射本地端口到指定的应用端口,它将在您的计算机和 kubernetes 之间创建一条隧道;一般用于测试、实验室、故障排除,而不是长期的解决方案。

四、部署 Dubbo 服务

4.1. 创建镜像仓库的密钥

由于拉取阿里云仓库的私有镜像时需要输入账户和密码,需要用到 k8s 的 Secret 对象来管理密码秘钥等敏感信息。

执行以下命令,创建 Secret 对象:

kubectl create secret docker-registry aliyuncs \\--docker-server=registry.cn-guangzhou.aliyuncs.com \\--docker-username=zltdiablo@163.com \\--docker-password=xxxxxx

docker-registry 指定 secret 的名称
docker-server 仓库地址
docker-username 仓库账号
docker-password 仓库密码
创建成功后,可以使用以下命令查看密钥信息:

kubectl get secret aliyuncs --output=yaml

4.2. 部署 provider 服务

创建配置文件 provider.yaml 内容如下:

---
apiVersion: v1
kind: Service
metadata:name: zlt-nacos-provider
spec:clusterIP: Noneselector:app: zlt-nacos-providerports:- protocol: TCPport: 20880targetPort: 20880
---
apiVersion: apps/v1
kind: Deployment
metadata:name: zlt-nacos-provider
spec:replicas: 1selector:matchLabels:app: zlt-nacos-providertemplate:metadata:labels:app: zlt-nacos-providerspec:imagePullSecrets:- name: aliyuncscontainers:- name: serverimage: registry.cn-guangzhou.aliyuncs.com/zlt-test/nacos-provider:1.0-SNAPSHOTimagePullPolicy: IfNotPresentports:- containerPort: 20880env:- name: DUBBO_REGISTRY_ADDRESSvalue: "nacos://nacos-standalone:8848"- name: DUBBO_IP_TO_REGISTRYvalue: "zlt-nacos-provider"

DUBBO_REGISTRY_ADDRESS 参数指定注册中心地址,使用 DNS 来访问 Nacos

DUBBO_IP_TO_REGISTRY 参数指定服务注册的 IP 地址,配置自己 Service 的名称

通过 imagePullSecrets 参数来绑定登录镜像仓库所使用的 secret 名称。

执行以下命令,部署 provider 最新版本:

kubectl apply -f provider.yaml

4.3. 部署 consumer 服务

创建配置文件 consumer.yaml 内容如下:

---
apiVersion: v1
kind: Service
metadata:name: zlt-nacos-consumer
spec:clusterIP: Noneselector:app: zlt-nacos-consumerports:- name: webport: 8080targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:name: zlt-nacos-consumer
spec:replicas: 1selector:matchLabels:app: zlt-nacos-consumertemplate:metadata:labels:app: zlt-nacos-consumerspec:imagePullSecrets:- name: aliyuncscontainers:- name: serverimage: registry.cn-guangzhou.aliyuncs.com/zlt-test/nacos-consumer:1.0-SNAPSHOTimagePullPolicy: IfNotPresentports:- containerPort: 8080env:- name: DUBBO_REGISTRY_ADDRESSvalue: "nacos://nacos-standalone:8848"- name: DUBBO_IP_TO_REGISTRYvalue: "zlt-nacos-consumer"

执行以下命令,部署 consumer 最新版本:

kubectl apply -f consumer.yaml

五、测试

通过命令 kubectl get pod 查看所有创建的 pods 确保所有的状态都为 Running

【云原生】Kubernetes(k8s)部署 MySQL+Dubbo+Nacos服务

执行以下命令,暴露 consumer 服务的 web 端口到宿主机中给外部访问:

nohup kubectl port-forward svc/zlt-nacos-consumer 8080:8080 --address='0.0.0.0' &

在浏览器输入以下地址进行访问:

http://宿主机IP:8080/test?name=123