首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >k8s搭建nacos

k8s搭建nacos

原创
作者头像
聂伟星
发布于 2026-10-28 16:02:10
发布于 2026-10-28 16:02:10
220
举报

k8s搭建nacos

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

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

下面我们来说下如何快速在k8s构建nacos,本次k8s集群是腾讯云的tke,支持云硬盘作为存储,如果是自建k8s,建议通过nfs作为持久化存储。

创建namespace部署nacos

创建一个namespace专门用来部署nacos。

代码语言:bash
复制
# kubectl create ns nacos

部署mysql服务

代码语言:yaml
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  namespace: nacos
  labels:
    name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      name: mysql
  template:
    metadata:
      labels:
        name: mysql
    spec:
      containers:
      - name: mysql
        image: nacos/nacos-mysql:5.7
        args:
        - --ignore-db-dir=lost+found
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "root"
        - name: MYSQL_DATABASE
          value: "nacos_devtest"
        - name: MYSQL_USER
          value: "nacos"
        - name: MYSQL_PASSWORD
          value: "nacos"
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql
---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql
  namespace: nacos
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: cbs
  volumeMode: Filesystem
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: nacos
  labels:
    name: mysql
spec:
  ports:
  - port: 3306
    targetPort: 3306
  selector:
    name: mysql

部署mysql可以会遇到一个错误,这里加上参数–ignore-db-dir=lost+found即可,具体说明参考文档https://cloud.tencent.com/developer/article/1559866

代码语言:bash
复制
[ERROR] --initialize specified but the data directory has files in it. Aborting. 

部署nacos

代码语言:bash
复制
---
apiVersion: v1
kind: Service
metadata:
  name: nacos-headless
  namespace: nacos
  labels:
    app: nacos
  annotations:
    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
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
  clusterIP: None
  selector:
    app: nacos
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nacos-cm
  namespace: nacos
data:
  mysql.db.name: "nacos_devtest"
  mysql.port: "3306"
  mysql.user: "nacos"
  mysql.password: "nacos"
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nacos
  namespace: 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
              topologyKey: "kubernetes.io/hostname"
      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_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: 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
      spec:
        accessModes: [ "ReadWriteOnce" ]
        resources:
          requests:
            storage: 10Gi
  selector:
    matchLabels:
      app: nacos

配置ingress访问ui页面

代码语言:yaml
复制
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: ingress
    nginx.ingress.kubernetes.io/app-root: /nacos/index.html
  name: nacos-ingress
  namespace: nacos
spec:
  rules:
  - host: nacos.tke.niewx.cn
    http:
      paths:
      - backend:
          serviceName: nacos-headless
          servicePort: 8848
        path: /
        pathType: ImplementationSpecific

nacos还提供了ui管理页面,这里用ingress转发到后端的8848端口即可,默认的登录账号密码是nacos/nacos,注意这里需要加上nginx.ingress.kubernetes.io/app-root: /nacos/index.html这个注解,因为nacos的index页面没在根目录下。

upload-image
upload-image
upload-image
upload-image

nacos使用示例

  • 服务注册
代码语言:bash
复制
curl -X PUT 'http://cluster-ip:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
  • 服务发现
代码语言:bash
复制
curl -X GET 'http://cluster-ip:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'
  • 发布配置
代码语言:bash
复制
curl -X POST "http://cluster-ip:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=helloWorld"
  • 获取配置
代码语言:bash
复制
curl -X GET "http://cluster-ip:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"

operator部署nacos

上面我们是通过yaml一步步部署nacos,如果您觉得麻烦,也可以用operator来部署nacos。

这里就不部署了,可以参考文档https://github.com/nacos-group/nacos-k8s/blob/master/operator/README-CN.md

helm部署nacos

nacos也提供了helm的方式部署,可以参考文档https://github.com/nacos-group/nacos-k8s/tree/master/helm

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • k8s搭建nacos
    • 创建namespace部署nacos
    • 部署mysql服务
    • 部署nacos
    • 配置ingress访问ui页面
    • nacos使用示例
    • operator部署nacos
    • helm部署nacos
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档