如何通过SSH登录AWS上托管的Kubernetes节点或服务器?
解决AWS托管Kubernetes节点的SSH登录问题
我来帮你梳理下AWS托管Kubernetes(大概率是EKS)节点的几种登录方案,毕竟默认情况下EKS节点是私网部署,直接从本地SSH确实会遇到障碍:
方法1:AWS Systems Manager (SSM) Session Manager(最推荐)
这个方法不需要开SSH端口,也不用搭堡垒机,只要你的节点满足两个条件:
- 节点用的是EKS官方AMI(默认预装了SSM Agent)
- 节点的IAM角色附加了
AmazonSSMManagedInstanceCore权限策略
步骤很简单:
- 本地先确保AWS CLI已经配置好正确的凭证和区域
- 用kubectl获取节点对应的EC2实例ID:
输出格式类似kubectl get nodes -o jsonpath='{.items[*].spec.providerID}'aws://us-east-1/i-0abc123def456ghi,提取里面的i-0abc123def456ghi就是实例ID - 启动SSM会话登录节点:
直接就能进入节点的shell了,全程不需要密钥对!aws ssm start-session --target <实例ID> --region <你的AWS区域>
方法2:通过堡垒机(Bastion Host)SSH登录
如果更习惯传统SSH方式,可以搭一台堡垒机:
- 在EKS节点所在的VPC公网子网,创建一台带公网IP的EC2实例当堡垒机
- 配置堡垒机安全组:允许你的本地IP访问22端口
- 配置EKS节点安全组:允许堡垒机的安全组访问22端口
- 先SSH到堡垒机:
ssh -i <你的密钥对.pem> ec2-user@<堡垒机公网IP> - 从堡垒机再SSH到EKS节点(用节点的私网IP):
注意:节点用户名要看镜像,Amazon Linux 2是ssh -i <你的密钥对.pem> ec2-user@<节点私网IP>ec2-user,Ubuntu是ubuntu。另外密钥对必须是创建EKS节点组时指定的那一对,还要把密钥文件权限设为chmod 400 <你的密钥对.pem>,否则SSH会报错。
方法3:用kubectl通过特权Pod间接访问节点
如果暂时没法改IAM或安全组,可以通过在节点上运行特权Pod来间接进入节点环境:
- 创建一个
node-access-pod.yaml文件:apiVersion: v1 kind: Pod metadata: name: node-access spec: containers: - name: node-access image: busybox command: ["sleep", "3600"] securityContext: privileged: true volumeMounts: - name: node-root mountPath: /host volumes: - name: node-root hostPath: path: / nodeName: <你的节点名称> # 替换成要访问的节点名 - 应用这个Pod:
kubectl apply -f node-access-pod.yaml - 进入Pod的shell:
kubectl exec -it node-access -- sh - 切换到节点的根文件系统:
这样就相当于进入了节点的环境,能执行各种节点操作。chroot /host
额外提醒
- 如果是EKS Fargate节点,那完全没法SSH登录,因为Fargate是无服务器节点,没有可登录的底层EC2实例
- 所有操作都要确保你的IAM账号有对应的权限:比如用SSM需要SSM的会话权限,用EC2需要实例描述权限等
内容的提问来源于stack exchange,提问作者anish anil
相关产品推荐
相关产品推荐

