暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

nacos部署和使用

左枢 2020-11-17
941

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: ServiceAccount
apiVersion: v1
metadata:
name: nfs-client-provisioner
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-client-provisioner-runner
rules:
- 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: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-runner
apiGroup: rbac.authorization.k8s.io
#部署nfs-client-provisioner
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: nfs-client-provisioner
spec:
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/v1
kind: StorageClass
metadata:
name: nfs-storage
provisioner: nfs-client-provisioner


1.2.2 导入yml文件,部署nacos服务


---
apiVersion: v1
kind: Service
metadata:
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: v1
kind: ConfigMap
metadata:
name: nacos-cm
data:
mysql.db.name: "nacos_devtest"
mysql.port: "3306"
mysql.user: "nacos"
mysql.password: "nacos"
embedded.storage: "embedded"
nacos.auth.enable: "true"
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos
spec:
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.app</groupId>
<artifactId>hcf-app-parent</artifactId>
<version>2.6.0-SNAPSHOT</version>
<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")
@RefreshScope
public 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


文章转载自左枢,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论