Scripting

從 shell 腳本執行 Cassandra pod CQL 查詢,使用帶有 kubectl exec 的 shell 變數

  • July 27, 2022

我在測試時執行了一項重複性任務,需要連接到 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 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

socket.gaierror: [Errno -2] Name or service not known

一種解決方法是在您將呼叫的 pod 中創建一個 shell 腳本kubectl exec,類似於您執行cqlsh它本身只是一個 shell 腳本的方式。不同之處在於您的 shell 腳本將包含以下cqlsh命令:

/opt/cassandra/bin/cqlsh $(hostname -i) \
   -u myuser -p 'mypass' \
   -e 'SELECT now() FROM system.local';

然後,您將使用以下命令執行您的腳本:

$ kubectl exec pod/my-pod-name -it --namespace myns -- /path/to/my_script.sh

乾杯!

引用自:https://dba.stackexchange.com/questions/314892