暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何从集群外部通过SSH进入Kubernetes Pod

云原生CTO 2020-10-26
2044

如何从集群外部通过SSH进入Kubernetes Pod ?

最近研究了一个比较有趣的事情,到底是啥有趣的事情呢,我已经习惯开始自问自答了。。。。可能太希望你关注我了,哈哈😄,不迈关子了,直接迈入主题吧,不知道你有没有考虑过如何在外部通过SSH进入kubernetes的pod当中,平时一般我们经常都是在集群内通过kubectl exec -it进去容器当中,但是如何在外边进入容器,这值得稍微的动脑筋思考一下🤔

稍微回顾一下旧知识,我们知道 安全套接字外壳(SSH)是基于UNIX的协议,用于访问远程计算机或虚拟机(VM)。

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

但是,是否可以从群集外部通过SSH进入K8s Pod?

是的。这是可能的!—但只有在逐步回答以下问题之后……其实也是可以实现的

1 如何可靠地访问K8 Pod?

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

  • 从Kubernetes集群外部访问Pod的适当服务类型是什么?

ClusterIP,NodePort和LoadBalancer是三种可能的服务类型。

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

该NodePort服务提供了一个群集范围的端口,可以通过群集节点进行访问。但是,鉴于该节点在本质上也是短暂的,NodePort因此不是访问Pod的稳定方法。

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

以下是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

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

为了通过SSH进入Pod,该Pod应该安装了SSH服务器。可以通过将OpenSSH Server安装到绑定到Pod的Docker镜像中来进行配置。

与绑定到Pod的容器相关联的Dockerfile中应包含以下命令。

因此,即使Pod是短暂的,Pod openssh-server每次重新创建时都将具有功能,并且默认用户配置为SSH。

#install openssl-server. Below assumes container is on ubuntu
apt-get update 
apt-get -y install openssh-server
#create testuser
useradd testuser
passwd testuser 
Enter password and confirm password (assume password in this case is 'password' as well)
#restart ssh service
service ssh restart

最后…

3 我们如何从Kubernetes集群外部SSH到K8 Pod中?

假定Pod可通过服务访问,并且可以通过LoadBalancer由公共负载平衡器提供服务的服务进行访问;用户可以通过执行以下经典ssh命令从Kubernetes集群外部通过SSH进入K8 Pod :

#Example 
ssh -f testuser@<external-load-balancer-ip-address>(Enter password on prompt to establish the SSH connection)

  • 替代方法-SSH密钥代替用户凭据

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

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

👌,是不是很简单,是的,稍微改变一下思路就可以实现。

送给积极探索的你

学习这件事永远不晚。  --高尔基

如果喜欢😍文章的话,点点关注,就差你的关注了,更多好玩有趣的云原生前沿技术尽在云原生CTO,如果对你有帮助,欢迎分享给更多人


文章转载自云原生CTO,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论