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
这里就不做介绍了
本文来自博客园,作者:厚礼蝎,转载请注明原文链接:https://www.cnblogs.com/guangdelw/p/18899196

浙公网安备 33010602011771号