SSH是一种基于UNIX的协议,用于访问远程机器或虚拟机 (VM)

根据定义,Pod类似于 VM,因为它允许容器表现得好像它们在隔离的 VM 上运行一样。如果你在集群内——最简单的方法是使用 kubectl exec 命令

但是,是否可以从集群外部通过 SSH 连接到 K8 Pod?

如何可靠地访问 K8 Pod?

根据定义,Pod 本质上是短暂的,服务是一组 Pod 的稳定抽象点。因此,可以通过服务可靠地访问 K8 Pod

从 Kubernetes 集群外部访问 pod 的合适服务类型是什么?

ClusterIP、NodePortLoadBalancer是三种可能的服务类型

但是,ClusterIP永远无法从集群外部访问该服务,因此,它不是一种选择

NodePort服务提供了一个集群范围的端口,可以通过集群节点访问。但考虑到节点本质上也是短暂的,NodePort它不是一种稳定的访问 Pod 的方式

LoadBalancer服务是唯一适合从 Kubernetes 集群外部访问 Pod 的服务类型,因为该服务类型提供了一个外部 IP 地址,可以绑定到公共负载均衡器,如 Google 的 HTTPS 负载均衡器

image.png

下面是LoadBalancer打开 SSH 端口进行通信的服务片段

namespace: default
  labels:
    app: my-example
spec:
  type: LoadBalancer
  ports:
  # If there are multiple ports, then each port sub-section needs a name and a protocol (as needed)
  - port: 8080
    targetPort: 8080
    name: http
  - port: 22
    targetPort: 22
    name: ssh
    protocol: TCP
  selector:
    app: my-example

如何启用 Pod 作为 SSH 服务器?

为了通过 SSH 连接到 Pod,Pod 应该安装SSH 服务器。这可以通过安装OpenSSH Server作为绑定到 Pod 的 Docker 镜像的一部分来提供

以下命令应包含在与绑定到 Pod 的容器关联的 Dockerfile 中。
因此,即使 Pod 是短暂的,但openssh-server每次重新创建Pod并使用默认用户配置 SSH 时,Pod 都会具有功能

apt-get update 
apt-get -y install openssh-server
useradd testuser
passwd testuser 
service ssh restart

我们如何从 Kubernetes 集群外部通过 SSH 连接到 K8 Pod?

鉴于 Pod 可以通过服务访问,并且可以通过LoadBalancer公共负载均衡器服务的服务访问;用户可以通过执行如下经典ssh命令从 Kubernetes 集群外部通过 SSH 连接到 K8 Pod

ssh -f testuser@{ip}

替代方法 — SSH 密钥而不是用户凭据

如果需要使用 SSH 密钥作为身份验证机制,则可以将客户端的公共 SSH 密钥作为机密挂载到 Pod。

这将确保客户端的公钥在 Pod 中可用作授权密钥,随后,客户端可以通过使用客户端的私钥对 Pod 上的授权密钥进行身份验证来进行连接

点赞(4)

评论列表 共有 0 评论

暂无评论