在“ dataflowrunner”工作程序上安装kubectl

时间:2019-01-07 18:40:14

标签: python elasticsearch kubectl dataflow google-cloud-sdk

我想在kubernetes上运行的Elasticsearch集群中播种数据。我拥有的数据在Bigquery上,我想使用dataflow(python)加载数据。 python apache-beam版本似乎没有弹性搜索接收器。我在数据流中编写了自己的elasticsearch编写器,但是我需要从kubernetes集群中转发我的elasticsearch端口。所以我需要安装google-cloud-sdk和kubectl,以便我可以转发端口写入我的数据,然后将其关闭。当我在本地运行作业时,我的代码似乎可以正常运行,但似乎无法在工人上安装google-cloud-sdk和kubectl。

当我在本地运行作业时,我的代码似乎可以正常工作,但似乎无法在工人上安装google-cloud-sdk和kubectl。

这些是在子过程setup.py中调用的命令。Popen

['export', 'CLOUD_SDK_REPO="cloud-sdk-$(lsb_release', '-c', '-s)"'],
['echo', '"deb', 'https://packages.cloud.google.com/apt', '$CLOUD_SDK_REPO', 'main"', '|', 'sudo', 'tee', '-a', '/etc/apt/sources.list.d/google-cloud-sdk.list'],
['sudo', 'rm', '/etc/apt/sources.list.d/partner.list'],
['sudo', 'apt-get', 'install', 'google-cloud-sdk', 'kubectl']

这是我用于在start_bundle中转发Elasticsearch服务的端口的方法

def _open_connection(self):
    tries = 0
    connected = False
    while tries <= 3 and not connected:
        tries += 1
        try:
            res = requests.get('http://{0}:{1}'.format(self.host, self.port))
            connected = (res.status_code == 200)
        except Exception as e:
            logging.warning(e)
            subprocess.check_call('gcloud container clusters get-credentials {0}'.format(ES_CLUSTER_NAME), shell=True)
            try:
                subprocess.check_call('kubectl version', shell=True)
            except exception as ee:
                logging.warning(ee)
                subprocess.check_call('gcloud components install kubectl', shell=True)
            subprocess.call('kubectl port-forward elasticsearch-0 {0}:{0} & disown'.format(self.port), shell=True)
            time.sleep(3)
    return connected

我希望这些命令(我尝试过变体)会在每个工作程序上安装所需的软件包,但安装仍会失败。

1 个答案:

答案 0 :(得分:0)

我通过跳过端口转发并改为在我的Elasticsearch端口上实现internal load balancer来解决此问题。这样,我的数据流工作人员可以直接连接到内部IP来写入数据。