通过 GKE POD 中的 Cron 执行时,无法使用 Python SDK 将消息发布到 GCP Pub/Sub

Posted

技术标签:

【中文标题】通过 GKE POD 中的 Cron 执行时,无法使用 Python SDK 将消息发布到 GCP Pub/Sub【英文标题】:Unable to publish messages to GCP Pub/Sub using Python SDK when executed via Cron inside a GKE POD 【发布时间】:2019-02-05 09:18:12 【问题描述】:

使用 PYthon SDK 将消息发布到 GCP Pub/SUb。代码在 GKE 上的 Kubernetes POD 中运行。

import pymysql
import os
import argparse
import time
from google.cloud import pubsub_v1

entries = ['jelly']

def publish_messages(project, topic_name):

  publisher = pubsub_v1.PublisherClient()
  topic_path = publisher.topic_path(project, topic_name)

  for n in entries:
    data = u'Message number '.format(n)
    data = data.encode('utf-8')
    publisher.publish(topic_path, data=data)
    print "Message %s sent to queue" % n

脚本在手动执行时工作正常。但是,通过 Crontab 触发时会失败。

Error: No handlers could be found for logger google.cloud.pubsub_v1.publisher._batch.thread"

【问题讨论】:

还要检查主题名称和项目名称。如果它不正确,那么它也会给出这个错误。 【参考方案1】:

找到了解决办法。 默认情况下,crontab 不会从系统环境变量中读取。上面的 Python 代码需要 env 变量“GOOGLE_APPLICATION_CREDENTIALS”,它保存服务帐户密钥(在本例中为 ConfigMap)。 为此,必须在运行时将所有环境变量打印到容器的“/etc/environment”文件中。 像这样的:

FROM ubuntu:latest
ADD send.py Jelly/send.py
COPY jellycron /etc/cron.d/jellycron
RUN apt-get update && apt-get install -y cron vim mysql-server curl python python-pip 
    && pip install --upgrade pymysql google-api-python-client google-cloud google- 
    cloud-pubsub && touch /var/log/cron.log && chmod 0644 /etc/cron.d/jellycron && 
    crontab /etc/cron.d/jellycron
CMD printenv >> /etc/environment && cron && tail -f /var/log/cron.log

【讨论】:

以上是关于通过 GKE POD 中的 Cron 执行时,无法使用 Python SDK 将消息发布到 GCP Pub/Sub的主要内容,如果未能解决你的问题,请参考以下文章

通过 *** 从 GKE Pod 传出的流量

尝试使用 TFX 运行非常简单的 Kubeflow 管道时,为啥 GKE 集群上的 pod 会 OOMkilled?

Pod错误:CrashLoopBackOff(GKE)

使用令牌通过服务帐户登录GKE

是否有任何工具可以根据 kubernetes 中请求的总 pod 自动扩展 GKE 节点?

如何在 gke 中将 kube-controller-manager 中的 --horizo​​ntal-pod-autoscaler-sync-period 字段更改为 5sec