将shell变量传递给通过kubectl exec执行的命令



我在测试时有一项重复的任务,需要连接到cassandra pod并运行几个CQL查询。

这是";手动";方法:

  1. 在集群控制器节点上,我使用kubectl在pod上执行一个shell:
    kubectl exec pod/my-app-cassandra-pod-name -it --namespace myns -- /bin/bash

  2. 进入pod后,我执行cqlsh:
    cqlsh $(hostname -i) -u myuser
    ,然后交互输入密码

  3. 我以交互方式执行我的cql查询

现在,我想要一个bash脚本来自动执行此操作。我的意图是通过kubectl exec直接运行cqlsh。

我的问题是,显然我不能在";命令";kubectl执行部分。我需要shell变量来存储a(pod的IP,b(作为第一个查询输入的id,以及c(中间查询结果(后两个还没有添加到脚本中(。

到目前为止,我使用了一个伪CQL查询:

#!/bin/bash
CASS_IP=$(kubectl exec pod/my-app-cassandra-pod-name -it --namespace myns -- /usr/bin/hostname -i)
echo $CASS_IP   # This prints out the IP address just fine, say 192.168.79.208
# The below does not work, errors provided below
kubectl exec pod/my-app-cassandra-pod-name -it --namespace myns -- /opt/cassandra/bin/cqlsh $CASS_IP -u myuser -p 'mypass' -e 'SELECT now() FROM system.local;'
# The below works just fine and returns the CQL query output
kubectl exec pod/my-app-cassandra-pod-name -it --namespace myns -- /opt/cassandra/bin/cqlsh 192.168.79.208 -u myuser -p 'mypass' -e 'SELECT now() FROM system.local;'

上面的输出如下,其中IP得到响应,第一个exec'dcqlsh中断,第二个成功:

192.168.79.208
Warning: Timezone defined and 'pytz' module for timezone conversion not installed. Timestamps will be displayed in UTC timezone.
Traceback (most recent call last):
File "/opt/cassandra/bin/cqlsh.py", line 2357, in <module>
main(*read_options(sys.argv[1:], os.environ))
File "/opt/cassandra/bin/cqlsh.py", line 2326, in main
encoding=options.encoding)
File "/opt/cassandra/bin/cqlsh.py", line 463, in __init__
load_balancing_policy=WhiteListRoundRobinPolicy([self.hostname]),
File "/opt/cassandra/bin/../lib/cassandra-driver-internal-only-3.25.0.zip/cassandra-driver-3.25.0/cassandra/policies.py", line 425, in __init__
File "/opt/cassandra/bin/../lib/cassandra-driver-internal-only-3.25.0.zip/cassandra-driver-3.25.0/cassandra/policies.py", line 426, in <listcomp>
File "/usr/lib64/python3.6/socket.py", line 745, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known
command terminated with exit code 1
Warning: Timezone defined and 'pytz' module for timezone conversion not installed. Timestamps will be displayed in UTC timezone.

system.now()
--------------------------------------
e78e75c0-0d3e-11ed-8825-1de1a1b1c128
(1 rows)

有什么办法绕过这个吗?我已经研究了很长一段时间了,但我被卡住了。。。

这是一个非常常见的问题:正如它的名字所说,kubectl exec使用exec(3)而不是system(3)——在您的情况下,这无论如何都不起作用,因为kubectl exec中的$将由您的shell而不是pod的shell 来解释

但值得庆幸的是,这两个问题的解决方案都是一样的:通过在sh -c调用中包装命令来创建自己的system(3)(或者bash -c,如果你有bash-ism并且bash在pod中可用(:

kubectl exec pod/my-app-cassandra-pod-name -it --namespace myns -- sh -c '/opt/cassandra/bin/cqlsh $(hostname -i) -u myuser -p "mypass" -e "SELECT now() FROM system.local;"'

一如既往地认识到";外部";与";内部";引用,特别是如果你的";mypass";或者-e语句包含外壳元字符

相关内容

  • 没有找到相关文章

最新更新