我在测试时有一项重复的任务,需要连接到cassandra pod并运行几个CQL查询。
这是";手动";方法:
-
在集群控制器节点上,我使用kubectl在pod上执行一个shell:
kubectl exec pod/my-app-cassandra-pod-name -it --namespace myns -- /bin/bash
-
进入pod后,我执行cqlsh:
cqlsh $(hostname -i) -u myuser
,然后交互输入密码 -
我以交互方式执行我的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
语句包含外壳元字符