云原生之Kubernetes 集群部署nacos 1.4(集群版)

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS Agent Manager,2核4GB
RDS Agent(兼容OpenClaw),2核4GB
简介: 注册中心是微服务架构最核心的组件。它起到新服务节点的注册与状态维护的作用。微服务节点在启动时会将自身的服务名称、IP、端口等信息在注册中心中进行登记,注册中心会定时检查该节点的运行状态。注册中心通常会采用心跳机制最大程度保证其持有的服务节点列表都是可用的。

系统环境:

  • Nacos 版本:1.4.1
  • Mysql 版本:8.0.19
  • Kubernetes 版本:1.19.5

什么是 Nacos?

注册中心是微服务架构最核心的组件。它起到新服务节点的注册与状态维护的作用。微服务节点在启动时会将自身的服务名称、IP、端口等信息在注册中心中进行登记,注册中心会定时检查该节点的运行状态。注册中心通常会采用心跳机制最大程度保证其持有的服务节点列表都是可用的。

现在微服务开发的主流技术是基于 Spring Boot 进行的,我们都知道 Spring Boot 默认配置文件为 application.yml 或者 application.properties。它保存了应用的主要配置信息,这些配置文件会随着应用发布被打包放入 Jar 文件,随着应用加载并运行。当我们的应用只有几个微服务时这些配置文件分散的存放在各个 Jar 中还没有问题。但是如果我们开发了大型应用,涉及几十个研发团队、上百台服务器、上千个服务实例时,运维团队就要面对因为数量级增加带来的挑战了,必须额外的引入“配置中心”这一组件。

配置中心的职责就是集中管理微服务架构中每一个服务实例的配置数据。当微服务架构引入配置中心后,微服务应用只需持有应用启动的最小化配置,在应用启动时微服务应用所需的其他配置数据,诸如数据库连接字符串、各种用户名密码、IP 等信息均从配置中心远程下载,不再本地保存。

Nacos 官方地址为:https://nacos.io/zh-cn/index.html

Nacos 阿里开源,官方定义为:
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

关键特性:



一图看懂 Nacos:

因为官网有完整的功能介绍,这里不再赘述。

初始化 MySQL 数据库

Nacos 需要提前部署 Mysql,目前支持 5.7 及 8.0 版本,需要导入 SQL 文件来创建它的表结构和一些基础数据。

在这里插入图片描述

部署 Nacos

这里我们部署 Nacos 集群模式,创建一个 Service,该 Service 关联 Nacos 多个 Pod,一个 Pod 就是 Nacos 节点,Pod 之间通过该 Service 进行交互。最后我们会配置一个 NodePort 方式对外访问。当然,你也可以通过创建 Ingress 规则对外提供访问。

整体如下示意图:

在这里插入图片描述

创建 RBAC 资源

创建 nacos-rbac.yaml 资源文件:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nacos-admin
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nacos-admin-clusterrole
rules:
- apiGroups: [""]
  resources: ["persistentvolumes"]
  verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
  resources: ["persistentvolumeclaims"]
  verbs: ["get", "list", "watch", "update"]
- apiGroups: [""]
  resources: ["endpoints"]
  verbs: ["get", "list", "watch", "create", "update", "patch"]
- apiGroups: ["storage.k8s.io"]
  resources: ["storageclasses"]
  verbs: ["get", "list", "watch"]
- apiGroups: [""]
  resources: ["events"]
  verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nacos-admin-binding
subjects:
- kind: ServiceAccount
  name: nacos-admin
  namespace: default
roleRef:
  kind: ClusterRole
  name: nacos-admin-clusterrole
  apiGroup: rbac.authorization.k8s.io

创建资源:

$ kubectl apply -f nacos-rbac.yaml

创建配置 ConfigMap

创建 nacos-config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: nacos-config
data:
  SERVICE_NAME: "nacos-headless" # K8S 中的 Service 名称
  DOMAIN_NAME: "cluster.local"   # 指定 k8s domain 配置,一般默认即可
  NACOS_REPLICAS: "3"
  PREFER_HOST_MODE: "hostname"   # 配置 Nacos 集群节点间服务发现使用的模式,支持 hostname、ip 两种模式
  NACOS_APPLICATION_PORT: "8848"
  NACOS_SERVER_PORT: "8848"
  JVM_XMX: "2g" # 最大堆内存大小
  JVM_XMS: "2g" # 最初是堆内存大小
  JVM_XMN: "1g" # 堆内新生代的内存大小
  MYSQL_SERVICE_HOST: "db-mysql-produce"  # 数据库地址(这里使用上面部署的 Mysql,由于部署在 K8S 里面,所以使用 Mysql Service 提供的 K8S 内部地址)
  MYSQL_SERVICE_DB_NAME: "nacos_config_cluster" # 指定使用的库名称
  MYSQL_SERVICE_PORT: "3306" # 数据库端口
  MYSQL_SERVICE_USER: "reader" # 数据库用户名
  MYSQL_SERVICE_PASSWORD: "123456" # 数据库密码

创建资源文件:

$ kubectl apply -f nacos-config.yaml

创建 Nacos

创建 nacos-deploy.yaml 资源文件:

apiVersion: v1
kind: Service
metadata:
  name: nacos-headless
  labels:
    app: nacos
spec:
  ports:
    - name: server
      port: 8848
      targetPort: 8848
    - name: rpc
      port: 7848
      targetPort: 7848
  clusterIP: None
  selector:
    app: nacos
---
kind: Service
apiVersion: v1
metadata:
  name: nacos
  labels:
    app: nacos
spec:
  ports:
    - name: server
      port: 8848
      targetPort: 8848
      nodePort: 30848
  selector:
    app: nacos
  type: NodePort

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nacos
spec:
  serviceName: nacos-headless
  replicas: 3
  template:
    metadata:
      labels:
        app: nacos
    spec:
      terminationGracePeriodSeconds: 10  #配置优雅停机时间
      serviceAccountName: nacos-admin    #分配服务账户给应用,方便应用能够获取一定的权限
      initContainers:                    #初始化镜像执行初始化操作
        - name: peer-finder-plugin-install
          image: nacos/nacos-peer-finder-plugin:1.0
          volumeMounts:
            - mountPath: "/home/nacos/plugins/peer-finder"
              name: plugindir
      affinity:    #配置Pod反亲和性,放置Pod都起在同一节点上(如果都在一个节点,节点宕机将会使全部实例不可用)       
        podAntiAffinity:    
          # requiredDuringSchedulingIgnoredDuringExecution: #硬策略,pod一定不能启在同一个节点上
          #   - topologyKey: "kubernetes.io/hostname"
          #     labelSelector:
          #       matchExpressions:
          #         - key: "app"
          #           operator: In
          #           values:
          #             - nacos
          preferredDuringSchedulingIgnoredDuringExecution:  #软策略,尽可能pod不启在同一个节点上
            - weight: 100 
              podAffinityTerm:
                topologyKey: "kubernetes.io/hostname"
                labelSelector:
                  matchExpressions:
                    - key: app
                      operator: In
                      values:
                        - nacos  
      containers:
        - name: nacos
          image: nacos/nacos-server:1.4.1
          resources:
            limits:
              cpu: 2
              memory: "2Gi"
            requests:
              cpu: 100m
              memory: "1Gi"
          ports:
            - name: client-port
              containerPort: 8848
            - name: rpc
              containerPort: 7848
          envFrom:
            - configMapRef:
                name: nacos-config
          env:
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
          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
      spec:
        storageClassName: nfs-storage #指定storageclass名称,这里需要根据你的K8S集群进行修改
        accessModes: ["ReadWriteMany"]
        resources:
          requests:
            storage: 5Gi
    - metadata:
        name: datadir
      spec:
        storageClassName: nfs-storage  
        accessModes: ["ReadWriteMany"]
        resources:
          requests:
            storage: 5Gi
    - metadata:
        name: logdir
      spec:
        storageClassName: nfs-storage
        accessModes: ["ReadWriteMany"]
        resources:
          requests:
            storage: 5Gi
  selector:
    matchLabels:
      app: nacos

这里使用的 NFS,并且使用前面 NFS-Subdir-External-Provisioner 插件插件来动态创建 PVC。这里我还创建一个 Service 资源,设置其类型为 NodePort 方式,提供 NodePort 端口为 30848,方便后续我们对 Nacos Dashboard 进行访问。

创建资源文件:

kubectl apply -f nacos-deploy.yaml

访问 Nacos

我们可以输入地址 http://node_ip:30848/nacos 访问 Nacos 页面。
image.png

输入用户名/密码: nacos/nacos ,登录 Nacos 后会看到如下页面:
image.png

源码地址:

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
ACK One注册集群已正式支持ACS(容器计算服务)算力,为企业的容器化工作负载提供更多选择和更强大的计算能力。
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
490 10
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
857 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
存储 Kubernetes API
在K8S集群中,如何正确选择工作节点资源大小? 2
在K8S集群中,如何正确选择工作节点资源大小?
|
Kubernetes Serverless 异构计算
基于ACK One注册集群实现IDC中K8s集群以Serverless方式使用云上CPU/GPU资源
在前一篇文章《基于ACK One注册集群实现IDC中K8s集群添加云上CPU/GPU节点》中,我们介绍了如何为IDC中K8s集群添加云上节点,应对业务流量的增长,通过多级弹性调度,灵活使用云上资源,并通过自动弹性伸缩,提高使用率,降低云上成本。这种直接添加节点的方式,适合需要自定义配置节点(runtime,kubelet,NVIDIA等),需要特定ECS实例规格等场景。同时,这种方式意味您需要自行
基于ACK One注册集群实现IDC中K8s集群以Serverless方式使用云上CPU/GPU资源
|
Kubernetes API 调度
在K8S集群中,如何正确选择工作节点资源大小?1
在K8S集群中,如何正确选择工作节点资源大小?
|
Kubernetes Ubuntu Shell
shell 脚本实现 k8s 集群环境下指定 ns 资源的 yaml 文件备份
在基于 `k8s` 平台的容器化部署环境中,有时候需要快速的实现部署文件的迁移备份,当 `k8s` 平台部署一个 `app` 时,都会相应的产生一堆 `yaml` 文件,如果 `yaml` 文件数量较少,我们可以人工手动的方式进行拷贝,但是当 `yaml` 文件数量多,并且该 `k8s` 平台部署了多个 `app` 时,如果在采用...
980 0
shell 脚本实现 k8s 集群环境下指定 ns 资源的 yaml 文件备份
|
弹性计算 运维 Kubernetes
本地 IDC 中的 K8s 集群如何以 Serverless 方式使用云上计算资源
本地 IDC 中的 K8s 集群如何以 Serverless 方式使用云上计算资源
|
Prometheus Kubernetes 监控
k8s集群监控(2)-部署kube-state-metrics对资源对象监控
kube-state-metrics对k8s集群中的资源对象监控,包括 pod 、 deployment, service
k8s集群监控(2)-部署kube-state-metrics对资源对象监控

热门文章

最新文章

推荐镜像

更多