Skip to content
Nacos 配置中心安全问题汇总及解决方案 Know more

Kubernetes Nacos

This project contains a Nacos Docker image meant to facilitate the deployment of Nacos on Kubernetes via StatefulSets.

Quick Start

  • Clone Project
Terminal window
git clone https://github.com/nacos-group/nacos-k8s.git
  • Simple Start

If you want to start Nacos without NFS, but emptyDirs will possibly result in a loss of data. as follows:

Terminal window
cd nacos-k8s
chmod +x quick-startup.sh
./quick-startup.sh
  • Testing

    • Service registration
    Terminal window
    curl -X POST 'http://cluster-ip:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
    • Service discovery
    Terminal window
    curl -X GET 'http://cluster-ip:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'
    • Publish config
    Terminal window
    curl -X POST "http://cluster-ip:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=helloWorld"
    • Get config
    Terminal window
    curl -X GET "http://cluster-ip:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"

Advanced

In advanced use, the cluster is automatically scaled and data is persisted, but PersistentVolumeClaims must be deployed. In this example, NFS is used.

Deploy NFS

  • Create Role
Terminal window
kubectl create -f deploy/nfs/rbac.yaml

If your K8S namespace is not default, execute the following script before creating RBAC

Terminal window
# Set the subject of the RBAC objects to the current namespace where the provisioner is being deployed
$ NS=$(kubectl config get-contexts|grep -e "^\*" |awk '{print $5}')
$ NAMESPACE=${NS:-default}
$ sed -i'' "s/namespace:.*/namespace: $NAMESPACE/g" ./deploy/nfs/rbac.yaml
  • Create ServiceAccount And deploy NFS-Client Provisioner
Terminal window
kubectl create -f deploy/nfs/deployment.yaml
  • Create NFS StorageClass
Terminal window
kubectl create -f deploy/nfs/class.yaml
  • Verify that NFS is working
Terminal window
kubectl get pod -l app=nfs-client-provisioner

Deploy database

  • Deploy master
Terminal window
cd nacos-k8s
kubectl create -f deploy/mysql/mysql-master-nfs.yaml
  • Deploy slave
Terminal window
cd nacos-k8s
kubectl create -f deploy/mysql/mysql-slave-nfs.yaml
  • Verify that Database is working
Terminal window
# master
kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-master-gf2vd 1/1 Running 0 111m
# slave
kubectl get pod
mysql-slave-kf9cb 1/1 Running 0 110m

Deploy Nacos

  • Modify deploy/nacos/nacos-pvc-nfs.yaml
data:
mysql.master.db.name: "db name"
mysql.master.port: "master db port"
mysql.slave.port: "slave db port"
mysql.master.user: "master db username"
mysql.master.password: "master db password"
  • Create Nacos
Terminal window
kubectl create -f nacos-k8s/deploy/nacos/nacos-pvc-nfs.yaml
  • Verify that Nacos is working
Terminal window
kubectl get pod -l app=nacos
NAME READY STATUS RESTARTS AGE
nacos-0 1/1 Running 0 19h
nacos-1 1/1 Running 0 19h
nacos-2 1/1 Running 0 19h

Scale Testing

  • Use kubectl exec to get the cluster config of the Pods in the nacos StatefulSet.
Terminal window
for i in 0 1; do echo nacos-$i; kubectl exec nacos-$i cat conf/cluster.conf; done

The StatefulSet controller provides each Pod with a unique hostname based on its ordinal index. The hostnames take the form of <statefulset name>-<ordinal index>. Because the replicas field of the nacos StatefulSet is set to 2, In the cluster file only two nacos address

k8s

  • Use kubectl to scale StatefulSets
Terminal window
kubectl scale sts nacos --replicas=3

scale

  • Use kubectl exec to get the cluster config of the Pods in the nacos StatefulSet after scale StatefulSets
Terminal window
for i in 0 1 2; do echo nacos-$i; kubectl exec nacos-$i cat conf/cluster.conf; done

get_cluster_after

  • Use kubectl exec to get the state of the Pods in the nacos StatefulSet after scale StatefulSets
Terminal window
for i in 0 1 2; do echo nacos-$i; kubectl exec nacos-$i curl -X GET "http://localhost:8848/nacos/v1/ns/raft/state"; done

You can find that the new node has joined the cluster

Prerequisites

  • Kubernetes Node configuration(for reference only)
Network IPHostnameConfiguration
172.17.79.3k8s-masterCentOS Linux release 7.4.1708 (Core) Single-core processor Mem 4G Cloud disk 40G
172.17.79.4node01CentOS Linux release 7.4.1708 (Core) Single-core processor Mem 4G Cloud disk 40G
172.17.79.5node02CentOS Linux release 7.4.1708 (Core) Single-core processor Mem 4G Cloud disk 40G
  • Kubernetes version:1.12.2+
  • NFS version:4.1+

Limitations

  • Persistent Volumes must be used. emptyDirs will possibly result in a loss of data

Project directory

Directory NameDescription
pluginHelp Nacos cluster achieve automatic scaling in K8s
deployDeploy the required files

Configuration properties

  • nacos-pvc-nfs.yaml or nacos-quick-start.yaml
NameRequiredDescription
mysql.master.db.nameYMaster database name
mysql.master.portNMaster database port
mysql.slave.portNSlave database port
mysql.master.userYMaster database username
mysql.master.passwordYMaster database password
NACOS_REPLICASYThe number of clusters must be consistent with the value of the replicas attribute
NACOS_SERVER_PORTNNacos port,default:8848
PREFER_HOST_MODEYEnable Nacos cluster node domain name support
  • nfs deployment.yaml
NameRequiredDescription
NFS_SERVERYNFS server address
NFS_PATHYNFS server shared directory
serverYNFS server address
pathYNFS server shared directory
  • mysql yaml
NameRequiredDescription
MYSQL_ROOT_PASSWORDNRoot password
MYSQL_DATABASEYDatabase Name
MYSQL_USERYDatabase Username
MYSQL_PASSWORDYDatabase Password
MYSQL_REPLICATION_USERYMaster-slave replication username
MYSQL_REPLICATION_PASSWORDYMaster-slave replication password
Nfs:serverYNFS server address
Nfs:pathYNFS server shared path