從 shell 腳本執行 Cassandra pod CQL 查詢,使用帶有 kubectl exec 的 shell 變數
我在測試時執行了一項重複性任務,需要連接到 cassandra pod 並執行幾個 CQL 查詢。
這是“手動”方法:
- 在集群控制器節點上,我使用 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
乾杯!