如何使用 nslookup 通过变量传递 dns?

时间:2021-01-08 15:12:15

标签: bash kubernetes

朋友们,我正在尝试实现一个 init 容器,它将检查 MYSQL 是否已准备好进行连接,我正在尝试为此使用 nslookup。重点是,如何通过变量传递dns?

它是这样工作的:

command: ['sh', '-c', 'until nslookup mysql-primary.default.svc.cluster.local; 
do echo waiting for mysql; sleep 2; done;']

但不是这样:

command: ['sh', '-c', 'until nslookup $(MYSQL_HOST); do echo waiting for mysql; sleep 2; done;']

知道如何使第二个选项起作用吗?

2 个答案:

答案 0 :(得分:2)

MYSQL_HOST 似乎是一个环境变量而不是命令。

$(MYSQL_HOST) 将在子 shell 中作为命令执行 MYSQL_HOST(在这种情况下不起作用)。

您可能想改用 "${MYSQL_HOST}"

答案 1 :(得分:1)

问题是,$() 执行一个子shell 并尝试在那里评估一个推荐。您真正想要的是通过 ${} 进行变量扩展。

这里有一个工作示例:

一个带有 init-container 的 pod,带有一个 MYSQL_HOST 环境变量:

---
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
spec:
  containers:
    - name: busybox-container
      image: busybox
      command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
    - name: mysql-check
      image: busybox
      command: ['sh', '-c', 'until nslookup ${MYSQL_HOST}; do echo waiting for mysql; sleep 2; done;']
      env:
        - name: MYSQL_HOST
          value: "mysql-primary.default.svc.cluster.local"

创建相应服务后,pod 启动:

kubectl create svc clusterip mysql-primary --tcp=3306

为了完整起见:服务的 YAML(在这种情况下不一定相关)

---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: mysql-primary
  name: mysql-primary
spec:
  ports:
  - name: "3306"
    port: 3306
    protocol: TCP
    targetPort: 3306
  selector:
    app: mysql-primary
  type: ClusterIP
status:
  loadBalancer: {}
相关问题