基于Kubernetes(k8s)部署Dubbo+Nacos服务
一、说明
本文介绍基于 Kubernetes(k8s)
环境集成阿里云 私有镜像仓库 来部署一套 Dubbo
+ Nacos
的微服务系统,并使用 Kubernetes DNS
以及 port-forward
的方式来打通网络访问。
- k8s环境搭建参考文章《基于minikube快速搭建kubernetes单节点环境》 中在阿里云镜像仓库构建的镜像来进行部署。
- 基于《基于jib-maven-plugin快速构建微服务docker镜像》 中在阿里云镜像仓库构建的镜像来进行部署。
二、部署 MySQL
创建配置文件 mysql-local.yaml
内容如下:
apiVersion: v1 kind: ReplicationController metadata: name: mysql labels: name: mysql spec: replicas: 1 selector: name: mysql template: metadata: labels: name: mysql spec: containers: - name: mysql image: nacos/nacos-mysql:5.7 ports: - containerPort: 3306 volumeMounts: - name: mysql-data mountPath: /var/lib/mysql env: - name: MYSQL_ROOT_PASSWORD value: "root" - name: MYSQL_DATABASE value: "nacos_devtest" - name: MYSQL_USER value: "nacos" - name: MYSQL_PASSWORD value: "nacos" volumes: - name: mysql-data hostPath: path: /var/lib/mysql --- apiVersion: v1 kind: Service metadata: name: mysql labels: name: mysql spec: ports: - port: 3306 targetPort: 3306 selector: 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-standalone labels: app: nacos-standalone spec: type: ClusterIP clusterIP: None ports: - port: 8848 name: server targetPort: 8848 - port: 9848 name: client-rpc targetPort: 9848 - port: 9849 name: raft-rpc targetPort: 9849 ## 兼容1.4.x版本的选举端口 - port: 7848 name: old-raft-rpc targetPort: 7848 selector: 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: 1 template: metadata: labels: app: nacos annotations: pod.alpha.kubernetes.io/initialized: "true" spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: "app" operator: In values: - nacos topologyKey: "kubernetes.io/hostname" containers: - name: nacos imagePullPolicy: Always image: nacos/nacos-server:latest resources: requests: memory: "1Gi" cpu: "500m" ports: - containerPort: 8848 name: client - containerPort: 9848 name: client-rpc - containerPort: 9849 name: raft-rpc - containerPort: 7848 name: old-raft-rpc env: - name: SPRING_DATASOURCE_PLATFORM value: "mysql" - name: MYSQL_SERVICE_HOST valueFrom: configMapKeyRef: name: nacos-cm key: mysql.host - name: MYSQL_SERVICE_DB_NAME valueFrom: configMapKeyRef: name: nacos-cm key: mysql.db.name - name: MYSQL_SERVICE_PORT valueFrom: configMapKeyRef: name: nacos-cm key: mysql.port - name: MYSQL_SERVICE_USER valueFrom: configMapKeyRef: name: nacos-cm key: mysql.user - name: MYSQL_SERVICE_PASSWORD valueFrom: configMapKeyRef: name: nacos-cm key: mysql.password - name: MODE value: "standalone" - name: NACOS_SERVER_PORT value: "8848" - name: PREFER_HOST_MODE value: "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: None selector: app: zlt-nacos-provider ports: - protocol: TCP port: 20880 targetPort: 20880 --- apiVersion: apps/v1 kind: Deployment metadata: name: zlt-nacos-provider spec: replicas: 1 selector: matchLabels: app: zlt-nacos-provider template: metadata: labels: app: zlt-nacos-provider spec: imagePullSecrets: - name: aliyuncs containers: - name: server image: registry.cn-guangzhou.aliyuncs.com/zlt-test/nacos-provider:1.0-SNAPSHOT imagePullPolicy: IfNotPresent ports: - containerPort: 20880 env: - name: DUBBO_REGISTRY_ADDRESS value: "nacos://nacos-standalone:8848" - name: DUBBO_IP_TO_REGISTRY value: "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: None selector: app: zlt-nacos-consumer ports: - name: web port: 8080 targetPort: 8080 --- apiVersion: apps/v1 kind: Deployment metadata: name: zlt-nacos-consumer spec: replicas: 1 selector: matchLabels: app: zlt-nacos-consumer template: metadata: labels: app: zlt-nacos-consumer spec: imagePullSecrets: - name: aliyuncs containers: - name: server image: registry.cn-guangzhou.aliyuncs.com/zlt-test/nacos-consumer:1.0-SNAPSHOT imagePullPolicy: IfNotPresent ports: - containerPort: 8080 env: - name: DUBBO_REGISTRY_ADDRESS value: "nacos://nacos-standalone:8848" - name: DUBBO_IP_TO_REGISTRY value: "zlt-nacos-consumer"
执行以下命令,部署 consumer 最新版本:
kubectl apply -f consumer.yaml
五、测试
通过命令 kubectl get pod
查看所有创建的 pods 确保所有的状态都为 Running
执行以下命令,暴露 consumer 服务的 web 端口到宿主机中给外部访问:
nohup kubectl port-forward svc/zlt-nacos-consumer 8080:8080 --address='0.0.0.0' &
在浏览器输入以下地址进行访问:
http://宿主机IP:8080/test?name=123
六、样例工程
集成 jib-maven-plugin
插件的样例 Spring Boot
工程:
- https://gitee.com/zlt2000_admin/zlt-dubbo-samples/tree/master/dubbo-nacos
- https://github.com/zlt2000/zlt-dubbo-samples/tree/master/dubbo-nacos
扫码关注有惊喜!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
KaiwuDB 时序引擎数据存储内存对齐技术解读
一、理论 1、什么是内存对齐 现代计算机中内存空间都是按照 byte 划分的,在计算机中访问一个变量需要访问它的内存地址,从理论上看,似乎对任何类型的变量的访问都可以从任何地址开始。 但在实际情况中,通常在特定的内存地址才能访问特定类型变量,这就需要对数据在内存中存放的位置有限制。各种类型不是按照顺序排放,它们需要根据一定的规则在空间上排列,这就是对齐。 2、为什么需要内存对齐 (1)移植原因: 不是所有的硬件平台都能访问任意地址上的任意数据的,各个硬件平台对存储空间的处理上有很大的不同,部分平台对某些特定类型的数据只能从某些特定地址开始存取。 比如,市面上有些架构的 CPU 在访问一个没有进行对齐的变量时会发生错误,这时 CPU 会进入异常处理状态并且通知程序不能继续执行。 举个例子,在 ARM 硬件平台上,当操作系统被要求存取一个未对齐数据时会默认给应用程序抛出硬件异常。所以,如果不进行内存对齐,代码就不具有移植性,而且难以开展在很多平台上的开发工作。 (2)性能原因: 尽管内存是以字节为单位,但是大部分处理器并不是按字节块来存取内存的。它一般会以双字节、4 字节、8 字节、16...
- 下一篇
如何规避MyBatis使用过程中带来的全表更新风险
作者:京东零售 贾玉西 一、前言 程序员A: MyBatis用过吧? 程序员B: 用过 程序员A: 好巧,我也用过,那你遇到过什么风险没?比如全表数据被更新或者删除了。 程序员B: 咔,还没遇到过,这种情况需要跑路吗? 程序员A: 哈哈,不至于。但使用过程中,由于业务数据校验不当,确实可能会造成全表更新或者删除。 程序员B: 喔,吓死我了,我们都是好人,不会做删库跑路类似蠢事,能展开讲讲这个风险怎样造成的吗? 程序员A: 好的,你能看出下面这段代码会有风险吗? 程序员B: 平时大家都这样写的,也没看出啥风险呀! 程序员A: 假如DAO层没做非空校验,relationId字段传入为空,这段代码组装出来的是什么语句? 程序员B: update cms_relation_area_code set yn = 1 where yn = 0 我擦,全表被逻辑删除了!哥哥,我们的web应用数量多,代码行数几十万行,你怎么处理的呀,不会人力梳理代码吧?得累死...... 程序员A: 昂,可以的,基于MyBatis的扩展点可以实现一款插件做到降低全表更新的风险,降低人工成本。 程序员B: 哥哥,要不讲...
相关文章
文章评论
共有0条评论来说两句吧...