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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 注册中心是微服务架构最核心的组件。它起到新服务节点的注册与状态维护的作用。微服务节点在启动时会将自身的服务名称、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

源码地址:

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
3天前
|
Kubernetes Cloud Native 微服务
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
13 3
|
15天前
|
Kubernetes 微服务 容器
Aspire项目发布到远程k8s集群
Aspire项目发布到远程k8s集群
50 2
Aspire项目发布到远程k8s集群
|
5天前
|
Kubernetes 数据处理 调度
天呐!部署 Kubernetes 模式的 Havenask 集群太震撼了!
【6月更文挑战第11天】Kubernetes 与 Havenask 集群结合,打造高效智能的数据处理解决方案。Kubernetes 如指挥家精准调度资源,Havenask 快速响应查询,简化复杂任务,优化资源管理。通过搭建 Kubernetes 环境并配置 Havenask,实现高可扩展性和容错性,保障服务连续性。开发者因此能专注业务逻辑,享受自动化基础设施管理带来的便利。这项创新技术组合引领未来,开启数据处理新篇章。拥抱技术新时代!
|
5天前
|
Kubernetes 前端开发 Serverless
Serverless 应用引擎产品使用合集之如何调用Kubernetes集群内服务
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
16天前
|
存储 Kubernetes 监控
【云原生】Kubernetes----PersistentVolume(PV)与PersistentVolumeClaim(PVC)详解
【云原生】Kubernetes----PersistentVolume(PV)与PersistentVolumeClaim(PVC)详解
|
16天前
|
运维 Kubernetes 调度
【kubernetes】关于k8s集群的污点、容忍、驱逐以及k8s集群故障排查思路
【kubernetes】关于k8s集群的污点、容忍、驱逐以及k8s集群故障排查思路
|
16天前
|
Kubernetes 微服务 容器
Aspire项目发布到win11本地k8s集群
Aspire项目发布到win11本地k8s集群
21 0
Aspire项目发布到win11本地k8s集群
|
16天前
|
Kubernetes Cloud Native 开发者
构建高效云原生应用:Kubernetes与微服务架构的融合
【5月更文挑战第31天】 在数字化转型和技术迭代的大潮中,企业对于敏捷、可扩展的IT基础设施需求日益增长。云原生技术以其独特的优势成为推动这一进程的关键力量。本文深入探讨了如何通过结合Kubernetes容器编排和微服务架构来构建和维护高效、可靠的云原生应用。我们将剖析这种技术整合的必要性,揭示其背后的原理,并讨论在实际部署过程中可能遇到的挑战及解决方案。通过案例分析和最佳实践的分享,旨在为开发者和架构师提供一套行之有效的云原生应用构建指南。
|
17天前
|
运维 Prometheus 监控
Kubernetes 集群的监控与维护策略
【5月更文挑战第30天】 在微服务架构日益普及的背景下,容器编排工具如Kubernetes成为确保服务高效运行的关键。本文聚焦于Kubernetes集群的监控和维护,首先探讨了监控系统的重要性及其对集群健康的影响,随后详细介绍了一套综合监控策略,包括节点性能监控、应用服务质量跟踪以及日志管理等方面。此外,文章还提出了一系列实用的集群维护技巧和最佳实践,旨在帮助运维人员预防故障发生,快速定位问题,并确保集群长期稳定运行。
|
17天前
|
Prometheus 监控 Kubernetes
Kubernetes 集群的监控与日志管理实践深入理解PHP的命名空间与自动加载机制
【5月更文挑战第30天】 在容器化和微服务架构日益普及的背景下,Kubernetes 已成为众多企业的首选容器编排工具。然而,随之而来的挑战是集群的监控与日志管理。本文将深入探讨 Kubernetes 集群监控的最佳实践,包括节点资源使用情况、Pods 健康状态以及网络流量分析等关键指标的监控方法。同时,我们也将讨论日志聚合、存储和查询策略,以确保快速定位问题并优化系统性能。文中将介绍常用的开源工具如 Prometheus 和 Fluentd,并分享如何结合这些工具构建高效、可靠的监控和日志管理系统。