环境准备
Kubernetes准备
你需要准备一个Kubernetes集群,如图我的集群已经准备完毕:
数据库准备
nacos可以将配置文件存储到数据库当中,所以我们要先准备一个拥有nacos数据表结构的数据库,这样的数据库镜像我已经准备好了,当然你也可以自己制作这个镜像:
registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/nacos-mysql:2.0.4
我之前写过一篇Kubernetes上安装数据库的文章:https://blog.csdn.net/m0_51510236/article/details/132482351,这里我就直接上yaml文件了,注意镜像使用的是上面提到的带有nacos配置表结构的镜像:
apiVersion: v1 kind: Namespace metadata: name: deploy-test spec: {} status: {} --- apiVersion: v1 kind: PersistentVolume metadata: name: deploy-mysql-nfs-pv namespace: deploy-test spec: capacity: storage: 1Gi accessModes: - ReadWriteMany nfs: # 注意修改你的nfs服务器地址和目录 server: 192.168.1.160 path: /data/nfs/nacos-mysql storageClassName: "nfs" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: deploy-mysql-nfs-pvc namespace: deploy-test spec: accessModes: - ReadWriteMany storageClassName: "nfs" resources: requests: storage: 1Gi volumeName: deploy-mysql-nfs-pv --- apiVersion: v1 data: # 密码为root,具体密码设置可参考我上篇文章 mysql_root_password: cm9vdA== kind: Secret metadata: name: mysql-password namespace: deploy-test --- apiVersion: v1 kind: Service metadata: name: deploy-mysql-svc namespace: deploy-test labels: app: mysql spec: ports: - port: 3306 name: mysql targetPort: 3306 nodePort: 30306 selector: app: mysql type: NodePort sessionAffinity: ClientIP --- apiVersion: apps/v1 kind: StatefulSet metadata: name: deploy-mysql namespace: deploy-test spec: selector: matchLabels: app: mysql serviceName: "deploy-mysql-svc" replicas: 1 template: metadata: labels: app: mysql spec: terminationGracePeriodSeconds: 10 containers: - args: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci - --lower_case_table_names=1 - --default-time_zone=+8:00 name: mysql image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/nacos-mysql:2.0.4 ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-data mountPath: /var/lib/mysql env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: key: mysql_root_password name: mysql-password volumes: - name: mysql-data persistentVolumeClaim: claimName: deploy-mysql-nfs-pvc
查看创建结果:
kubectl get all -o wide -n deploy-test
发现容器以及运行:
进入容器当中查看表结构:
kubectl exec -itn deploy-test pod/deploy-mysql-0 -- mysql -uroot -p
查看结果,目前已经拥有这样的表结构:
部署nacos集群
我们部署mysql的时候创建了一个 deploy-test 命名空间,部署nacos的时候将nacos部署到这个命名空间当中。
官方镜像地址
nacos官方提供的镜像地址:https://hub.docker.com/r/nacos/nacos-server,在当中我们可以看到有那么多环境变量配置:
创建configmap
上面那张图片中我们要用到这么几个参数:
参数名 | 描述 |
MODE | nacos启动模式,cluster为集群模式,standalone为单节点模式 |
NACOS_SERVERS | nacos集群的服务器地址,格式为 ip1:port ip2:port 多个用空格隔开 |
SPRING_DATASOURCE_PLATFORM | nacos使用的数据库,只支持mysql |
MYSQL_SERVICE_HOST | mysql服务器地址 |
MYSQL_SERVICE_PORT | mysql的端口,默认为3306 |
MYSQL_SERVICE_DB_NAME | nacos配置的数据库名,我们创建mysql时配置的数据库名为nacos_config |
MYSQL_SERVICE_USER | mysql的用户名 |
MYSQL_SERVICE_PASSWORD | mysql的密码 |
MYSQL_DATABASE_NUM | mysql数据库的数量,默认为1 |
MYSQL_SERVICE_DB_PARAM | mysql连接字符串后面的参数,默认:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false |
JVM_XMS | jvm永久区最小大小,默认:1g |
JVM_XMX | jvm永久区最大大小,默认:1g |
JVM_XMN | jvm新生区大小,默认:512m |
我们根据上面参数创建一个configmap,执行下面代码获取创建configmap的k8s资源清单文件yaml:
kubectl create configmap nacos-deploy-config -n deploy-test \ --from-literal=mode=cluster \ --from-literal=nacos-servers='deploy-nacos-0.deploy-nacos-svc.deploy-test.svc.cluster.local:8848 deploy-nacos-1.deploy-nacos-svc.deploy-test.svc.cluster.local:8848' \ --from-literal=spring-datasource-platform=mysql \ --from-literal=mysql-service-host='deploy-mysql-0.deploy-mysql-svc.deploy-test.svc.cluster.local' \ --from-literal=mysql-service-port=3306 \ --from-literal=mysql-service-db-name=nacos_config \ --from-literal=mysql-service-user=root \ --from-literal=mysql-database-num=1 \ --from-literal=mysql-service-db-param='characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false' \ --from-literal=jvm-xms=256m \ --from-literal=jvm-xmx=256m \ --from-literal=jvm-xmn=128m \ --dry-run=client -o yaml
注意下面这一行:
--from-literal=nacos-servers='deploy-nacos-0.deploy-nacos-svc.deploy-test.svc.cluster.local:8848 deploy-nacos-1.deploy-nacos-svc.deploy-test.svc.cluster.local:8848'
因为我们这次只部署两个节点的集群,如果你打算部署多个节点,那么你往后面加即可。同时这行命令我们也没设置数据库的密码,这是因为我们创建mysql的时候就创建了一个密码的secret,待会直接使用即可。我们看这行命令的执行结果:
发现成功创建了一个k8s的configmap资源清单文件,文件内容:
apiVersion: v1 data: jvm-xmn: 128m jvm-xms: 256m jvm-xmx: 256m mode: cluster mysql-database-num: "1" mysql-service-db-name: nacos_config mysql-service-db-param: characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false mysql-service-host: deploy-mysql-0.deploy-mysql-svc.deploy-test.svc.cluster.local mysql-service-port: "3306" mysql-service-user: root nacos-servers: deploy-nacos-0.deploy-nacos-svc.deploy-test.svc.cluster.local:8848 deploy-nacos-1.deploy-nacos-svc.deploy-test.svc.cluster.local:8848 spring-datasource-platform: mysql kind: ConfigMap metadata: name: nacos-deploy-config namespace: deploy-test
先将这个yaml保存下来以供接下来使用:
创建部署文件
部署文件内容:
apiVersion: v1 kind: Service metadata: name: deploy-nacos-svc namespace: deploy-test labels: app: nacos spec: ports: - port: 8848 name: nacos targetPort: 8848 nodePort: 30848 selector: app: nacos type: NodePort sessionAffinity: ClientIP --- apiVersion: apps/v1 kind: StatefulSet metadata: name: deploy-nacos namespace: deploy-test spec: selector: matchLabels: app: nacos serviceName: "deploy-nacos-svc" replicas: 2 template: metadata: labels: app: nacos spec: terminationGracePeriodSeconds: 10 containers: - name: nacos # 如果能拉取到dockerhub上的镜像就用这个 # image: docker.io/nacos/nacos-server:v2.0.4 # 拉取不到dockerhub上的镜像就用我推送到阿里云上的nacos官方镜像 image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/nacos-server:v2.0.4 ports: - containerPort: 8848 name: nacos env: # 引用各类环境变量为nacos做配置,注意大部分引用configmap,只有数据库密码引用的创建mysql时候的secret - name: JVM_XMN valueFrom: configMapKeyRef: key: jvm-xmn name: nacos-deploy-config - name: JVM_XMS valueFrom: configMapKeyRef: key: jvm-xms name: nacos-deploy-config - name: JVM_XMX valueFrom: configMapKeyRef: key: jvm-xmx name: nacos-deploy-config - name: MODE valueFrom: configMapKeyRef: key: mode name: nacos-deploy-config - name: MYSQL_DATABASE_NUM valueFrom: configMapKeyRef: key: mysql-database-num name: nacos-deploy-config - name: MYSQL_SERVICE_DB_NAME valueFrom: configMapKeyRef: key: mysql-service-db-name name: nacos-deploy-config - name: MYSQL_SERVICE_DB_PARAM valueFrom: configMapKeyRef: key: mysql-service-db-param name: nacos-deploy-config - name: MYSQL_SERVICE_HOST valueFrom: configMapKeyRef: key: mysql-service-host name: nacos-deploy-config - name: MYSQL_SERVICE_PASSWORD valueFrom: secretKeyRef: key: mysql_root_password name: mysql-password - name: MYSQL_SERVICE_PORT valueFrom: configMapKeyRef: key: mysql-service-port name: nacos-deploy-config - name: MYSQL_SERVICE_USER valueFrom: configMapKeyRef: key: mysql-service-user name: nacos-deploy-config - name: NACOS_SERVERS valueFrom: configMapKeyRef: key: nacos-servers name: nacos-deploy-config - name: SPRING_DATASOURCE_PLATFORM valueFrom: configMapKeyRef: key: spring-datasource-platform name: nacos-deploy-config
根据yaml资源清单文件部署nacos
根据上面步骤我们得到了完整的 deploy-nacos.yaml 文件内容:
apiVersion: v1 data: jvm-xmn: 128m jvm-xms: 256m jvm-xmx: 256m mode: cluster mysql-database-num: "1" mysql-service-db-name: nacos_config mysql-service-db-param: characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false mysql-service-host: deploy-mysql-0.deploy-mysql-svc.deploy-test.svc.cluster.local mysql-service-port: "3306" mysql-service-user: root nacos-servers: deploy-nacos-0.deploy-nacos-svc.deploy-test.svc.cluster.local:8848 deploy-nacos-1.deploy-nacos-svc.deploy-test.svc.cluster.local:8848 spring-datasource-platform: mysql kind: ConfigMap metadata: name: nacos-deploy-config namespace: deploy-test --- apiVersion: v1 kind: Service metadata: name: deploy-nacos-svc namespace: deploy-test labels: app: nacos spec: ports: - port: 8848 name: nacos targetPort: 8848 nodePort: 30848 selector: app: nacos type: NodePort sessionAffinity: ClientIP --- apiVersion: apps/v1 kind: StatefulSet metadata: name: deploy-nacos namespace: deploy-test spec: selector: matchLabels: app: nacos serviceName: "deploy-nacos-svc" replicas: 2 template: metadata: labels: app: nacos spec: terminationGracePeriodSeconds: 10 containers: - name: nacos image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/nacos-server:v2.0.4 ports: - containerPort: 8848 name: nacos env: - name: JVM_XMN valueFrom: configMapKeyRef: key: jvm-xmn name: nacos-deploy-config - name: JVM_XMS valueFrom: configMapKeyRef: key: jvm-xms name: nacos-deploy-config - name: JVM_XMX valueFrom: configMapKeyRef: key: jvm-xmx name: nacos-deploy-config - name: MODE valueFrom: configMapKeyRef: key: mode name: nacos-deploy-config - name: MYSQL_DATABASE_NUM valueFrom: configMapKeyRef: key: mysql-database-num name: nacos-deploy-config - name: MYSQL_SERVICE_DB_NAME valueFrom: configMapKeyRef: key: mysql-service-db-name name: nacos-deploy-config - name: MYSQL_SERVICE_DB_PARAM valueFrom: configMapKeyRef: key: mysql-service-db-param name: nacos-deploy-config - name: MYSQL_SERVICE_HOST valueFrom: configMapKeyRef: key: mysql-service-host name: nacos-deploy-config - name: MYSQL_SERVICE_PASSWORD valueFrom: secretKeyRef: key: mysql_root_password name: mysql-password - name: MYSQL_SERVICE_PORT valueFrom: configMapKeyRef: key: mysql-service-port name: nacos-deploy-config - name: MYSQL_SERVICE_USER valueFrom: configMapKeyRef: key: mysql-service-user name: nacos-deploy-config - name: NACOS_SERVERS valueFrom: configMapKeyRef: key: nacos-servers name: nacos-deploy-config - name: SPRING_DATASOURCE_PLATFORM valueFrom: configMapKeyRef: key: spring-datasource-platform name: nacos-deploy-config
接下来执行这行命令开始部署:
kubectl apply -f deploy-nacos.yaml
查看执行结果:
执行这行命令查看部署结果:
kubectl get pod -o wide -n deploy-test
执行后的结果可以看到两个nacos节点部署成功:
执行这行命令查看nacos暴露的nodeport端口:
kubectl get svc -o wide -n deploy-test
可以看到端口为 30848 :
我们可以通过任何一个Kubernetes节点的IP地址加上这个端口访问nacos:
输入默认的用户名和密码 nacos/nacos 即可登陆到首页:
我们来到 集群管理->节点管理 可以看到两个节点都为up状态:
接下来我们来到 配置管理->配置列表 点击 + 新增一个配置:
我们先随便新增一个yaml配置文件:
点击下面的发布之后查看数据库:
数据库里面已经新增了这个配置的数据。Kubernetes集群里面安装nacos集群就已经安装好了。