zoukankan      html  css  js  c++  java
  • k8s:搭建Nacos高可用集群

    前提环境

    nfs环境和k8s环境已经安装好,这里不再演示。

    image-20210512152452009

    搭建nfs client、storageclass

    mkdir /nfs/nfs-share
    mkdir /nfs/nacos-mysql-master
    mkdir /nfs/nacos-mysql-slave
    
    vi rbac.yml
    
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: nfs-client-provisioner
      # replace with namespace where provisioner is deployed
      namespace: default
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: nfs-client-provisioner-runner
    rules:
      - apiGroups: [""]
        resources: ["persistentvolumes"]
        verbs: ["get", "list", "watch", "create", "delete"]
      - apiGroups: [""]
        resources: ["persistentvolumeclaims"]
        verbs: ["get", "list", "watch", "update"]
      - 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: run-nfs-client-provisioner
    subjects:
      - kind: ServiceAccount
        name: nfs-client-provisioner
        # replace with namespace where provisioner is deployed
        namespace: default
    roleRef:
      kind: ClusterRole
      name: nfs-client-provisioner-runner
      apiGroup: rbac.authorization.k8s.io
    ---
    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: leader-locking-nfs-client-provisioner
      # replace with namespace where provisioner is deployed
      namespace: default
    rules:
      - apiGroups: [""]
        resources: ["endpoints"]
        verbs: ["get", "list", "watch", "create", "update", "patch"]
    ---
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: leader-locking-nfs-client-provisioner
    subjects:
      - kind: ServiceAccount
        name: nfs-client-provisioner
        # replace with namespace where provisioner is deployed
        namespace: default
    roleRef:
      kind: Role
      name: leader-locking-nfs-client-provisioner
      apiGroup: rbac.authorization.k8s.io
    

    创建该资源:

    kubectl apply -f rbac.yml
    

    创建:client-provisioner-deployment.yml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nfs-client-provisioner
      labels:
        app: nfs-client-provisioner
      # replace with namespace where provisioner is deployed
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nfs-client-provisioner
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: nfs-client-provisioner
        spec:
          serviceAccountName: nfs-client-provisioner
          containers:
            - name: nfs-client-provisioner
              image: quay.io/external_storage/nfs-client-provisioner:latest
              volumeMounts:
                - name: nfs-client-root
                  mountPath: /persistentvolumes
              env:
                - name: PROVISIONER_NAME
                  value: com.wj/nfs # 名称随你定义
                - name: NFS_SERVER
                  value: 192.168.1.53 # NFS 服务IP
                - name: NFS_PATH
                  value: /nfs/nfs-share # NFS 目录
          volumes:
            - name: nfs-client-root
              nfs:
                server: 192.168.1.53 # NFS 服务IP
                path: /nfs/nfs-share # NFS 目录
    
    kubectl apply -f client-provisioner-deployment.yml
    

    定义storageclass.yml

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: managed-nfs-storage # StorageClass名称,随你定义
    provisioner: com.wj/nfs # 和client-provisioner-deployment.yml里定义的一致
    parameters:
      archiveOnDelete: "false"
    

    搭建mysql主从

    mysql主数据库

    vi nacos-mysql-configmap.yml
    
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: nacos-mysql-cm
    data:
      nacos.mysql.master.root.password: "nacos_root" # 主数据库root密码
      nacos.mysql.master.db: "febs_nacos" # 主数据库库名
      nacos.mysql.master.user: "nacos" # 主数据库用户名
      nacos.mysql.master.password: "nacos" # 主数据库密码
      nacos.mysql.master.port: "3306" # 主数据库端口
      nacos.mysql.replication.user: "nacos_ru" # 拷贝用的账户
      nacos.mysql.replication.password: "nacos_ru" # 拷贝用的密码
      nacos.mysql.slave.root.password: "nacos_root" # 从数据库root密码
      nacos.mysql.slave.port: "3306" # 从数据库端口
    

    创建configmap:

    kubectl apply -f nacos-mysql-configmap.yml
    

    部署nacos-mysql-master.yml:

    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: nacos-mysql-master
      labels:
        name: nacos-mysql-master
    spec:
      replicas: 1
      selector:
        name: nacos-mysql-master
      template:
        metadata:
          labels:
            name: nacos-mysql-master
        spec:
          containers:
            - name: master
              image: nacos/nacos-mysql-master:latest # nacos-mysql-master镜像
              ports:
                - containerPort: 3306 # 端口3306
              volumeMounts:
                - mountPath: /var/lib/mysql
                  name: nacos-mysql-master-data
              # 从nacos-mysql-cm中读取配置,加载到环境变量
              env:
                - name: MYSQL_ROOT_PASSWORD
                  valueFrom:
                    configMapKeyRef:
                      name: nacos-mysql-cm
                      key: nacos.mysql.master.root.password
                - name: MYSQL_DATABASE
                  valueFrom:
                    configMapKeyRef:
                      name: nacos-mysql-cm
                      key: nacos.mysql.master.db
                - name: MYSQL_USER
                  valueFrom:
                    configMapKeyRef:
                      name: nacos-mysql-cm
                      key: nacos.mysql.master.user
                - name: MYSQL_PASSWORD
                  valueFrom:
                    configMapKeyRef:
                      name: nacos-mysql-cm
                      key: nacos.mysql.master.password
                - name: MYSQL_REPLICATION_USER
                  valueFrom:
                    configMapKeyRef:
                      name: nacos-mysql-cm
                      key: nacos.mysql.replication.user
                - name: MYSQL_REPLICATION_PASSWORD
                  valueFrom:
                    configMapKeyRef:
                      name: nacos-mysql-cm
                      key: nacos.mysql.replication.password
          volumes: # 指定nfs服务挂载
            - name: nacos-mysql-master-data
              nfs:
                path: /nfs/nacos-mysql-master
                server: 192.168.1.53
    ---
    # 创建nacos主库service,供nacos server连接
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql-master # 必须叫这个名字,因为nacos server内部根据这个名字连接数据库
      labels:
        name: mysql-master
    spec:
      ports:
        - port: 3306
          targetPort: 3306
      selector:
        name: nacos-mysql-master
    
    kubectl apply -f nacos-mysql-master.yml
    

    查看对应Pod状态:

    kubectl get pods -w | grep nacos
    

    要等到running状态后,再执行下一步

    image-20210512154114899

    进入容器内部:

    kubectl exec -it pod/nacos-mysql-master-nbw8r sh
    

    查看数据库是否初始化:

    image-20210512154234291

    exit退出数据库后,exit再退出容器,查看文件挂载:

     ll /nfs/nacos-mysql-master
    

    image-20210512154359862

    mysql从数据库

    nacos-mysql-slave.yml:

    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: nacos-mysql-slave
      labels:
        name: nacos-mysql-slave
    spec:
      replicas: 1
      selector:
        name: nacos-mysql-slave
      template:
        metadata:
          labels:
            name: nacos-mysql-slave
        spec:
          containers:
            - name: slave
              image: nacos/nacos-mysql-slave:latest
              ports:
                - containerPort: 3306
              volumeMounts:
                - mountPath: /var/lib/mysql
                  name: nacos-mysql-slave-data
              env:
                - name: MYSQL_ROOT_PASSWORD
                  valueFrom:
                    configMapKeyRef:
                      name: nacos-mysql-cm
                      key: nacos.mysql.slave.root.password
                - name: MYSQL_REPLICATION_USER
                  valueFrom:
                    configMapKeyRef:
                      name: nacos-mysql-cm
                      key: nacos.mysql.replication.user
                - name: MYSQL_REPLICATION_PASSWORD
                  valueFrom:
                    configMapKeyRef:
                      name: nacos-mysql-cm
                      key: nacos.mysql.replication.password
          volumes:
            - name: nacos-mysql-slave-data
              nfs:
                path: /nfs/nacos-mysql-slave
                server: 192.168.1.53
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql-slave # 必须叫这个名字,因为nacos server内部根据这个名字连接数据库
      labels:
        name: mysql-slave
    spec:
      ports:
        - port: 3306
          targetPort: 3306
      selector:
        name: nacos-mysql-slave
    
    kubectl apply -f nacos-mysql-slave.yml
    

    创建后,观察Pod运行情况:

    kubectl get pods -w | grep nacos
    

    image-20210512154526125

    部署Nacos

    nacos-server.yml:

    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nacos-headless
      labels:
        app: nacos
      annotations:
        service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
    spec:
      ports:
        - port: 8848
          name: server
          targetPort: 8848
      clusterIP: None
      selector:
        app: nacos
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: nacos
    spec:
      serviceName: nacos-headless
      replicas: 2
      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:latest
              imagePullPolicy: Always
              volumeMounts:
                - mountPath: "/home/nacos/plugins/peer-finder"
                  name: plugindir
          containers:
            - name: nacos
              imagePullPolicy: IfNotPresent
              image: nacos/nacos-server:1.1.4
              resources:
                requests:
                  memory: "1.5Gi" # 官方是2Gi,迫于虚机内存压力,我改为了1.5Gi,实际生产环境你可以调大一点,避免OOM
                  cpu: "500m"
                limits:
                  memory: "2Gi"
                  cpu: "1000m"
              ports:
                - containerPort: 8848
                  name: client-port
              env:
                - name: NACOS_REPLICAS
                  value: "2" # 这里仅部署2实例nacos server,原因还是迫于虚机内存压力
                - name: SERVICE_NAME
                  value: "nacos-headless" # 通过headless service控制实例数量
                - name: POD_NAMESPACE
                  valueFrom:
                    fieldRef:
                      apiVersion: v1
                      fieldPath: metadata.namespace
                - name: MYSQL_MASTER_SERVICE_DB_NAME
                  valueFrom:
                    configMapKeyRef:
                      name: nacos-mysql-cm
                      key: nacos.mysql.master.db
                - name: MYSQL_MASTER_SERVICE_PORT
                  valueFrom:
                    configMapKeyRef:
                      name: nacos-mysql-cm
                      key: nacos.mysql.master.port
                - name: MYSQL_SLAVE_SERVICE_PORT
                  valueFrom:
                    configMapKeyRef:
                      name: nacos-mysql-cm
                      key: nacos.mysql.slave.port
                - name: MYSQL_MASTER_SERVICE_USER
                  valueFrom:
                    configMapKeyRef:
                      name: nacos-mysql-cm
                      key: nacos.mysql.master.user
                - name: MYSQL_MASTER_SERVICE_PASSWORD
                  valueFrom:
                    configMapKeyRef:
                      name: nacos-mysql-cm
                      key: nacos.mysql.master.password
                - name: NACOS_SERVER_PORT
                  value: "8848"
                - name: PREFER_HOST_MODE
                  value: "hostname"
              readinessProbe:
                httpGet:
                  port: client-port
                  path: /nacos/v1/console/health/readiness
                initialDelaySeconds: 60
                timeoutSeconds: 3
              livenessProbe:
                httpGet:
                  port: client-port
                  path: /nacos/v1/console/health/liveness
                initialDelaySeconds: 60
                timeoutSeconds: 3
              volumeMounts:
                - name: plugindir
                  mountPath: /home/nacos/plugins/peer-finder
                - name: datadir
                  mountPath: /home/nacos/data
                - name: logdir
                  mountPath: /home/nacos/logs
      # 通过PVC模板结合storageClassName自动创建PV,PVC
      volumeClaimTemplates:
        - metadata:
            name: plugindir
          spec:
            storageClassName: managed-nfs-storage
            accessModes: [ "ReadWriteMany" ]
            resources:
              requests:
                storage: 5Gi
        - metadata:
            name: datadir
          spec:
            storageClassName: managed-nfs-storage
            accessModes: [ "ReadWriteMany" ]
            resources:
              requests:
                storage: 5Gi
        - metadata:
            name: logdir
          spec:
            storageClassName: managed-nfs-storage
            accessModes: [ "ReadWriteMany" ]
            resources:
              requests:
                storage: 5Gi
      selector:
        matchLabels:
          app: nacos
    ---
    # 为了在集群外部访问nacos web,这里直接用NodePort,您也可以使用Ingress
    apiVersion: v1
    kind: Service
    metadata:
      name: nacos-service
    spec:
      ports:
        - port: 8001 # 对集群内部端口为8001
          targetPort: 8848
          nodePort: 30000 # 对外端口为30000
      type: NodePort # 采用NodePort模式
      selector:
        app: nacos
    

    查看Pod创建情况

    kubectl get pods -w | grep nacos
    

    等待全部变成running状态

    image-20210512154653545

    进入容器内部观察:

    kubectl exec -it pods/nacos-0 sh
    
    cat /home/nacos/logs/start.out
    

    日志内容如下:

    kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
    sh-4.2# cat /home/nacos/logs/start.out
    
             ,--.
           ,--.'|
       ,--,:  : |                                           Nacos 1.1.4
    ,`--.'`|  ' :                       ,---.               Running in cluster mode, All function modules
    |   :  :  | |                      '   ,'   .--.--.    Port: 8848
    :   |    | :  ,--.--.     ,---.  /   /   | /  /    '   Pid: 35
    |   : '  '; | /          /     .   ; ,. :|  :  /`./   Console: http://nacos-0.nacos-headless.default.svc.cluster.local:8848/nacos/index.html
    '   ' ;.    ;.--.  .-. | /    / ''   | |: :|  :  ;_
    |   | |    | \__/: . ..    ' / '   | .; :       `.      https://nacos.io
    '   : |  ; .' ," .--.; |'   ; :__|   :    |  `----.   
    |   | '`--'  /  /  ,.  |'   | '.'|     /  /  /`--'  /
    '   : |     ;  :   .'      :    : `----'  '--'.     /
    ;   |.'     |  ,     .-./     /            `--'---'
    '---'        `--`---'     `----'
    
    2021-05-12 15:10:08,115 INFO The server IP list of Nacos is [nacos-0.nacos-headless.default.svc.cluster.local:8848, nacos-1.nacos-headless.default.svc.cluster.local:8848]
    
    2021-05-12 15:10:09,188 INFO Nacos is starting...
    
    2021-05-12 15:10:10,196 INFO Nacos is starting...
    
    2021-05-12 15:10:11,200 INFO Nacos is starting...
    
    2021-05-12 15:10:12,204 INFO Nacos is starting...
    
    2021-05-12 15:10:13,207 INFO Nacos is starting...
    
    2021-05-12 15:10:14,276 INFO Nacos is starting...
    
    2021-05-12 15:10:15,279 INFO Nacos is starting...
    
    2021-05-12 15:10:16,282 INFO Nacos is starting...
    
    2021-05-12 15:10:17,286 INFO Nacos is starting...
    
    2021-05-12 15:10:18,292 INFO Nacos is starting...
    
    2021-05-12 15:10:19,295 INFO Nacos is starting...
    
    2021-05-12 15:10:20,298 INFO Nacos is starting...
    
    2021-05-12 15:10:21,303 INFO Nacos is starting...
    
    2021-05-12 15:10:22,314 INFO Nacos is starting...
    
    2021-05-12 15:10:23,322 INFO Nacos is starting...
    
    2021-05-12 15:10:24,378 INFO Nacos is starting...
    
    2021-05-12 15:10:25,382 INFO Nacos is starting...
    
    2021-05-12 15:10:26,384 INFO Nacos is starting...
    
    2021-05-12 15:10:27,384 INFO Nacos is starting...
    
    2021-05-12 15:10:28,387 INFO Nacos is starting...
    
    2021-05-12 15:10:29,389 INFO Nacos is starting...
    
    2021-05-12 15:10:30,392 INFO Nacos is starting...
    
    2021-05-12 15:10:31,413 INFO Nacos is starting...
    
    2021-05-12 15:10:32,415 INFO Nacos is starting...
    
    2021-05-12 15:10:33,417 INFO Nacos is starting...
    
    2021-05-12 15:10:34,421 INFO Nacos is starting...
    
    2021-05-12 15:10:35,423 INFO Nacos is starting...
    
    2021-05-12 15:10:36,298 INFO Nacos Log files: /home/nacos/logs/
    
    2021-05-12 15:10:36,299 INFO Nacos Conf files: /home/nacos/conf/
    
    2021-05-12 15:10:36,299 INFO Nacos Data files: /home/nacos/data/
    
    2021-05-12 15:10:36,299 INFO Nacos started successfully in cluster mode.
    

    查看nacos-service:

     kubectl describe service/nacos-service
    

    绑定了两个端点。

    image-20210512154950848

    访问nacos页面:http://192.168.1.53:30000/nacos

    账号密码都是nacos

    image-20210512155207144

    集群信息:

    image-20210512155418763

    测试服务注册

        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
                <version>2.2.1.RELEASE</version>
            </dependency>
    

    配置文件:

    server.port=83
    spring.application.name=myapp
    spring.cloud.nacos.discovery.server-addr=192.168.1.53:30000
    

    启动类:

    @EnableDiscoveryClient
    @SpringBootApplication
    public class BootCloudApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(BootCloudApplication.class, args);
        }
    
    }
    

    启动后:服务已经注册到nacos中。

    image-20210512161754025

    配置中心的功能自行测试,这里不再演示。

  • 相关阅读:
    使用Xtrabackup 备份mysql数据库
    Myeclipse总结
    intellij idea问题及技巧
    Tomcat相关配置
    Spark常用算子总结
    前端开发经验
    最近用到的SQL语句
    subline text使用心得
    天龙八部谁是主角?(MR词频统计)
    elasticsearch CURL命令
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/14760325.html
Copyright © 2011-2022 走看看