基于Kubernetes(k8s)部署Dubbo+Nacos服务

打印 上一主题 下一主题

主题 561|帖子 561|积分 1683


一、说明

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

 
二、部署 MySQL

创建配置文件 mysql-local.yaml 内容如下:
  1. apiVersion: v1
  2. kind: ReplicationController
  3. metadata:
  4.   name: mysql
  5.   labels:
  6.     name: mysql
  7. spec:
  8.   replicas: 1
  9.   selector:
  10.     name: mysql
  11.   template:
  12.     metadata:
  13.       labels:
  14.         name: mysql
  15.     spec:
  16.       containers:
  17.       - name: mysql
  18.         image: nacos/nacos-mysql:5.7
  19.         ports:
  20.         - containerPort: 3306
  21.         volumeMounts:
  22.         - name: mysql-data
  23.           mountPath: /var/lib/mysql
  24.         env:
  25.         - name: MYSQL_ROOT_PASSWORD
  26.           value: "root"
  27.         - name: MYSQL_DATABASE
  28.           value: "nacos_devtest"
  29.         - name: MYSQL_USER
  30.           value: "nacos"
  31.         - name: MYSQL_PASSWORD
  32.           value: "nacos"
  33.       volumes:
  34.       - name: mysql-data
  35.         hostPath:
  36.           path: /var/lib/mysql
  37. ---
  38. apiVersion: v1
  39. kind: Service
  40. metadata:
  41.   name: mysql
  42.   labels:
  43.     name: mysql
  44. spec:
  45.   ports:
  46.   - port: 3306
  47.     targetPort: 3306
  48.   selector:
  49.     name: mysql
复制代码
ReplicationController 简称 RC 可以保证在任意时间运行 Pod 的副本数量,能够保证 Pod 总是可用的。
执行以下命令,部署 MySQL 5.7:
  1. kubectl apply -f mysql-local.yaml
复制代码
 
三、部署 Nacos

创建配置文件 nacos-standalone-start.yaml 内容如下:
  1. ---
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5.   name: nacos-standalone
  6.   labels:
  7.     app: nacos-standalone
  8. spec:
  9.   type: ClusterIP
  10.   clusterIP: None
  11.   ports:
  12.     - port: 8848
  13.       name: server
  14.       targetPort: 8848
  15.     - port: 9848
  16.       name: client-rpc
  17.       targetPort: 9848
  18.     - port: 9849
  19.       name: raft-rpc
  20.       targetPort: 9849
  21.     ## 兼容1.4.x版本的选举端口
  22.     - port: 7848
  23.       name: old-raft-rpc
  24.       targetPort: 7848
  25.   selector:
  26.     app: nacos
  27. ---
  28. apiVersion: v1
  29. kind: ConfigMap
  30. metadata:
  31.   name: nacos-cm
  32. data:
  33.   mysql.host: "mysql"
  34.   mysql.db.name: "nacos_devtest"
  35.   mysql.port: "3306"
  36.   mysql.user: "nacos"
  37.   mysql.password: "nacos"
  38. ---
  39. apiVersion: apps/v1
  40. kind: Deployment
  41. metadata:
  42.   name: nacos
  43. spec:
  44.   replicas: 1
  45.   template:
  46.     metadata:
  47.       labels:
  48.         app: nacos
  49.       annotations:
  50.         pod.alpha.kubernetes.io/initialized: "true"
  51.     spec:
  52.       affinity:
  53.         podAntiAffinity:
  54.           requiredDuringSchedulingIgnoredDuringExecution:
  55.             - labelSelector:
  56.                 matchExpressions:
  57.                   - key: "app"
  58.                     operator: In
  59.                     values:
  60.                       - nacos
  61.               topologyKey: "kubernetes.io/hostname"
  62.       containers:
  63.         - name: nacos
  64.           imagePullPolicy: Always
  65.           image: nacos/nacos-server:latest
  66.           resources:
  67.             requests:
  68.               memory: "1Gi"
  69.               cpu: "500m"
  70.           ports:
  71.             - containerPort: 8848
  72.               name: client
  73.             - containerPort: 9848
  74.               name: client-rpc
  75.             - containerPort: 9849
  76.               name: raft-rpc
  77.             - containerPort: 7848
  78.               name: old-raft-rpc
  79.           env:
  80.             - name: SPRING_DATASOURCE_PLATFORM
  81.               value: "mysql"
  82.             - name: MYSQL_SERVICE_HOST
  83.               valueFrom:
  84.                 configMapKeyRef:
  85.                   name: nacos-cm
  86.                   key: mysql.host
  87.             - name: MYSQL_SERVICE_DB_NAME
  88.               valueFrom:
  89.                 configMapKeyRef:
  90.                   name: nacos-cm
  91.                   key: mysql.db.name
  92.             - name: MYSQL_SERVICE_PORT
  93.               valueFrom:
  94.                 configMapKeyRef:
  95.                   name: nacos-cm
  96.                   key: mysql.port
  97.             - name: MYSQL_SERVICE_USER
  98.               valueFrom:
  99.                 configMapKeyRef:
  100.                   name: nacos-cm
  101.                   key: mysql.user
  102.             - name: MYSQL_SERVICE_PASSWORD
  103.               valueFrom:
  104.                 configMapKeyRef:
  105.                   name: nacos-cm
  106.                   key: mysql.password
  107.             - name: MODE
  108.               value: "standalone"
  109.             - name: NACOS_SERVER_PORT
  110.               value: "8848"
  111.             - name: PREFER_HOST_MODE
  112.               value: "hostname"
  113.   selector:
  114.     matchLabels:
  115.       app: nacos
复制代码
使用 ConfigMap 对象来配置 MySQL 的参数;Nacos 通过 DNS 来访问数据库的 Service。
执行以下命令,部署 Nacos 最新版本:
  1. kubectl apply -f nacos-standalone-start.yaml
复制代码
执行以下命令,暴露 Nacos 的端口到宿主机中给外部访问:
  1. 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 对象:
  1. kubectl create secret docker-registry aliyuncs \
  2.   --docker-server=registry.cn-guangzhou.aliyuncs.com \
  3.   --docker-username=zltdiablo@163.com \
  4.   --docker-password=xxxxxx
复制代码


  • docker-registry 指定 secret 的名称
  • docker-server 仓库地址
  • docker-username 仓库账号
  • docker-password 仓库密码
创建成功后,可以使用以下命令查看密钥信息:
  1. kubectl get secret aliyuncs --output=yaml
复制代码
 
4.2. 部署 provider 服务

创建配置文件 provider.yaml 内容如下:
  1. ---
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5.   name: zlt-nacos-provider
  6. spec:
  7.   clusterIP: None
  8.   selector:
  9.     app: zlt-nacos-provider
  10.   ports:
  11.     - protocol: TCP
  12.       port: 20880
  13.       targetPort: 20880
  14. ---
  15. apiVersion: apps/v1
  16. kind: Deployment
  17. metadata:
  18.   name: zlt-nacos-provider
  19. spec:
  20.   replicas: 1
  21.   selector:
  22.     matchLabels:
  23.       app: zlt-nacos-provider
  24.   template:
  25.     metadata:
  26.       labels:
  27.         app: zlt-nacos-provider
  28.     spec:
  29.       imagePullSecrets:
  30.         - name: aliyuncs
  31.       containers:
  32.         - name: server
  33.           image: registry.cn-guangzhou.aliyuncs.com/zlt-test/nacos-provider:1.0-SNAPSHOT
  34.           imagePullPolicy: IfNotPresent
  35.           ports:
  36.             - containerPort: 20880
  37.           env:
  38.             - name: DUBBO_REGISTRY_ADDRESS
  39.               value: "nacos://nacos-standalone:8848"
  40.             - name: DUBBO_IP_TO_REGISTRY
  41.               value: "zlt-nacos-provider"
复制代码
DUBBO_REGISTRY_ADDRESS 参数指定注册中心地址,使用 DNS 来访问 Nacos
DUBBO_IP_TO_REGISTRY 参数指定服务注册的 IP 地址,配置自己 Service 的名称
通过 imagePullSecrets 参数来绑定登录镜像仓库所使用的 secret 名称。
执行以下命令,部署 provider 最新版本:
  1. kubectl apply -f provider.yaml
复制代码
 
4.3. 部署 consumer 服务

创建配置文件 consumer.yaml 内容如下:
  1. ---
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5.   name: zlt-nacos-consumer
  6. spec:
  7.   clusterIP: None
  8.   selector:
  9.     app: zlt-nacos-consumer
  10.   ports:
  11.     - name: web
  12.       port: 8080
  13.       targetPort: 8080
  14. ---
  15. apiVersion: apps/v1
  16. kind: Deployment
  17. metadata:
  18.   name: zlt-nacos-consumer
  19. spec:
  20.   replicas: 1
  21.   selector:
  22.     matchLabels:
  23.       app: zlt-nacos-consumer
  24.   template:
  25.     metadata:
  26.       labels:
  27.         app: zlt-nacos-consumer
  28.     spec:
  29.       imagePullSecrets:
  30.         - name: aliyuncs
  31.       containers:
  32.         - name: server
  33.           image: registry.cn-guangzhou.aliyuncs.com/zlt-test/nacos-consumer:1.0-SNAPSHOT
  34.           imagePullPolicy: IfNotPresent
  35.           ports:
  36.             - containerPort: 8080
  37.           env:
  38.             - name: DUBBO_REGISTRY_ADDRESS
  39.               value: "nacos://nacos-standalone:8848"
  40.             - name: DUBBO_IP_TO_REGISTRY
  41.               value: "zlt-nacos-consumer"
复制代码
执行以下命令,部署 consumer 最新版本:
  1. kubectl apply -f consumer.yaml
复制代码
 
五、测试

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

执行以下命令,暴露 consumer 服务的 web 端口到宿主机中给外部访问:
  1. nohup kubectl port-forward svc/zlt-nacos-consumer 8080:8080 --address='0.0.0.0' &
复制代码
在浏览器输入以下地址进行访问:
  1. http://宿主机IP:8080/test?name=123
复制代码
 
六、样例工程

集成 jib-maven-plugin 插件的样例 Spring Boot 工程:
 
扫码关注有惊喜!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

去皮卡多

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表