K8S 搭建 nacos 1.4.1 集群(MySQL 8.0)

本文原文链接:https://blog.csdn.net/xzk9381/article/details/114264549

一、什么是 nacos

Nacos 是阿里开源的服务注册中心与配置中心组件,能够帮助开发人员快速实现动态服务发现、服务配置、服务元数据及流量管理。同时能够与 SpringCloud、Kubernetes、Dubbo 等开源生态无缝集成。

Nacos 支持如下核心特性:

  • 服务发现: 支持 DNS 与 RPC 服务发现,也提供原生 SDK 、OpenAPI 等多种服务注册方式和 DNS、HTTP 与 API 等多种服务发现方式。
  • 服务健康监测: Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。
  • 动态配置服务: Nacos 提供配置统一管理功能,能够帮助我们将配置以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
  • 动态 DNS 服务: Nacos 支持动态 DNS 服务权重路由,能够让我们很容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单 DNS 解析服务。
  • 服务及其元数据管理: Nacos 支持从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

二、搭建 nacos 集群

在 k8s 中搭建 nacos 集群需要按照如下步骤安装:

  1. 搭建 MySQL 环境并配置数据持久化存储
  2. 导入 nacos 数据库表结构
  3. 搭建 nacos 集群(官方推荐至少 3 个节点)

1. 创建命名空间

首先创建 nacos 集群所需要使用的命名空间 ns-nacos:

---
apiVersion: v1
kind: Namespace
metadata:
  name: ns-nacos
  labels:
    name: ns-nacos

2. 创建存储类

创建一个用于管理 pv 和 pvc 的存储类,新建 storage.yaml 文件,内容如下:

---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: nacos-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

3. 搭建 MySQL 8.0(单节点)

3.1 创建 ConfigMap 存储 MySQL 配置文件

新建 mysql-config.yaml 文件,内容如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
  namespace: ns-nacos
  labels:
    nacos-app: mysql
data:
  my.cnf: |-
    [client]
    default-character-set=utf8mb4
    [mysql]
    default-character-set=utf8mb4
    [mysqld]
    max_connections = 2000
    secure_file_priv=/var/lib/mysql
    max_allowed_packet=256M
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
3.2 创建 Secret 存储 MySQL 密码配置

初始化 MySQL 时需要设置密码,可以直接引入 Secret 文件中的变量值来作为密码。新建 mysql-secret.yaml 文件,内容如下:

apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
  namespace: ns-nacos
type: Opaque
data:
  mysql-user-root-pwd: bmFjb3NfbXlzcWxfYWRtaW4K
3.3 创建 pv 和 pvc

本次搭建集群的存储使用的 cephfs,当前已经将 cephfs 挂载到 k8s 集群的所有节点上,所以创建 pv 和 pvc 的时候,直接使用宿主机目录即可。新建 mysql-pvc.yaml,内容如下:

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nacos-mysql-pv
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 500Gi
  local:
    path: /opt/ops_ceph_data/nacos/mysql-data
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: nacos-cluster
          operator: In
          values:
          - "true"
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nacos-storage

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nacos-mysql-pvc
  namespace: ns-nacos
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: nacos-storage
  resources:
    requests:
      storage: 500Gi
3.4 创建存储目录并设置 labels

根据上面 pv 中的设置,在本地宿主机中创建目录 /opt/ops_ceph_data/nacos/mysql-data 并在所有的宿主机节点上设置标签 nacos-cluster=true

for i in 1 2 3 4 5
do
	kubectl label nodes k8s-node${i} nacos-cluster=true
done
3.5 创建 Service

创建一个 Service 用于暴露 MySQL 服务的 3306 端口,新建 mysql-service.yaml 文件,内容如下:

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
  namespace: ns-nacos
  labels:
    nacos-app: mysql
spec:
  type: NodePort
  ports:
  - name: mysql-port
    port: 3306
    targetPort: 3306
    nodePort: 30336
  selector:
    nacos-app: mysql
3.6 创建 Deployment

新建 mysql-pod.yaml 文件,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-for-nacos
  namespace: ns-nacos
  labels:
    nacos-app: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      nacos-app: mysql
  template:
    metadata:
      labels:
        nacos-app: mysql
    spec:
      restartPolicy: Always
      containers:
      - name: mysql
        image: mysql:8.0.19
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3306
        env:
          - name: MYSQL_ROOT_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mysql-secret
                key: mysql-user-root-pwd
        resources:
          limits:
            cpu: 2000m
            memory: 512Mi
          requests:
            cpu: 2000m
            memory: 512Mi
        livenessProbe:
          initialDelaySeconds: 60
          periodSeconds: 10
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 3
          exec:
            command: ["mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping"]
        readinessProbe:  
          initialDelaySeconds: 60
          periodSeconds: 10
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 3
          exec:
            command: ["mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping"]
        volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
        - name: config
          mountPath: /etc/mysql/conf.d/my.cnf
          subPath: my.cnf
        - name: localtime
          readOnly: true
          mountPath: /etc/localtime
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: nacos-mysql-pvc
      - name: config      
        configMap:
          name: mysql-config
      - name: localtime
        hostPath:
          type: File
          path: /usr/share/zoneinfo/Asia/Shanghai
3.7 导入 nacos 数据库结构

应用上面的文件创建 MySQL 服务后,需要将 nacos 的数据库结构导入到数据库中。

在导入 SQL 之前,需要提前创建好数据库:

CREATE DATABASE nacos_config DEFAULT CHARACTER SET UTF8mb4 COLLATE utf8mb4_bin;

nacos 数据库结构 sql 语句可以在 nacos 源码包中获取,将源码包解压后,在 conf 目录下可以看到名为 nacos-mysql.sql 的文件,将该文件导入 nacos_config 库即可。

本文原文链接:https://blog.csdn.net/xzk9381/article/details/114264549

4. 搭建 nacos 集群

4.1 创建 RBAC

新建 nacos-rbac.yaml 文件,内容如下:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nacos-admin
  namespace: ns-nacos
---
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: ns-nacos
roleRef:
  kind: ClusterRole
  name: nacos-admin-clusterrole
  apiGroup: rbac.authorization.k8s.io
4.2 创建 ConfigMap 存储 nacos 配置文件

新建 nacos-config.yaml 文件,内容如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nacos-config
  namespace: ns-nacos
data:
  SERVICE_NAME: "nacos-headless"
  DOMAIN_NAME: "cluster.local"
  NACOS_REPLICAS: "3"
  PREFER_HOST_MODE: "hostname"
  NACOS_SERVER_PORT: "8848"
  NACOS_APPLICATION_PORT: "8848"
  JVM_XMX: "2g"
  JVM_XMS: "2g"
  JVM_XMN: "1g"
  MYSQL_SERVICE_HOST: "mysql-service"
  MYSQL_SERVICE_DB_NAME: "nacos_config"
  MYSQL_SERVICE_PORT: "3306"
  MYSQL_SERVICE_USER: "root"
  MYSQL_SERVICE_PASSWORD: "nacos_mysql_admin"

Nacos 提供了很多可以配置的参数,以环境变量的方式进行配置,部分参数如下所示:

参数名称 默认值 参数描述
SERVER_SERVLET_CONTEXTPATH /nacos 指定 Nacos 服务前缀。
NACOS_APPLICATION_PORT 8848 指定 Nacos 端口。
TOMCAT_ACCESSLOG_ENABLED false 是否开启访问日志。
SPRING_DATASOURCE_PLATFORM 指定数据库平台,目前只支持 mysql。
MYSQL_DATABASE_NUM 1 数据库数量。
MYSQL_SERVICE_HOST 指定数据库主机地址。
MYSQL_SERVICE_PORT 3306 指定数据库端口。
MYSQL_SERVICE_DB_NAME 指定数据库名称。
MYSQL_SERVICE_USER 指定连接数据库的用户名。
MYSQL_SERVICE_PASSWORD 指定连接数据库的密码。
MYSQL_SERVICE_DB_PARAM characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true 指定数据库连接参数。
JVM_XMS 2g JVM 的 -Xms 参数配置。
JVM_XMX 2g JVM 的 -Xmx 参数配置。
JVM_XMN 1g JVM 的 -Xmn 参数配置。
JVM_MS 128m JVM 的 -XX:MetaspaceSize 参数配置。
JVM_MMS 320m JVM 的 -XX:MaxMetaspaceSize 参数配置。
NACOS_DEBUG 支持y/n,默认为n 是否启用远程调试。
NACOS_AUTH_ENABLE false 是否启用系统鉴权。
NACOS_AUTH_SYSTEM_TYPE nacos 指定 Nacos 系统鉴权认证类型。
NACOS_AUTH_TOKEN SecretKey012345678901234567890123456789012345678901234567890123456789 指定 Nacos 安全认证 Token。
NACOS_AUTH_CACHE_ENABLE false 指定 Nacos 是否开启身份验证信息的缓存。
NACOS_AUTH_TOKEN_EXPIRE_SECONDS 18000 指定 Nacos Token 超时时间,单位(秒)。
NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE false 指定 Nacos 是否使用 user-agent 判断服务端请求并放行鉴权的功能。
NACOS_AUTH_IDENTITY_KEY serverIdentity 指定 Nacos 自定义身份识别的 key。
NACOS_AUTH_IDENTITY_VALUE security 指定 Nacos 自定义身份识别的 value。
PREFER_HOST_MODE ip 指定通信模式,支持hostname和ip两种。
NACOS_SERVERS 指定 Nacos 集群地址。
NACOS_APPLICATION_PORT 8848 指定 Nacos 服务端口。
NACOS_SERVER_IP 在存在多网卡时,指定使用的 IP。
4.3 创建 pv 和 pvc

本次搭建集群的存储使用的 cephfs,当前已经将 cephfs 挂载到 k8s 集群的所有节点上,所以创建 pv 和 pvc 的时候,直接使用宿主机目录即可。新建 nacos-pvc.yaml,内容如下:

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nacos-pv
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 1024Gi
  local:
    path: /opt/ops_ceph_data/nacos/nacos_data
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: nacos-cluster
          operator: In
          values:
          - "true"
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nacos-storage
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nacos-pvc
  namespace: ns-nacos
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nacos-storage
  resources:
    requests:
      storage: 1024Gi
4.4 创建存储目录和并设置 labels

根据上面 pv 中的设置,在本地宿主机中创建目录 /opt/ops_ceph_data/nacos/nacos-data,标签信息已经在之前创建过了,此处不需要重复创建。

4.5 创建 Service

创建一个 headless 用于集群内部通信使用,并为 8848 单独创建一个 nodePort 类型暴露出来,新建 nacos-service.yaml 文件,内容如下:

apiVersion: v1
kind: Service
metadata:
  name: nacos-headless
  namespace: ns-nacos
  labels:
    nacos-app: nacos
spec:
  ports:
    - name: server
      port: 8848
      targetPort: 8848
    - name: rpc
      port: 7848
      targetPort: 7848
  clusterIP: None
  selector:
    nacos-app: nacos
---
kind: Service
apiVersion: v1
metadata:
  name: nacos-expose
  namespace: ns-nacos
  labels:
    nacos-app: nacos
spec:
  ports:
    - name: server
      port: 8848
      targetPort: 8848
      nodePort: 30848
  selector:
    nacos-app: nacos
  type: NodePort
4.6 创建 StateFulSet

使用 StateFulSet 控制器创建 nacos 集群,新建 nacos-pod.yaml 文件,内容如下:

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nacos-cluster
  namespace: ns-nacos
  labels:
    nacos-app: nacos
spec:
  serviceName: nacos-headless
  replicas: 1
  selector:
    matchLabels:
      nacos-app: nacos
  template:
    metadata:
      labels:
        nacos-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: nacosdir
      affinity:                          # 配置Pod反亲和性,放置Pod都起在同一节点上(如果都在一个节点,节点宕机将会使全部实例不可用)       
        podAntiAffinity:    
          # requiredDuringSchedulingIgnoredDuringExecution: # 硬策略,pod一定不能启在同一个节点上
          #   - topologyKey: "kubernetes.io/hostname"
          #     labelSelector:
          #       matchExpressions:
          #         - key: "nacos-app"
          #           operator: In
          #           values:
          #             - nacos
          preferredDuringSchedulingIgnoredDuringExecution:  # 软策略,尽可能pod不启在同一个节点上
            - weight: 100 
              podAffinityTerm:
                topologyKey: "kubernetes.io/hostname"
                labelSelector:
                  matchExpressions:
                    - key: nacos-app
                      operator: In
                      values:
                        - nacos  
      containers:
        - name: nacos-cluster
          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: nacosdir
              mountPath: /home/nacos/plugins/peer-finder
              subPath: peer-finder
            - name: nacosdir
              mountPath: /home/nacos/data
              subPath: data
            - name: nacosdir
              mountPath: /home/nacos/logs
              subPath: logs
            - name: localtime
              readOnly: true
              mountPath: /etc/localtime
      volumes:
      - name: nacosdir
        persistentVolumeClaim:
          claimName: nacos-pvc
      - name: localtime
        hostPath:
          type: File
          path: /usr/share/zoneinfo/Asia/Shanghai
  
4.7 访问 nacos

应用上面的 yaml 文件创建 Pod 后,等待 Pod 的状态变为 running ,即可在浏览器中访问 IP:30848/nacos 访问 nacos 控制台,初始用户名和密码均为 nacos。

本文原文链接:https://blog.csdn.net/xzk9381/article/details/114264549

猜你喜欢

转载自blog.csdn.net/xzk9381/article/details/114264549