我正在努力在kubernetes上部署简单的ktor应用程序,即使用config-map而不是application.yaml
fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)
fun Application.module() {
val secret = environment.config.propertyOrNull("custom.secret")?.getString()?:"nothing"
val config = environment.config.propertyOrNull("custom.url")?.getString()?:"url null"
routing {
get("/env") { call.respondText { secret } }
get("/config") { call.respondText { config } }
}
}
字符串
并且应用.yaml是:
custom:
secret: "secretApplicationYaml"
url: "urlApplicationYaml"
型
当我创建k8s部署时:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: cm-volume
name: cm-volume
spec:
replicas: 1
selector:
matchLabels:
app: cm-volume
template:
metadata:
labels:
app: cm-volume
spec:
volumes:
- name: from-file
configMap:
name: from-file
containers:
- image: bogmilos/volume-config-map:0.0.5
name: volume-config-map
volumeMounts:
- name: from-file
mountPath: config
型
使用各自的config-map:
apiVersion: v1
data:
application.yaml: |
ktor:
environment: "dev"
deployment:
port: 8080
application:
modules:
- config.server.MainKt.module
custom:
secret: "secretCM"
url: "urlCM"
kind: ConfigMap
metadata:
creationTimestamp: null
name: from-file
型
我的期望是ktor将在端点get("/env") { call.respondText { secret } }
上返回secretCM
的值,然而该值是来自secretApplicationYaml
的值。我假设ktor应用程序被打包到fatjar中时,它只读取随它一起发布的application.yaml。当我进入容器并查看/config目录时,存储了包含正确信息的application.yaml。有人能帮帮我吗?我试图创建容器env变量,但没有成功,ktor只从附带的应用程序中读取。yaml
1条答案
按热度按时间cbwuti441#
如果您说
/config
目录中的application.yaml
文件具有预期的内容,那么我假定您的ConfigMap
配置是正确的。因此,看起来您的Ktor应用程序在获取配置文件时遇到了问题。我假设在
Dockerfile
中的某个地方有一个类似于java -jar myApp.jar
的入口点命令。由于在代码中使用了EngineMain
,因此可以使用-config
键提供外部配置文件:java -jar myApp.jar -config=/config/application.yaml
。您可以在文档中找到有关Ktor应用的命令行配置的更多信息:https://ktor.io/docs/configuration-file.html#command-line