kubernetes - 如何在 kubernetes 中将 jdbc 驱动程序 jar 添加到 skywalking 6.5.0 映像文件中
问题描述
我正在使用 skywalking 6.5.0 来监控我在 kubernetes 集群中的应用程序,这是我的 skywalking ui yaml 配置:
{
"kind": "Deployment",
"apiVersion": "extensions/v1beta1",
"metadata": {
"name": "oap",
"namespace": "fat",
"selfLink": "/apis/extensions/v1beta1/namespaces/fat/deployments/oap",
"uid": "41438118-5ae4-4da2-b3d5-6e082263e360",
"resourceVersion": "44426777",
"generation": 52,
"creationTimestamp": "2020-02-28T02:53:28Z",
"labels": {
"app": "oap",
"release": "skywalking"
},
"annotations": {
"deployment.kubernetes.io/revision": "14",
"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"apps/v1\",\"kind\":\"Deployment\",\"metadata\":{\"annotations\":{},\"name\":\"oap\",\"namespace\":\"dabai-fat\"},\"spec\":{\"replicas\":1,\"selector\":{\"matchLabels\":{\"app\":\"oap\"}},\"template\":{\"metadata\":{\"labels\":{\"app\":\"oap\",\"release\":\"skywalking\"}},\"spec\":{\"containers\":[{\"env\":[{\"name\":\"JAVA_OPTS\",\"value\":\"-Xmx2g -Xms2g\"},{\"name\":\"SW_CLUSTER\",\"value\":\"standalone\"},{\"name\":\"SKYWALKING_COLLECTOR_UID\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.uid\"}}},{\"name\":\"SW_STORAGE\",\"value\":\"elasticsearch\"},{\"name\":\"SW_STORAGE_ES_CLUSTER_NODES\",\"value\":\"172.30.184.10:9200\"},{\"name\":\"SW_NAMESPACE\",\"value\":\"dabai-fat\"},{\"name\":\"SW_ES_USER\",\"value\":\"elastic\"},{\"name\":\"SW_ES_PASSWORD\",\"value\":\"XXXXXX\"}],\"image\":\"registry.cn-hangzhou.aliyuncs.com/dabai_app_k8s/dabai_fat/skywalking-oap-server:6.5.0\",\"imagePullPolicy\":\"Always\",\"livenessProbe\":{\"initialDelaySeconds\":15,\"periodSeconds\":20,\"tcpSocket\":{\"port\":12800}},\"name\":\"oap\",\"ports\":[{\"containerPort\":11800,\"name\":\"grpc\"},{\"containerPort\":12800,\"name\":\"rest\"}],\"readinessProbe\":{\"initialDelaySeconds\":15,\"periodSeconds\":20,\"tcpSocket\":{\"port\":12800}},\"resources\":{\"limits\":{\"memory\":\"2Gi\"},\"requests\":{\"memory\":\"1Gi\"}}}],\"imagePullSecrets\":[{\"name\":\"regcred\"}],\"serviceAccountName\":\"skywalking-oap-sa\"}}}}\n"
}
},
"spec": {
"replicas": 1,
"selector": {
"matchLabels": {
"app": "oap"
}
},
"template": {
"metadata": {
"creationTimestamp": null,
"labels": {
"app": "oap",
"release": "skywalking"
},
"annotations": {
"kubectl.kubernetes.io/restartedAt": "2020-04-18T18:30:58+08:00"
}
},
"spec": {
"containers": [
{
"name": "oap",
"image": "registry.cn-hangzhou.aliyuncs.com/dabai_app_k8s/dabai_fat/skywalking-oap-server:6.5.0",
"ports": [
{
"name": "grpc",
"containerPort": 11800,
"protocol": "TCP"
},
{
"name": "rest",
"containerPort": 12800,
"protocol": "TCP"
}
],
"env": [
{
"name": "JAVA_OPTS",
"value": "-Xmx2g -Xms2g"
},
{
"name": "SW_CLUSTER",
"value": "standalone"
},
{
"name": "SKYWALKING_COLLECTOR_UID",
"valueFrom": {
"fieldRef": {
"apiVersion": "v1",
"fieldPath": "metadata.uid"
}
}
},
{
"name": "SW_STORAGE",
"value": "mysql"
},
{
"name": "SW_JDBC_URL",
"value": "jdbc:mysql://45.131.218.134:3309/report?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&useSSL=false&verifyServerCertificate=false"
},
{
"name": "SW_NAMESPACE",
"value": "fat"
},
{
"name": "SW_DATA_SOURCE_USER",
"value": "root"
},
{
"name": "SW_DATA_SOURCE_PASSWORD",
"value": "uwesGwew2rewd109dskhgwugPD"
}
],
"resources": {
"limits": {
"memory": "2Gi"
},
"requests": {
"memory": "1Gi"
}
},
"livenessProbe": {
"tcpSocket": {
"port": 12800
},
"initialDelaySeconds": 15,
"timeoutSeconds": 1,
"periodSeconds": 20,
"successThreshold": 1,
"failureThreshold": 3
},
"readinessProbe": {
"tcpSocket": {
"port": 12800
},
"initialDelaySeconds": 15,
"timeoutSeconds": 1,
"periodSeconds": 20,
"successThreshold": 1,
"failureThreshold": 3
},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"imagePullPolicy": "IfNotPresent"
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 30,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "skywalking-oap-sa",
"serviceAccount": "skywalking-oap-sa",
"securityContext": {},
"imagePullSecrets": [
{
"name": "regcred"
}
],
"schedulerName": "default-scheduler"
}
},
"strategy": {
"type": "RollingUpdate",
"rollingUpdate": {
"maxUnavailable": "25%",
"maxSurge": "25%"
}
},
"revisionHistoryLimit": 10,
"progressDeadlineSeconds": 600
},
"status": {
"observedGeneration": 52,
"replicas": 1,
"updatedReplicas": 1,
"unavailableReplicas": 1,
"conditions": [
{
"type": "Progressing",
"status": "True",
"lastUpdateTime": "2020-08-20T13:34:42Z",
"lastTransitionTime": "2020-04-02T03:01:31Z",
"reason": "NewReplicaSetAvailable",
"message": "ReplicaSet \"oap-7cffc4c77d\" has successfully progressed."
},
{
"type": "Available",
"status": "False",
"lastUpdateTime": "2020-08-20T13:34:52Z",
"lastTransitionTime": "2020-08-20T13:34:52Z",
"reason": "MinimumReplicasUnavailable",
"message": "Deployment does not have minimum availability."
}
]
}
}
当 pod 启动时,日志输出如下:
java.lang.RuntimeException: Failed to get driver instance for jdbcUrl=jdbc:mysql://45.131.218.134:3309/report?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&useSSL=false&verifyServerCertificate=false
at com.zaxxer.hikari.util.DriverDataSource.<init>(DriverDataSource.java:110) ~[HikariCP-3.1.0.jar:?]
at com.zaxxer.hikari.pool.PoolBase.initializeDataSource(PoolBase.java:334) ~[HikariCP-3.1.0.jar:?]
at com.zaxxer.hikari.pool.PoolBase.<init>(PoolBase.java:109) ~[HikariCP-3.1.0.jar:?]
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:108) ~[HikariCP-3.1.0.jar:?]
at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:81) ~[HikariCP-3.1.0.jar:?]
at org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCHikariCPClient.connect(JDBCHikariCPClient.java:44) ~[library-client-6.5.0.jar:6.5.0]
at org.apache.skywalking.oap.server.storage.plugin.jdbc.mysql.MySQLStorageProvider.start(MySQLStorageProvider.java:123) ~[storage-jdbc-hikaricp-plugin-6.5.0.jar:6.5.0]
at org.apache.skywalking.oap.server.library.module.BootstrapFlow.start(BootstrapFlow.java:61) ~[library-module-6.5.0.jar:6.5.0]
at org.apache.skywalking.oap.server.library.module.ModuleManager.init(ModuleManager.java:67) ~[library-module-6.5.0.jar:6.5.0]
at org.apache.skywalking.oap.server.starter.OAPServerStartUp.main(OAPServerStartUp.java:43) [server-starter-6.5.0.jar:6.5.0]
Caused by: java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getDriver(DriverManager.java:315) ~[?:1.8.0_181]
at com.zaxxer.hikari.util.DriverDataSource.<init>(DriverDataSource.java:103) ~[HikariCP-3.1.0.jar:?]
... 9 more
我看了skywalking官方issue告诉我因为mysql jdbc是GPL许可证,SkyWalking是Apache许可证,所以我必须自己添加jdbc驱动,但是如何将jdbc驱动jar添加到镜像文件中呢?我没有想法。
解决方案
如何将jdbc驱动jar添加到镜像文件中?
一种方法是通过initContainer:
人工注入 jdbc 驱动程序-Xbootclasspath
initContainers:
- name: download
image: busybox:latest
command:
- wget
- -O
- /foo/jdbc.jar
- https://whatever-the-jdbc-url-jar-is-goes-here
volumeMounts:
- name: tmp
mountPath: /foo
containers:
- env:
- name: JAVA_OPTS
value: -Xmx2g -Xbootclasspath/a:/foo/jdbc.jar
volumeMounts:
- name: tmp
mountPath: /foo
volumes:
- name: tmp
emptyDir: {}
一个类似的,虽然风险稍高的方法是找到一个已经在图像的类路径上的路径,并尝试将 jar 路径卷挂载到该目录中
鉴于您的图像看起来像是自定义构建的,所有这些似乎都没有实际意义,因此正确的操作是更新Dockerfile
它以在构建时下载 jar
推荐阅读
- python-2.7 - 解析错误:符号处的 WHERE 标识符无效 (
- plugins - UE4 - 包括实验性引擎插件
- sql - oracle sql中选择具有不同值的列的方法
- react-native - 可触摸的不透明度事件处理停止在高程上工作
- typescript - 如何解决打字稿中隐含的任何类型以索引类型错误?
- mrtk - 如何调试 MRTK UWP IL2CPP?
- angular - 输入后无法在另一个子组件上更新子组件数据
- javascript - 样条图中一个类别中的多个数据
- sql - Spark SQL中PIVOT操作的时间和空间复杂度是多少?
- couchbase - Couchbase 超时但未登录系统:completed_requests