Kubernetes云日志验证问题



我一直在尝试将我的应用程序切换为使用谷歌云日志记录(又名Stackdriver)。我已经构建了一个自定义的Logback appender,它使用Google Java云日志库。

当我在IDE中运行我的应用程序时,它会正确地登录到Google Cloud Logging。当我在GKE上的Kubernetes容器中运行它时,我会得到一个身份验证错误。然而,在这两种情况下,我都使用相同的GCP服务帐户。

我甚至从Google凭证对象输出密钥,以证明它们在每个环境中都是相同的。他们是。

有人知道我可能错过了什么吗?是否存在任何可能导致容器内部身份验证失败的上下文相关设置?有人知道下一步该做什么吗?


更新:这是堆栈跟踪:

java.lang.RuntimeException:java.util.courrent.ExecutionException:com.google.cloud.logging.LoggingException:io.grpc.StatusRuntimeException:UNAUTHENTICATED:凭据应使用fail(),而不是在java.lang.RuntimeException:java.til.courrent.EexecutionException:com.google.cloud.logling.logging LoggingException:io.grpc.statusRuntime Exception:UNAUTHESTICATED:凭据应使用fail(),而不是在位于的com.google.cloud.logging.InggingImpl.flush(LoggingImpl.java:579)处的com.google.co.prrocessflows.platform.util.StackdriverAppender.append(StackdriverAppendr.kt:135)处的uk.co.prprocessflows.platform.util.StockdriverAppander.append位于的ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppanderBase.java:84)位于的ch.qos.logback.classic.Logger.appendLoopOnAppenders(AppenderAttaableImpl.java:51)ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:421),位于ch.qos.lokback.classical.Logger.filterAndLog_0_Or3Plus(Logger.java:383),位于u.co.processflows.platform.pushnotification.PushNotificationClient.forward(PushNotificationClient.kt:58),位于位于的java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)位于的java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)com.sun.proxy.$Proxy69.broadcastMessageToTenant(未知源),位于uk.co.prprocessflows.platform.workflow.TaskLockControllerImpl$lockTask$2.run(TaskLockControllerImpl.kt:94),位于java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executitors.java:515),位于java.base/java.util.concurrent.ThreadExecutor.runWorker(ThreadPoolExecutor.java:1128)位于java.base/java.concurrent.ShreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)位于java.base/java.lang.Thread.run(Thread.java:835)由以下原因引起:java.util.courrent.ExecutionException:com.google.cloud.logging.LoggingException:io.grpc.StatusRuntimeException:UNAUTHENTICATED:凭据应该使用fail(),而不是在com.google.commun.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:552)上抛出异常(ForwardingFuture.java:68)在com.google.cloud.LoggingImpl.flush(LoggingImpl.java:577)。。。遗漏了25个常见帧由以下原因引起:com.google.cloud.logging.LoggingException:io.grpc.StatusRuntimeException:UNAUTHENTICATED:凭据应使用fail(),而不是在com.google.ccloud.logging.spi.v2.GrpcLoggingRpc$2.applycom.google.api.core.ApiFutures$GaxFunctionToGuavaFunction.apply(ApiForets.java:204),网址为com.google.common.util.concurrent.AbstractCatchingFuture$CatchingFuture.doFallback(AbstractCatching Future.java:206)(AbstractCatchingFuture.java:107),位于com.google.common.util.concurrent.DirectExecutor.execute(DirectExecutor.java:30),位于com.ibm.google.common.util.concurrent.AbstractFuture.executeListener(Abstract Future.java:1138)在com.google.api.core.AbstractApiFuture$InternalSettableFuture.setException(AbstractApiFFuture.java:95)在com.google.cai.gax.rpc.BatchedFuture.setException(BatchedFuture.java:55)在www.google.api.gax.rpc.BatchedRequestIssuer.sendResult(BatchedRequestIssuer.java:84)在com.google.api.gax.rpc.BatchExecutor$1.onFailur


更新2:

我刚刚发现,在堆栈跟踪的层次结构导致的内部深处有这样的消息。

引起原因:java.lang.NoSuchMethodError:io.grpc.MethodDescriptor.getServiceName()Ljava/lang/String;位于io.grpc.auth.GoogleAuthLibraryCallCredentials.serviceUri(GoogleAuthLibraryCallCredentials.java:162)

这听起来不像是身份验证问题。

Update当我最初回答这个问题时,我没有看到堆栈跟踪,这让我相信你的问题根本与身份验证无关。我的答案可能与那些在GKE中看到GCP API身份验证问题的人有关,所以我将把原件留在这里。

原始如果您遇到身份验证错误,很可能您没有正确使用服务帐户密钥。您可以阅读本教程来了解应该如何完成。简而言之,您需要将服务帐户密钥导出为JSON文件,并将其作为机密挂载。

考虑到使用库的问题,您可能需要直接编写日志。这篇关于创建结构化日志的文档可能会有所帮助。

原来GRPC jar存在依赖性兼容性问题。我们的应用程序使用GRPC,就像谷歌可能记录库一样。将我们的应用程序更改为使用谷歌云日志库所针对的旧版本GRPC解决了这个问题。

在容器中运行时,jar文件的加载顺序与本地运行的顺序不同。因此,为什么这种情况只发生在Kubernetes内部。

最新更新