zoukankan      html  css  js  c++  java
  • k8s安装配置nacos集群

    1 在k8s中部署的难点

    在k8s中部署nacos集群和在裸机器上直接部署nacos机器其实差别不大。
    最主要的区别是k8s中部署的服务没有固定的ip地址,而nacos集群部署需要配置所有实例的ip

    2 解决

    在k8s中通过StatefulSet和Headless Service为每个nacos实例生成一个唯一的dns地址,
    创建一个普通Service给可客户端使用

    版本: nacos1.4.0

    前提前提条件:

    mysql 

    Ingress Controller (用于ingress暴露方式)


    具体实现如下。

    3 实现方式

    3.1 创建数据库配置

    vim nacos-mysql-config.yaml

    apiVersion: v1
    kind: ConfigMap
    metadata:
       name: nacos-cm
    data:
       mysql.host: "192.168.1.211"
       mysql.db.name: "nacos_config"
       mysql.port: "12345"
       mysql.user: "root"
       mysql.password: "root"

    kubectl apply   -f  nacos-mysql-config.yaml


    注意:我是直接现有mysql的nacos库,如果要新建数据库必须先在数据库新建名称为nacos_config的库并导入对应nacos1.4.0下config/nacos-mysql.sql脚本导入到nacos_config库

    image

    3.2 部署Headless Service

    Headless Service为每个pod(nacos实例)生成一个DNS地址,用作NACOS_SERVERS配置

    vim nacos-headless.yaml

    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

    kubectl apply   -f  nacos-headless.yaml

    3.3 通过StatefulSet部署nacos

    StatefulSet部署方式为每个POD生成固定的名称,如nacos-0、nacos-1、nacos-2等。

    vim nacos-StatefulSet.yaml

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
       name: nacos
    spec:
       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-headless
                   topologyKey: "kubernetes.io/hostname"
           containers:
             - name: k8snacos
               imagePullPolicy: Always
               image: nacos/nacos-server:1.4.0
               resources:
                 requests:
                   memory: "2Gi"
                   cpu: "500m"
               ports:
                 - containerPort: 8848
                   name: client
               env:
                 - name: NACOS_REPLICAS
                   value: "3"
                 - 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: MODE
                   value: "cluster"
                 - name: NACOS_SERVER_PORT
                   value: "8848"
                 - name: PREFER_HOST_MODE
                   value: "hostname"
                 - name: NACOS_SERVERS
                   value: "nacos-0.nacos-headless.default.svc.cluster.local:8848 nacos-1.nacos-headless.default.svc.cluster.local:8848 nacos-2.nacos-headless.default.svc.cluster.local:8848"
       selector:
         matchLabels:
           app: nacos

    kubectl apply   -f  nacos-StatefulSet.yaml

    3.4 部署普通Service

    apiVersion: v1
    kind: Service
    metadata:
       name: nacos-service
       namespace: default
       annotations:
         nginx.ingress.kubernetes.io/affinity: "true"
         nginx.ingress.kubernetes.io/session-cookie-name: backend
         nginx.ingress.kubernetes.io/load-balancer-method: drr

    spec:
       selector:
         app: nacos
       ports:
         - name: web
           port: 80
           targetPort: 8848
           nodePort:  8848
       type: NodePort

    kubectl apply   -f  nacos-service.yaml

    或者使用下面的ingress,也可以一起使用---------------------------------------------------------------------------------------------------

    3.5 配置Ingress

    vim ingress-nacos.yaml

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
       name: nacos-web
       namespace: default

    spec:
       rules:
         - host: nacos-web.nacos-demo.com
           http:
             paths:
               - path: /
                 backend:
                   serviceName: nacos-service
                   servicePort: web

    kubectl apply   -f  ingress-nacos.yaml

    结果图

    image

    最后,想通过域名 nacos-web.nacos-demo.com 可以访问,需要在dns服务器解析域名或者本地wind的hosts添加本地解析

    image

    访问

    nacos-web.nacos-demo.com/nacos

    image

    或者

    192.168.1.16:8848/nacos/






    参考:https://blog.csdn.net/u011936655/article/details/108364176

  • 相关阅读:
    HashMap 的数据结构
    JVM的内存区域划分
    分库分表的基本思想
    分表与分库使用场景以及设计方式
    千万数据的分库分表(一)
    用c++实现快速排序和归并排序
    如何查看python版本号?
    python的正则表达式
    python3的队列,比python2更好
    markdown如何插入代码?
  • 原文地址:https://www.cnblogs.com/pengrj/p/15711687.html
Copyright © 2011-2022 走看看