1. nacos部署
服务镜像:nacos/nacos-server:1.4.0
插件镜像:nacos/nacos-peer-finder-plugin:1.0
在conf/Cluster.conf 中整合了所有实例的地址。peer-finder会轮询(1秒)指定的k8s service ,如果service下面的pod地址列表发生变化,则重新写入Cluster.conf文件。大致调用关系如图:
1.1 单机模式:
docker run \--name nacos1.4.0 \--privileged=true \-p 8848:8848 \-e PREFER_HOST_MODE=ip \-e MODE=standalone \-e NACOS_SERVER_PORT=8848 \-v /xxx/nacos/data:/home/nacos/data \-v /xxx/nacos/logs:/home/nacos/logs \-d nacos/nacos-server:1.4.0
Nacos 控制台:http://ip:8848/nacos/
用户名和密码:nacos/nacos
1.2 集群模式:
1.2.1 导入yml文件,创建nfs存储类
需先替换文件中的nfs服务器地址以及nfs目录
#创建serviceaccount及授权---kind: ServiceAccountapiVersion: v1metadata: name: nfs-client-provisioner---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: nfs-client-provisioner-runnerrules: - apiGroups: [""] resources: ["persistentvolumes"] verbs: ["get", "list", "watch", "create", "delete"] - apiGroups: [""] resources: ["persistentvolumeclaims"] verbs: ["get", "list", "watch", "update"] - apiGroups: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["list", "watch", "create", "update", "patch"] - apiGroups: [""] resources: ["endpoints"] verbs: ["get", "list", "watch", "create", "update", "patch"]---kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata: name: run-nfs-client-provisionersubjects: - kind: ServiceAccount name: nfs-client-provisioner namespace: defaultroleRef: kind: ClusterRole name: nfs-client-provisioner-runner apiGroup: rbac.authorization.k8s.io#部署nfs-client-provisioner---kind: DeploymentapiVersion: extensions/v1beta1metadata: name: nfs-client-provisionerspec: replicas: 1 strategy: type: Recreate template: metadata: labels: app: nfs-client-provisioner spec: serviceAccountName: nfs-client-provisioner containers: - name: nfs-client-provisioner image: quay.io/external_storage/nfs-client-provisioner:latest #image: quay.io/external_storage/nfs-client-provisioner:v2.1.2-k8s1.11 volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: nfs-client-provisioner # value: fuseim.pri/ifs #注意这里指定nfs服务器地址,以及nfs目录 - name: NFS_SERVER value: 172.19.74.250 - name: NFS_PATH value: /app/nfs/data volumes: - name: nfs-client-root #注意这里指定nfs服务器地址,以及nfs目录 nfs: server: 172.19.74.250 path: /app/nfs/data#使用自定义的nfs提供方创建存储类---apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: nfs-storageprovisioner: nfs-client-provisioner
1.2.2 导入yml文件,部署nacos服务
---apiVersion: v1kind: Servicemetadata: name: nacos-headless labels: app: nacos annotations: service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"spec: ports: - port: 8848 name: server targetPort: 8848 clusterIP: None selector: app: nacos---apiVersion: v1kind: ConfigMapmetadata: name: nacos-cmdata: mysql.db.name: "nacos_devtest" mysql.port: "3306" mysql.user: "nacos" mysql.password: "nacos" embedded.storage: "embedded" nacos.auth.enable: "true"---apiVersion: apps/v1kind: StatefulSetmetadata: name: nacosspec: serviceName: nacos-headless replicas: 3 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" serviceAccountName: nfs-client-provisioner initContainers: - name: peer-finder-plugin-install image: nacos/nacos-peer-finder-plugin:1.0 imagePullPolicy: Always volumeMounts: - mountPath: "/home/nacos/plugins/peer-finder" name: plugindir containers: - name: nacos imagePullPolicy: Always image: nacos/nacos-server:1.4.0 resources: requests: memory: "2Gi" cpu: "500m" ports: - containerPort: 8848 name: client-port env: - name: NACOS_REPLICAS value: "3" - name: SERVICE_NAME value: "nacos-headless" - name: DOMAIN_NAME value: "cluster.local" - name: POD_NAMESPACE valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace - name: MYSQL_SERVICE_DB_NAME valueFrom: configMapKeyRef: name: nacos-cm key: mysql.db.name - name: EMBEDDED_STORAGE valueFrom: configMapKeyRef: name: nacos-cm key: embedded.storage - 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: NACOS_AUTH_ENABLE valueFrom: configMapKeyRef: name: nacos-cm key: nacos.auth.enable - name: NACOS_SERVER_PORT value: "8848" - name: PREFER_HOST_MODE value: "hostname" volumeMounts: - name: plugindir mountPath: /home/nacos/plugins/peer-finder - name: datadir mountPath: /home/nacos/data - name: logdir mountPath: /home/nacos/logs volumeClaimTemplates: - metadata: name: plugindir annotations: volume.beta.kubernetes.io/storage-class: "nfs-storage" spec: accessModes: [ "ReadWriteMany" ] resources: requests: storage: 5Gi - metadata: name: datadir annotations: volume.beta.kubernetes.io/storage-class: "nfs-storage" spec: accessModes: [ "ReadWriteMany" ] resources: requests: storage: 5Gi - metadata: name: logdir annotations: volume.beta.kubernetes.io/storage-class: "nfs-storage" spec: accessModes: [ "ReadWriteMany" ] resources: requests: storage: 5Gi selector: matchLabels: app: nacos
1.2.3 配置负载均衡
Nacos 控制台:https://xxxx.polars.info/nacos
用户名和密码:nacos/nacos
2. nacos管理界面使用
2.1 一些概念
命名空间
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。配置集 ID
Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。配置分组
Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。配置快照
Nacos 的客户端 SDK 会在本地生成配置的快照。当客户端无法连接到 Nacos Server 时,可以使用配置快照显示系统的整体容灾能力。配置快照类似于 Git 中的本地 commit,也类似于缓存,会在适当的时机更新,但是并没有缓存过期(expiration)的概念。快照文件存放在users/用户名/nacos/config
目录下。健康保护阈值
为了防止因过多实例 (Instance) 不健康导致流量全部流向健康实例 (Instance) ,继而造成流量压力把健康 健康实例 (Instance) 压垮并形成雪崩效应,应将健康保护阈值定义为一个 0 到 1 之间的浮点数。当域名健康实例 (Instance) 占总服务实例 (Instance) 的比例小于该值时,无论实例 (Instance) 是否健康,都会将这个实例 (Instance) 返回给客户端。这样做虽然损失了一部分流量,但是保证了集群的剩余健康实例 (Instance) 能正常工作。
2.2 功能介绍
2.2.1 命名空间
2.2.2 权限控制
通过“用户 -> 角色 -> 命名空间”的配置来实现不同用户到命名空间的数据的权限控制。
2.2.3 配置管理
Nacos支持基于Namespace和Group的配置分组管理,以便用户更灵活的根据自己的需要按照环境或者应用、模块等分组管理微服务以及Spring的大量配置,在配置管理中主要提供了配置历史版本、回滚、订阅者查询等核心管理能力。
2.2.4 服务管理
服务列表帮助用户以统一的视图管理其所有的微服务以及服务健康状态。整体界面布局是左上角有服务的搜索框和搜索按钮,页面中央是服务列表的展示。服务列表主要展示服务名、集群数目、实例数目、健康实例数目、触发保护阈值和详情按钮六个栏目。
服务流量权重支持及流量保护
Nacos 为用户提供了流量权重控制的能力,同时开放了服务流量的阈值保护,以帮助用户更好的保护服务服务提供者集群不被意外打垮。如下图所以,可以点击实例的编辑按钮,修改实例的权重。如果想增加实例的流量,可以将权重调大,如果不想实例接收流量,则可以将权重设为0。服务元数据管理
Nacos提供多个维度的服务元数据的暴露,帮助用户存储自定义的信息。这些信息都是以K-V的数据结构存储,在控制台上,会以k1=v1,k2=v2这样的格式展示。类似的,编辑元数据可以通过相同的格式进行。
3. nacos客户端连接
3.1 引入父依赖
(当前只有2.6.0快照版本,实际引入依赖请引入2.6.0及之后的发布版本)
<parent> <groupId>com.hand.hcf.appgroupId> <artifactId>hcf-app-parentartifactId> <version>2.6.0-SNAPSHOTversion> <relativePath/> parent>
3.2 Nacos相关配置
bootstrap.yml文件里加上nacos相关配置
spring: application: name: ${SPRING_APPLICATION_NAME:具体应用名称} cloud: nacos: config: enabled: ${NACOS_CONFIG_ENABLED:true} #目前只支持 properties 和 yaml 类型 file-extension: ${NACOS_CONFIG_FILE_EXTENSION:properties} name: ${NACOS_CONFIG_NAME:${spring.application.name}} namespace: ${NACOS_NAMESPACE:local} password: ${NACOS_CONFIG_PASSWORD:${spring.cloud.nacos.password}} enable-remote-sync-config: #配置多个服务共享的data-id shared-configs: - dataId: ${NACOS_CONFIG_COMMON_NAME:common.properties} refresh: true username: ${NACOS_CONFIG_USERNAME:${spring.cloud.nacos.username}} discovery: enabled: ${NACOS_DISCOVERY_ENABLED:true} namespace: ${NACOS_NAMESPACE:local} password: ${NACOS_DISCOVERY_PASSWORD:${spring.cloud.nacos.password}} username: ${NACOS_DISCOVERY_USERNAME:${spring.cloud.nacos.username}} password: ${NACOS_PASSWORD:} #nocos服务地址 server-addr: ${NACOS_SERVER:} username: ${NACOS_USERNAME:}
3.3 自动刷新配置
通过 Spring Cloud 原生注解@RefreshScope
实现配置自动更新:
@RestController@RequestMapping("/config")@RefreshScopepublic class ConfigController { @Value("${useLocalCache:false}") private boolean useLocalCache; @RequestMapping("/get") public boolean get() { return useLocalCache; }}
3.4 Nacos服务注册与发现
通过在启动类上加@EnableDiscoveryClient
注解来开启服务注册发现功能。
更多关于Nacos,请移步官方文档:https://nacos.io/zh-cn/docs/quick-start.html