美文网首页
k8s部署nacos集群

k8s部署nacos集群

作者: 会倒立的香飘飘 | 来源:发表于2023-04-04 12:33 被阅读0次

    一,什么是nacos

    Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台

    Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

    Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施

    二,nacos关键特性

    1,服务发现和服务健康监测

    Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDKOpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODOHTTP&API查找和发现服务。

    Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

    2,动态配置服务

    动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。

    动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。

    配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

    Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

    3,动态DNS服务

    动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。

    Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表

    4,服务及其元数据管理

    Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

    三,部署nacos

    这里存储卷使用自动创建pvc,所有需要提前部署好nfs-subdir-external-provisioner

    官方项目
    git clone https://github.com/nacos-group/nacos-k8s.git
    

    1,部署mysql数据库

    创建mysql配置文件

    [root@master01 nacos]# cat mysql-configmap.yaml 
    apiVersion: v1
    kind: ConfigMap
    metadata:
      namespace: nacos
      name: mysql
      labels:
        app: mysql
    data:
      master.cnf: |
        # Apply this config only on the master.
        [mysqld]
        log-bin
      slave.cnf: |
        # Apply this config only on slaves.
        [mysqld]
        super-read-only
    
    
    

    创建配置文件

    kubectl create ns nacos 
    kubectl apply -f   mysql-configmap.yaml
    [root@master01 nacos]# kubectl get cm -n nacos 
    NAME               DATA   AGE
    kube-root-ca.crt   1      3d23h
    mysql              2      25h
    
    

    创建mysql密码

    [root@master01 nacos]# cat mysql-secret.yaml 
    apiVersion: v1
    kind: Secret
    metadata:
      name: mysql-secret
      namespace: nacos
      labels:
        app: mysql
    type: Opaque
    data:
      password: MTIzNDU2 # echo -n "123456" | base64
    
    

    创建secret

    kubectl apply -f mysql-secret.yaml 
    [root@master01 nacos]# kubectl get secret -n nacos 
    NAME           TYPE     DATA   AGE
    mysql-secret   Opaque   1      25h
    

    创建mysql services实现读写分离

    [root@master01 nacos]# cat mysql-services.yaml 
    apiVersion: v1
    kind: Service
    metadata:
      namespace: nacos
      name: mysql
      labels:
        app: mysql
    spec:
      ports:
      - name: mysql
        port: 3306
      clusterIP: None
      selector:
        app: mysql
    ---
    # Client service for connecting to any MySQL instance for reads.
    # For writes, you must instead connect to the master: mysql-0.mysql.
    apiVersion: v1
    kind: Service
    metadata:
      namespace: nacos
      name: mysql-read
      labels:
        app: mysql
    spec:
      ports:
      - name: mysql
        port: 3306
      selector:
        app: mysql
    
    
    1,所用用户写请求,必须以DNS记录的方式访问到master节点,也就是mysql-0.mysql这条DNS
    2,用户所有读请求必须访问自动分配的 DNS记录可以被转发到任意一个master或者slave节点上,也就是mysql-read这条DNS记录
    
    

    创建services

    kubectl apply -f  mysql-services.yaml
    [root@master01 nacos]# kubectl get svc -n nacos 
    NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                               AGE
    mysql            ClusterIP   None            <none>        3306/TCP                              25h
    mysql-read       ClusterIP   10.200.47.231   <none>        3306/TCP                              25h
    
    

    创建mysql主从

    [root@master01 nacos]# cat mysql-statefulset.yaml 
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: mysql
      namespace: nacos
      labels:
        app: mysql
    spec:
      selector:
        matchLabels:
          app: mysql
      serviceName: mysql
      replicas: 3
      template:
        metadata:
          labels:
            app: mysql
        spec:
          initContainers:
          - name: init-mysql
            image: mysql:5.7
            env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secret
                  key: password
            command:
            - bash
            - "-c"
            - |
              set -ex
              # 从Pod的序号,生成server-id
              [[ $(hostname) =~ -([0-9]+)$ ]] || exit 1
              ordinal=${BASH_REMATCH[1]}
              echo [mysqld] > /mnt/conf.d/server-id.cnf
              # 由于server-id不能为0,因此给ID加100来避开它
              echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnf
              # 如果Pod的序号为0,说明它是Master节点,从ConfigMap里把Master的配置文件拷贝到/mnt/conf.d目录下
              # 否则,拷贝ConfigMap里的Slave的配置文件
              if [[ ${ordinal} -eq 0 ]]; then
                cp /mnt/config-map/master.cnf /mnt/conf.d
              else
                cp /mnt/config-map/slave.cnf /mnt/conf.d
              fi
            volumeMounts:
            - name: conf
              mountPath: /mnt/conf.d
            - name: config-map
              mountPath: /mnt/config-map
          - name: clone-mysql
            image: fxkjnj/xtrabackup:1.0
            env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secret
                  key: password
            command:
            - bash
            - "-c"
            - |
              set -ex
              # 拷贝操作只需要在第一次启动时进行,所以数据已经存在则跳过
              [[ -d /var/lib/mysql/mysql ]] && exit 0
              # Master 节点(序号为 0)不需要这个操作
              [[ $(hostname) =~ -([0-9]+)$ ]] || exit 1
              ordinal=${BASH_REMATCH[1]}
              [[ $ordinal == 0 ]] && exit 0
              # 使用ncat从前一个节点中复制数据,3307端口是我们启动的一个sidecar容器,他是使用ncat运行的一个服务,这个服务的具体操作可以看xtrabackup容器的配置
              ncat --recv-only mysql-$(($ordinal-1)).mysql 3307 | xbstream -x -C /var/lib/mysql
              # --prepare参数,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务.
              xtrabackup --prepare --target-dir=/var/lib/mysql
            volumeMounts:
            - name: data
              mountPath: /var/lib/mysql
              subPath: mysql
            - name: conf
              mountPath: /etc/mysql/conf.d
          containers:
          - name: mysql
            image: mysql:5.7
            env:
     #        - name: MYSQL_ALLOW_EMPTY_PASSWORD
     #          value: "1"
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secret
                  key: password
            - name: MYSQL_DATABASE
              value: "nacos_config"
            - name: MYSQL_USER
              value: "nacos"
            - name: MYSQL_PASSWORD
              value: "nacos"
            ports:
            - name: mysql
              containerPort: 3306
            volumeMounts:
            - name: data
              mountPath: /var/lib/mysql
              subPath: mysql
            - name: conf
              mountPath: /etc/mysql/conf.d
            resources:
              requests:
                cpu: 500m
                memory: 1Gi
            livenessProbe:
              exec:
                command: ["mysqladmin", "ping", "-uroot", "-p${MYSQL_ROOT_PASSWORD}"]
              initialDelaySeconds: 30
              periodSeconds: 10
              timeoutSeconds: 5
            readinessProbe:
              exec:
                command: ["mysqladmin", "ping", "-uroot", "-p${MYSQL_ROOT_PASSWORD}"]
              initialDelaySeconds: 5
              periodSeconds: 2
              timeoutSeconds: 1
          - name: xtrabackup
            image: fxkjnj/xtrabackup:1.0
            ports:
            - name: xtrabackup
              containerPort: 3307
            env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secret
                  key: password
            command:
            - bash
            - "-c"
            - |
              set -ex
              cd /var/lib/mysql
              # 从备份信息文件里读取MASTER_LOG_FILE和MASTER_LOG_POS这2个字段的值,用来拼装集群初始化SQL
              if [[ -f xtrabackup_slave_info ]]; then
                # 如果xtrabackup_slave_info文件存在,说明这个备份数据来自于另一个Slave节点
                # 这种情况下,XtraBackup工具在备份的时候,就已经在这个文件里自动生成了“CHANGE MASTER TO”SQL语句
                # 所以,只需要把这个文件重命名为change_master_to.sql.in,后面直接使用即可
                mv xtrabackup_slave_info change_master_to.sql.in
                # 所以,也就用不着xtrabackup_binlog_info了
                rm -f xtrabackup_binlog_info
              elif [[ -f xtrabackup_binlog_info ]]; then
                # 如果只是存在xtrabackup_binlog_info文件,说明备份来自于Master节点,就需要解析这个备份信息文件,读取所需的两个字段的值
                [[ $(cat xtrabackup_binlog_info) =~ ^(.*?)[[:space:]]+(.*?)$ ]] || exit 1
                rm xtrabackup_binlog_info
                # 把两个字段的值拼装成SQL,写入change_master_to.sql.in文件
                echo "CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH[1]}',\
                      MASTER_LOG_POS=${BASH_REMATCH[2]}" > change_master_to.sql.in
              fi
              # 如果存在change_master_to.sql.in,就意味着需要做集群初始化工作
              if [[ -f change_master_to.sql.in ]]; then
                # 但一定要先等MySQL容器启动之后才能进行下一步连接MySQL的操作
                echo "Waiting for mysqld to be ready(accepting connections)"
                until mysql -h 127.0.0.1 -uroot -p${MYSQL_ROOT_PASSWORD} -e "SELECT 1"; do sleep 1; done
                echo "Initializing replication from clone position"
                # 将文件change_master_to.sql.in改个名字
                # 防止这个Container重启的时候,因为又找到了change_master_to.sql.in,从而重复执行一遍初始化流程
                mv change_master_to.sql.in change_master_to.sql.orig
                # 使用change_master_to.sql.orig的内容,也就是前面拼装的SQL,组成一个完整的初始化和启动Slave的SQL语句
                mysql -h 127.0.0.1 -uroot -p${MYSQL_ROOT_PASSWORD} << EOF
              $(< change_master_to.sql.orig),
                MASTER_HOST='mysql-0.mysql',
                MASTER_USER='root',
                MASTER_PASSWORD='${MYSQL_ROOT_PASSWORD}',
                MASTER_CONNECT_RETRY=10;
              START SLAVE;
              EOF
              fi
              # 使用ncat监听3307端口。
              # 它的作用是,在收到传输请求的时候,直接执行xtrabackup --backup命令,备份MySQL的数据并发送给请求者
              exec ncat --listen --keep-open --send-only --max-conns=1 3307 -c \
                "xtrabackup --backup --slave-info --stream=xbstream --host=127.0.0.1 --user=root --password=${MYSQL_ROOT_PASSWORD}"
            volumeMounts:
            - name: data
              mountPath: /var/lib/mysql
              subPath: mysql
            - name: conf
              mountPath: /etc/mysql/conf.d
          volumes:
          - name: conf
            emptyDir: {}
          - name: config-map
            configMap:
              name: mysql
      volumeClaimTemplates:
      - metadata:
          name: data
        spec:
          accessModes:
          - "ReadWriteOnce"
          storageClassName: nfs-client
          resources:
            requests:
              storage: 10Gi
    

    创建mysql

    kubectl apply -f mysql-statefulset.yaml
    [root@master01 nacos]# kubectl get pods -n nacos 
    NAME      READY   STATUS    RESTARTS      AGE
    mysql-0   2/2     Running   0             24h
    mysql-1   2/2     Running   1 (24h ago)   24h
    mysql-2   2/2     Running   1 (24h ago)   24h
    

    整体的statefulset有两个Replicas,一个master,一个slave,然后使用init-mysql这个initContainers进行配置文件初始化,接着使用clone-mysql这个initcontainers进行数据传输;同时使用xtrabackup这个sidecar容器进行初始化数据和传输功能

    查看主从是否构建成功

    [root@master01 nacos]#  kubectl -n mysql exec mysql-1 -c mysql -- bash -c "mysql -uroot -p123456 -e 'show slave status \G'"
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: mysql-0.mysql
                      Master_User: root
                      Master_Port: 3306
                    Connect_Retry: 10
                  Master_Log_File: mysql-0-bin.000003
              Read_Master_Log_Pos: 11258
                   Relay_Log_File: mysql-1-relay-bin.000002
                    Relay_Log_Pos: 11426
            Relay_Master_Log_File: mysql-0-bin.000003
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB: 
              Replicate_Ignore_DB: 
               Replicate_Do_Table: 
           Replicate_Ignore_Table: 
          Replicate_Wild_Do_Table: 
      Replicate_Wild_Ignore_Table: 
                       Last_Errno: 0
                       Last_Error: 
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 11258
                  Relay_Log_Space: 11635
                  Until_Condition: None
                   Until_Log_File: 
                    Until_Log_Pos: 0
               Master_SSL_Allowed: No
               Master_SSL_CA_File: 
               Master_SSL_CA_Path: 
                  Master_SSL_Cert: 
                Master_SSL_Cipher: 
                   Master_SSL_Key: 
            Seconds_Behind_Master: 0
    Master_SSL_Verify_Server_Cert: No
                    Last_IO_Errno: 0
                    Last_IO_Error: 
                   Last_SQL_Errno: 0
                   Last_SQL_Error: 
      Replicate_Ignore_Server_Ids: 
                 Master_Server_Id: 100
                      Master_UUID: ff241995-cdfe-11ed-804b-3228cf2e9ae1
                 Master_Info_File: /var/lib/mysql/master.info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
               Master_Retry_Count: 86400
                      Master_Bind: 
          Last_IO_Error_Timestamp: 
         Last_SQL_Error_Timestamp: 
                   Master_SSL_Crl: 
               Master_SSL_Crlpath: 
               Retrieved_Gtid_Set: 
                Executed_Gtid_Set: 
                    Auto_Position: 0
             Replicate_Rewrite_DB: 
                     Channel_Name: 
               Master_TLS_Version: 
    1 row in set (0.01 sec)
    

    初始化sql

    [root@master01 conf]# cat mysql-schema.sql 
    /*
     * Copyright 1999-2018 Alibaba Group Holding Ltd.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    /******************************************/
    /*   数据库全名 = nacos_config   */
    /*   表名称 = config_info   */
    /******************************************/
    CREATE TABLE `config_info` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
      `data_id` varchar(255) NOT NULL COMMENT 'data_id',
      `group_id` varchar(128) DEFAULT NULL,
      `content` longtext NOT NULL COMMENT 'content',
      `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
      `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
      `src_user` text COMMENT 'source user',
      `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
      `app_name` varchar(128) DEFAULT NULL,
      `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
      `c_desc` varchar(256) DEFAULT NULL,
      `c_use` varchar(64) DEFAULT NULL,
      `effect` varchar(64) DEFAULT NULL,
      `type` varchar(64) DEFAULT NULL,
      `c_schema` text,
      `encrypted_data_key` text NOT NULL COMMENT '秘钥',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
    
    /******************************************/
    /*   数据库全名 = nacos_config   */
    /*   表名称 = config_info_aggr   */
    /******************************************/
    CREATE TABLE `config_info_aggr` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
      `data_id` varchar(255) NOT NULL COMMENT 'data_id',
      `group_id` varchar(128) NOT NULL COMMENT 'group_id',
      `datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
      `content` longtext NOT NULL COMMENT '内容',
      `gmt_modified` datetime NOT NULL COMMENT '修改时间',
      `app_name` varchar(128) DEFAULT NULL,
      `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';
    
    
    /******************************************/
    /*   数据库全名 = nacos_config   */
    /*   表名称 = config_info_beta   */
    /******************************************/
    CREATE TABLE `config_info_beta` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
      `data_id` varchar(255) NOT NULL COMMENT 'data_id',
      `group_id` varchar(128) NOT NULL COMMENT 'group_id',
      `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
      `content` longtext NOT NULL COMMENT 'content',
      `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
      `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
      `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
      `src_user` text COMMENT 'source user',
      `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
      `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
      `encrypted_data_key` text NOT NULL COMMENT '秘钥',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';
    
    /******************************************/
    /*   数据库全名 = nacos_config   */
    /*   表名称 = config_info_tag   */
    /******************************************/
    CREATE TABLE `config_info_tag` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
      `data_id` varchar(255) NOT NULL COMMENT 'data_id',
      `group_id` varchar(128) NOT NULL COMMENT 'group_id',
      `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
      `tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
      `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
      `content` longtext NOT NULL COMMENT 'content',
      `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
      `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
      `src_user` text COMMENT 'source user',
      `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';
    
    /******************************************/
    /*   数据库全名 = nacos_config   */
    /*   表名称 = config_tags_relation   */
    /******************************************/
    CREATE TABLE `config_tags_relation` (
      `id` bigint(20) NOT NULL COMMENT 'id',
      `tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
      `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
      `data_id` varchar(255) NOT NULL COMMENT 'data_id',
      `group_id` varchar(128) NOT NULL COMMENT 'group_id',
      `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
      `nid` bigint(20) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`nid`),
      UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
      KEY `idx_tenant_id` (`tenant_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';
    
    /******************************************/
    /*   数据库全名 = nacos_config   */
    /*   表名称 = group_capacity   */
    /******************************************/
    CREATE TABLE `group_capacity` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
      `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
      `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
      `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
      `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
      `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
      `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
      `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
      `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_group_id` (`group_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';
    
    /******************************************/
    /*   数据库全名 = nacos_config   */
    /*   表名称 = his_config_info   */
    /******************************************/
    CREATE TABLE `his_config_info` (
      `id` bigint(20) unsigned NOT NULL,
      `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      `data_id` varchar(255) NOT NULL,
      `group_id` varchar(128) NOT NULL,
      `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
      `content` longtext NOT NULL,
      `md5` varchar(32) DEFAULT NULL,
      `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `src_user` text,
      `src_ip` varchar(50) DEFAULT NULL,
      `op_type` char(10) DEFAULT NULL,
      `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
      `encrypted_data_key` text NOT NULL COMMENT '秘钥',
      PRIMARY KEY (`nid`),
      KEY `idx_gmt_create` (`gmt_create`),
      KEY `idx_gmt_modified` (`gmt_modified`),
      KEY `idx_did` (`data_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';
    
    
    /******************************************/
    /*   数据库全名 = nacos_config   */
    /*   表名称 = tenant_capacity   */
    /******************************************/
    CREATE TABLE `tenant_capacity` (
      `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
      `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
      `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
      `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
      `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
      `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
      `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
      `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
      `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_tenant_id` (`tenant_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';
    
    
    CREATE TABLE `tenant_info` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
      `kp` varchar(128) NOT NULL COMMENT 'kp',
      `tenant_id` varchar(128) default '' COMMENT 'tenant_id',
      `tenant_name` varchar(128) default '' COMMENT 'tenant_name',
      `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
      `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
      `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
      `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
      KEY `idx_tenant_id` (`tenant_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';
    
    CREATE TABLE `users` (
        `username` varchar(50) NOT NULL PRIMARY KEY,
        `password` varchar(500) NOT NULL,
        `enabled` boolean NOT NULL
    );
    
    CREATE TABLE `roles` (
        `username` varchar(50) NOT NULL,
        `role` varchar(50) NOT NULL,
        UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
    );
    
    CREATE TABLE `permissions` (
        `role` varchar(50) NOT NULL,
        `resource` varchar(255) NOT NULL,
        `action` varchar(8) NOT NULL,
        UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
    );
    
    INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
    
    INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
    
    

    四,部署nacos集群

    创建nacos services

    cat nacos-services.yaml 
    apiVersion: v1
    kind: Service
    metadata:
      namespace: nacos
      name: nacos-headless
      labels:
        app: nacos
    spec:
      publishNotReadyAddresses: true 
      ports:
        - port: 8848
          name: server
          targetPort: 8848
        - port: 9848
          name: client-rpc
          targetPort: 9848
        - port: 9849
          name: raft-rpc
          targetPort: 9849
        ## 兼容1.4.x版本的选举端口
        - port: 7848
          name: old-raft-rpc
          targetPort: 7848
      clusterIP: None
      selector:
        app: nacos
    

    创建nacos连接数据文件

    cat nacos-configmap.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      namespace: nacos
      name: nacos-cm
    data:
      mysql.host: "mysql-0.mysql"
      mysql.db.name: "nacos_config"
      mysql.port: "3306"
      mysql.user: "nacos"
      mysql.password: "nacos"
    

    创建nacos集群

    cat nacos-statefulset.yaml 
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      namespace: nacos
      name: nacos
    spec:
      podManagementPolicy: Parallel
      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.1
              imagePullPolicy: Always
              volumeMounts:
                - mountPath: /home/nacos/plugins/peer-finder
                  name: data
                  subPath: peer-finder
          containers:
            - name: nacos
              imagePullPolicy: Always
              image: nacos/nacos-server:latest
              resources:
                requests:
                  memory: "2Gi"
                  cpu: "500m"
              ports:
                - containerPort: 8848
                  name: client-port
                - containerPort: 9848
                  name: client-rpc
                - containerPort: 9849
                  name: raft-rpc
                - containerPort: 7848
                  name: old-raft-rpc
              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_HOST
                  valueFrom:
                    configMapKeyRef:
                      name: nacos-cm
                      key: mysql.host
                - name: MYSQL_SERVICE_DB_NAME
                  valueFrom:
                    configMapKeyRef:
                      name: nacos-cm
                      key: mysql.db.name
                - 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: SPRING_DATASOURCE_PLATFORM
                  value: "mysql"
                - name: NACOS_SERVER_PORT
                  value: "8848"
                - name: NACOS_APPLICATION_PORT
                  value: "8848"
                - name: PREFER_HOST_MODE
                  value: "hostname"
              volumeMounts:
                - name: data
                  mountPath: /home/nacos/plugins/peer-finder
                  subPath: peer-finder
                - name: data
                  mountPath: /home/nacos/data
                  subPath: data
                - name: data
                  mountPath: /home/nacos/logs
                  subPath: logs
      volumeClaimTemplates:
        - metadata:
            name: data
            annotations:
              volume.beta.kubernetes.io/storage-class: "nfs-client"
          spec:
            accessModes: [ "ReadWriteMany" ]
            resources:
              requests:
                storage: 10Gi
      selector:
        matchLabels:
          app: nacos
    

    应用配置文件

    kubectl apply -f nacos-services.yaml 
    kubectl apply -f nacos-configmap.yaml 
    kubectl apply -f nacos-statefulset.yaml  
    
    [root@master01 nacos]# kubectl get cm -n nacos 
    NAME               DATA   AGE
    kube-root-ca.crt   1      4d
    mysql              2      26h
    nacos-cm           5      6h13m
    [root@master01 nacos]# kubectl get  svc -n nacos 
    NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                               AGE
    mysql            ClusterIP   None            <none>        3306/TCP                              26h
    mysql-read       ClusterIP   10.200.47.231   <none>        3306/TCP                              26h
    nacos-headless   ClusterIP   None            <none>        8848/TCP,9848/TCP,9849/TCP,7848/TCP   6h13m
    [root@master01 nacos]# kubectl get pods -n nacos 
    NAME      READY   STATUS    RESTARTS      AGE
    mysql-0   2/2     Running   0             25h
    mysql-1   2/2     Running   1 (25h ago)   25h
    mysql-2   2/2     Running   1 (25h ago)   25h
    nacos-0   1/1     Running   0             6h13m
    nacos-1   1/1     Running   0             6h13m
    nacos-2   1/1     Running   0             6h13m
    
    

    五,创建ingress

    [root@master01 nacos]# cat ingress-nacos.yaml 
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: nacos-ingress
      namespace: nacos 
      annotations:
        kubernetes.io/ingress.class: "nginx"
    spec:
      ingressClassName: nginx
      rules:
      - host: www.nacos.com
        http:
          paths:
          - path: /nacos
            pathType: Prefix
            backend:
              service:
                name: nacos-headless
                port: 
                  number: 8848
    

    创建ingress

    kubectl apply -f ingress-nacos.yaml
    
    [root@master01 nacos]# kubectl get ingress -n nacos 
    NAME            CLASS   HOSTS              ADDRESS     PORTS   AGE
    nacos-ingress   nginx   www.nacos.com      10.0.0.84   80      23h
    
    

    http://www.nacos.com:40674/nacos

    image.png

    相关文章

      网友评论

          本文标题:k8s部署nacos集群

          本文链接:https://www.haomeiwen.com/subject/sjpfddtx.html