跳转至

K8s Pod 如何配置免密

MPI Operator 在执行 MPI 作业时,通过 SSH 的方式,因此需要在不同的 MPI Workers Pod间配置免密。

本文通过源码分析,探究如何在 K8s Pod 间配置免密。

SSH 免密

一般常规的免密操作,都是在不同的节点上,通过 ssh-keygen 生成公钥和私钥,然后将所有节点的公钥都写到各个节点的authorized_keys文件中。

但是查看 volcano mpi 的实现,可以知道Pod 使用同样的私钥/公钥,可以互相免密访问

因此,只需生成同样的 id_rsaid_rsa.pub,然后将 authorized_keys的内容设为id_rsa.pub一致。

最后配置下config文件:

# 第一次访问时,无需确认,直接连接
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
# pod 间无法通过 hostname 直接访问对方的,因此需要 service
Host pod-hostname-1
  HostName  pod-hostname-1.service-name
Host pod-hostname-2
  HostName  pod-hostname-2.service-name

id_rsa,id_rsa.pub,authorized_keys,config作为 configmap的内容。

Pod 主机名解析

pod 间无法通过 hostname 直接访问对方的,因此需要 service:

hostname 必须是规则化,才可以静态生成所有的主机名:

  • 可以用 Statefulset 或者 IndexJob 来生成有规则的 hostname。

Pod 挂载 SSH ConfigMap

想要免密,则 Pod 上挂载相应的configmap 即可。

spec:
  containers:
    volumeMounts:
    - name: ssh-config
      mountPath: /root/.ssh
      # use subpath to avoid soft link
      subPath: .ssh
  volumes:
    - name: ssh-config
    configMap:
      name: ssh-config-cm
      defaultMode: 0600
      items:
        - key: PRIVATE_KEY
          path: .ssh/id_rsa
        - key: PUBLIC_KEY
          path: .ssh/id_rsa.pub
        - key: AUTHORIZED_KEYS
          path: .ssh/authorized_keys
        - key: CONFIG
          path: .ssh/config