k8s部署nacos 一直报错No DataSource set(k8s踩坑--警示-操作失误导致)

前言

环境:k8s 1.22.15
本篇由于个人操作失误导致的问题,下面仅说明排查思路,但是这种思路是错误的,这种思路是错误的,这种思路是错误的,仅写下此篇作为警示。

问题

k8s 部署nacos 最新版本的镜像,启动报错:
在这里插入图片描述
很明显,这是由于连不上mysql数据库,但是为什么连不上mysql数据库呢,首先:
我已经确保我的mysql数据库已经创建了nacos_conf 数据库和nacos/nacos的用户密码,以及导入表结构和数据了,那现在的排查方向就是查看nacos在启动的时候,链接的url地址是否正确。

查看配置文件

[root@master nacos]# kubectl  exec -it nacos-0 -- bash		#进入nacos pod
[root@nacos-0 nacos]# ls
LICENSE  NOTICE  bin  conf  data  logs  target  work
[root@nacos-0 nacos]# cd conf/
[root@nacos-0 conf]# ls
1.4.0-ipv6_support-update.sql  application.properties  nacos-logback.xml  schema.sql  test.sh
[root@nacos-0 conf]# cat application.properties 			#查看配置文件
# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
spring.datasource.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.url.1=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=${MYSQL_SERVICE_USER}
db.password=${MYSQL_SERVICE_PASSWORD}
### The auth system to use, currently only 'nacos' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}


### The token expiration in seconds:
nacos.core.auth.default.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}

### The default token:
nacos.core.auth.default.token.secret.key=${NACOS_AUTH_TOKEN:SecretKey012345678901234567890123456789012345678901234567890123456789}

### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
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:serverIdentity}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:security}
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D
# default current work dir
server.tomcat.basedir=
## spring security config
### turn off security
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/**}
# metrics for elastic search
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
[root@nacos-0 conf]# 

#查看配置文件,我发现有一个看不懂的地方,那就是,全篇很多这种的写法,如下:
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}
#这种写法是不是,如果环境MYSQL_SERVICE_PORT没有值,默认取值3306,如果MYSQL_SERVICE_PORT环境变量有值,择取MYSQL_SERVICE_PORT的值?
为了验证我的想法,在pod里面直接创建一个test文件
vim test.sh
[root@nacos-0 conf]# cat test 
contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
num=${MYSQL_DATABASE_NUM:1}
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}
url_1=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}
user=${MYSQL_SERVICE_USER}
password=${MYSQL_SERVICE_PASSWORD}

echo $contextPath
echo $num
echo $url_0
echo $url_1
echo $user
echo $password
[root@nacos-0 conf]# bash test.sh


jdbc:mysql://mysql-primary-headless.default.svc.cluster.local:/nacos_conf?
jdbc:mysql://mysql-primary-headless.default.svc.cluster.local:/nacos_conf?
nacos
nacos

#先查看环境变量
[root@nacos-0 conf]# env | grep -Ei 'SERVER_SERVLET_CONTEXTPATH|MYSQL_DATABASE_NUM|MYSQL_SERVICE_HOST|MYSQL_SERVICE_PORT'
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_HOST=mysql-primary-headless.default.svc.cluster.local
[root@nacos-0 conf]# 
#以上节点输出结果显示,数据链接url存在问题,这种的变量${MYSQL_SERVICE_PORT:3306},根本不是当MYSQL_SERVICE_PORT有值是就是MYSQL_SERVICE_PORT的值,当MYSQL_SERVICE_PORT没值时就是3306,而是就是把它${MYSQL_SERVICE_PORT:3306}当成一个完完全全的变量,正因为这变量不存在,所以才导致url有一次。
这样定义${MYSQL_SERVICE_PORT:-3306},加一个-才是正确的,这样才是当MYSQL_SERVICE_PORT没值时默认3306。

以上问题,不明白是官方的问题还是什么问题,只能重新创建一个cm,将自定义application.properties文件挂载到pod里面去了。
本篇作为警示,最后发现是configmap里面配置的数据库名称错误,mysql是nacos_config,而configmap里面key配置成了nacos_conf。
官方的application.properties文件是正确的。官方的application.properties文件是正确的。
至于为什么在pod里面echo ${MYSQL_SERVICE_PORT:-3306},取到空值,可能根本不能这样echo吧,容器在启动的时候加载application.properties文件可能做了什么判断,这我们又不能看到,所以,不要使用echo 环境变量的方式来判断数据库url的取值,看不出来的。

猜你喜欢

转载自blog.csdn.net/MssGuo/article/details/130274087