k8s部署nacos

参考 https://nacos.io/docs/latest/quickstart/quick-start-kubernetes/

环境准备

  • k8s集群
  • storageclass
  • 命名空间 pro

创建pvc

pvc.yaml

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mysql-pvc
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 20Gi
  storageClassName:  nfs-sc  #指定StorageClass名称
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nacos-log-pvc
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 20Gi
  storageClassName:  nfs-sc  #指定StorageClass名称

创建 nacos 的application.properties配置

configMap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: nacos-config  # ConfigMap 名称,可根据需求修改
data:
  application.properties: |-  # 配置内容写入到单个文件中(推荐方式)
    server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
    server.contextPath=/nacos
    server.port=${NACOS_APPLICATION_PORT:8848}
    server.tomcat.accesslog.max-days=30
    server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
    server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
    server.error.include-message=ALWAYS
    server.tomcat.basedir=file:.
    spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:}
    nacos.cmdb.dumpTaskInterval=3600
    nacos.cmdb.eventTaskInterval=10
    nacos.cmdb.labelTaskInterval=300
    nacos.cmdb.loadDataAtStart=false
    db.num=${MYSQL_DATABASE_NUM:1}
    db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
    db.user.0=${MYSQL_SERVICE_USER}
    db.password.0=${MYSQL_SERVICE_PASSWORD}
    db.pool.config.connectionTimeout=${DB_POOL_CONNECTION_TIMEOUT:30000}
    db.pool.config.validationTimeout=10000
    db.pool.config.maximumPoolSize=20
    db.pool.config.minimumIdle=2
    nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
    nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
    nacos.core.auth.plugin.nacos.token.cache.enable=true
    nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:}
    nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
    nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
    nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:}
    nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:}
    nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
    management.endpoints.web.exposure.include=prometheus,health
    management.metrics.export.elastic.enabled=false
    management.metrics.export.influx.enabled=false
    nacos.naming.distro.taskDispatchThreadCount=10
    nacos.naming.distro.taskDispatchPeriod=200
    nacos.naming.distro.batchSyncKeyCount=1000
    nacos.naming.distro.initDataRatio=0.9
    nacos.naming.distro.syncRetryDelay=5000
    nacos.naming.data.warmup=true
    nacos.console.ui.enabled=true
    nacos.core.param.check.enabled=true

部署

$ kubectl apply -f configMap.yaml -n pro

$ kubectl get cm -n pro
NAME                 DATA   AGE
nacos-config         1      167m

$ kubectl describe cm -n pro nacos-config 
Name:         nacos-config
Namespace:    pro
Labels:       <none>
Annotations:  <none>

Data
====
application.properties:
----
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
server.tomcat.accesslog.max-days=30
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.error.include-message=ALWAYS
server.tomcat.basedir=file:.
spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.user.0=${MYSQL_SERVICE_USER}
db.password.0=${MYSQL_SERVICE_PASSWORD}
db.pool.config.connectionTimeout=${DB_POOL_CONNECTION_TIMEOUT:30000}
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
nacos.core.auth.plugin.nacos.token.cache.enable=true
nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:}
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:}
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
management.endpoints.web.exposure.include=prometheus,health
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
nacos.console.ui.enabled=true
nacos.core.param.check.enabled=true


BinaryData
====

Events:  <none>

创建mysql服务

需要依赖之前构建的mysql镜像
可以参考 https://www.cnblogs.com/guangdelw/p/18838015
mysql-deploy.yaml

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: hexug.top:10000/nacos/mysql:8.0.30
          imagePullPolicy: IfNotPresent
          securityContext:
            runAsUser: 0
          ports:
            - containerPort: 3306
          #设置环境变量
          env:
            - name: MYSQL_DATABASE
              value: "nacos"
            - name: MYSQL_USER
              value: "admin"
            - name: MYSQL_PASSWORD
              value: "111111"
            - name: MYSQL_ROOT_PASSWORD
              value: "111111"
            - name: LANG
              value: "C.UTF-8"
          #挂载pvc
          volumeMounts:
            - name: mysql-db
              mountPath: /var/lib/mysql
      volumes:
        #创建pvc
        - name: mysql-db
          persistentVolumeClaim:
            claimName: mysql-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    name: mysql
spec:
  ports:
  - port: 3306
    targetPort: 3306
  selector:
    app: mysql

部署

$ kubectl apply -f mysql-deploy.yaml -n pro

$ kubectl get all -n pro
NAME                        READY   STATUS    RESTARTS   AGE
pod/mysql-9c5fb4c9c-c8pwp   1/1     Running   0          169m

NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/mysql   ClusterIP   10.98.166.200   <none>        3306/TCP   169m

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/mysql   1/1     1            1           169m

NAME                              DESIRED   CURRENT   READY   AGE
replicaset.apps/mysql-9c5fb4c9c   1         1         1       169m

创建nacos

nacos-deploy.yaml

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nacos
spec:
  # StatefulSet 一定要设置serviceName ,否则无法内部通过 nacos-0.nacos.pro.svc.cluster.local 这种方式来访问
  serviceName: nacos
  replicas: 3
  selector:
    matchLabels:
      app: nacos
  template:
    metadata:
      labels:
        app: nacos
    spec:
      containers:
        - name: nacos
          image: hexug.top:10000/nacos/nacos-server:v2.5.1
          imagePullPolicy: IfNotPresent
          # 因为是java写的,会比较耗资源,所以需要设置一些资源
          resources:
            requests:
              memory: "2Gi"
              cpu: "500m"
          ports:
            - containerPort: 8848
              name: client
            - containerPort: 9848
              name: client-rpc
            - containerPort: 9849
              name: raft-rpc
            - containerPort: 7848
              name: old-raft-rpc
          #设置环境变量
          env:
            - name: NACOS_REPLICAS
              value: "3"
            - name: MYSQL_SERVICE_HOST
              value: mysql.pro.svc.cluster.local
            - name: MYSQL_SERVICE_DB_NAME
              value: "nacos"
            - name: MYSQL_SERVICE_PORT
              value: "3306"
            - name: MYSQL_SERVICE_USER
              value: "admin"
            - name: MYSQL_SERVICE_PASSWORD
              value: "111111"
            - name: SPRING_DATASOURCE_PLATFORM
              value: "mysql"
            - name: NACOS_SERVER_PORT
              value: "8848"
            - name: NACOS_APPLICATION_PORT
              value: "8848"
            - name: PREFER_HOST_MODE
              value: "hostname"
            - name: NACOS_SERVERS
              value: "nacos-0.nacos.pro.svc.cluster.local:8848 nacos-1.nacos.pro.svc.cluster.local:8848 nacos-2.nacos.pro.svc.cluster.local:8848"
            - name: MYSQL_SERVICE_DB_PARAM
              value: "characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true"
            - name: NACOS_AUTH_IDENTITY_KEY
              value: "2222"
            - name: NACOS_AUTH_IDENTITY_VALUE
              value: "2xxx"
            - name: NACOS_AUTH_TOKEN
              value: "MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCg==" 
            - name: NACOS_AUTH_ENABLE
              value: "true"
            - name: NACOS_AUTH_TOKEN_EXPIRE_SECONDS
              value: "18000" #单位秒
            - name: NACOS_AUTH_CACHE_ENABLE
              value: "true"
          #挂载pvc
          volumeMounts:
            - name: log
              mountPath: /home/nacos/logs
            - name: nacos-config
              mountPath: /home/nacos/conf/application.properties
              subPath: application.properties
      volumes:
        - name: log
          persistentVolumeClaim:
            claimName: nacos-log-pvc
        # 挂载配置
        - name: nacos-config
          configMap:
            name: nacos-config
---
apiVersion: v1
kind: Service
metadata:
  name: nacos
  labels:
    app: nacos
spec:
  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
  selector:
    app: nacos

部署

$ kubectl apply -f nacos-deploy.yaml -n pro

$ kubectl get all -n pro
NAME                        READY   STATUS    RESTARTS   AGE
pod/mysql-9c5fb4c9c-c8pwp   1/1     Running   0          169m
pod/nacos-0                 1/1     Running   0          126m
pod/nacos-1                 1/1     Running   0          126m
pod/nacos-2                 1/1     Running   0          126m

NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                               AGE
service/mysql   ClusterIP   10.98.166.200   <none>        3306/TCP                              169m
service/nacos   ClusterIP   10.96.249.232   <none>        8848/TCP,9848/TCP,9849/TCP,7848/TCP   126m

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/mysql   1/1     1            1           169m

NAME                              DESIRED   CURRENT   READY   AGE
replicaset.apps/mysql-9c5fb4c9c   1         1         1       169m

NAME                     READY   AGE
statefulset.apps/nacos   3/3     126m

可以在集群中直接通过service的IP 10.96.249.232的8848端口 来访问nacos
但是我们如果还需要在外部访问的话,还需要有个网关能代理出去或者直接改成NodePort
这里就不做介绍了

posted @ 2025-05-27 18:55  厚礼蝎  阅读(326)  评论(0)    收藏  举报