【问题标题】:How to use nslookup passing the dns through a variable? [duplicate]如何使用 nslookup 通过变量传递 dns? [复制]
【发布时间】:2021-01-09 01:25:44
【问题描述】:

朋友们,我正在尝试实现一个 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;']

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

【问题讨论】:

标签: bash kubernetes


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    问题是,$() 执行一个子 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: {}
    

    【讨论】:

      猜你喜欢
      • 2012-03-30
      • 2019-01-22
      • 2021-04-19
      • 2019-06-08
      • 1970-01-01
      • 2010-11-02
      相关资源
      最近更新 更多