我在测试时执行了一项重复性任务,需要连接到 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 exec 的“命令”部分中使用 shell 变量。我将需要 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'd cqlsh中断,第二次成功:
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
问题。您的变量和仅可用于当前会话中的 shell 进程。exec
当被调用时,这些相同的变量对于您连接到的 pod 不可用。该$CASS_IP
变量不会扩展为该值- 它只是通过导致“未知主机”错误而被“消耗”时192.168.79.208
保持不变:$CASS_IP
exec
一种解决方法是在您将调用的 pod 中创建一个 shell 脚本
kubectl exec
,类似于您运行cqlsh
它本身只是一个 shell 脚本的方式。不同之处在于您的 shell 脚本将包含以下cqlsh
命令:然后,您将使用以下命令运行您的脚本:
干杯!