Kubernetes 集群部署nacos 1.4(集群版)

Posted zuozewei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes 集群部署nacos 1.4(集群版)相关的知识,希望对你有一定的参考价值。

系统环境:

  • 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 页面。

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

源码地址:

  • https://github.com/zuozewei/blog-example/tree/master/Kubernetes/k8s-nacos-v1.4

以上是关于Kubernetes 集群部署nacos 1.4(集群版)的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes 集群部署nacos 1.4(集群版)

Kubernetes 集群部署nacos 1.4(集群版)

实战 Kubernetes 中部署 Nacos 集群

Nacos Server Docker部署集群踩坑

Kubernetes 部署 MongoDB 集群

Kind 部署 Karmada 多集群管理