背景

在云原生开发越来越热的今天,公司采用云服务提供商的托管 Kubernetes 集群部署应用很常见。如果采用了 AWS 的 EKS,并且公司网络和集群的网络没有打通的情况下,要查看集群资源,可以通过 AWS 的会话管理器,启动 Web Console 来进行。但是这样手动步骤过多,对开发不够友好。

并且目前的 AWS web console,有一个 BUG,即在 web console 里通过 kubectl edit cm/xxxconfigmap 对 configmap 进行编辑后,无法使用常用的 ESC 或者 Ctrl + [ 退出 vi 的插入模式,因为这两个按键方式都会被浏览器截获,导致失去编辑窗口的焦点。尽管我通过试验 Ctrl + o 可以不失去焦点成功退出vi 的插入模式,但是如果能够不用 web console 是最理想的。

image.png

aws ssm cli

可以通过 aws ssm cli 来避免使用 web console。但是直接使用会报连接失败的错误。

解决方案

通过脚本自动登录并获取 AWS 临时令牌,以获得连接权限。

先决条件

Python3 已安装:

shell ➜ python3 --version Python 3.8.2


克隆脚本


shell git clone [email protected]:Jeff-Tian/aws-adfs-auth.git cd aws-adfs-auth

安装依赖


shell sudo pip3 install --upgrade pip # upgrade to latest pip3 sudo pip3 install -r requirements.txt # install dependencies

获取临时令牌


shell CYBERARKSERVER=pam.corp.your-company.com ADFSDOMAIN=adfs.corp.your-company.com ADFSDOMAINUSERNAME=cnXXX ADFSDOMAINPASSWORD=* python3 main.py -r cn-north-1 --no-certificate-verify


安装 ssm 插件

shell curl https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/session-manager-plugin.pkg -o session-manager-plugin.pkg sudo installer -pkg session-manager-plugin.pkg -target / ln -s /usr/local/sessionmanagerplugin/bin/session-manager-plugin /usr/local/bin/session-manager-plugin

连接跳板机


shell aws ssm start-session --target i-1234-instance-id-of-ec2

使用 kubectl 命令查看集群资源


shell ➜ aws ssm start-session --target i-1234-instance-id-of-ec2

Starting session with SessionId: jeff-sqs-test-0a8d0d4f75545e986 sh-4.2$ sudo su [[email protected] bin]# kubectl get pod NAME READY STATUS RESTARTS AGE adminer-f5cc4fcc7-dx7d9 1/1 Running 0 12d yapi-deployment-mongo-855fff7c6d-fshs4 1/1 Running 0 12d [[email protected] bin]# exit exit sh-4.2$ exit exit

Exiting session with sessionId: jeff-sqs-test-0a8d0d4f75545e986.

总结

第一次使用需要执行一系列命令,因为需要安装一些依赖。在随后的工作中,只需要执行如下两个命令就行了:

shell CYBERARKSERVER=pam.corp.your-company.com ADFSDOMAIN=adfs.corp.your-company.com ADFSDOMAINUSERNAME=cnXXX ADFSDOMAINPASSWORD=* python3 main.py -r cn-north-1 --no-certificate-verify

aws ssm start-session --target i-1234-instance-id-of-ec2


临时令牌只有一个小时的有效期,但是由于执行命令比起操作网页快得多,因此很方便自动化。