相比远程连接Linux实例后,在Linux实例上连接容器并执行命令的方式,云助手可以免密码、免登录、无需使用跳板机直接连接Linux容器并执行命令,操作更加简化。您可以在调用云助手API接口(RunCommand或InvokeCommand)时,指定Kubernetes容器信息( ContainerId 参数、 ContainerName 参数),直接在容器内执行命令。
ContainerId
ContainerName
Linux实例的状态必须为 运行中 (Running)。
Linux实例已安装 云助手Agent ,且 云助手Agent 版本不低于2.2.3.344。
具体操作,请参见 安装云助手Agent 。
仅支持由Kubernetes通过CRI规范管理的且在 Docker 、 containerd 、 CRI-O 容器运行时上运行的容器。
受Kubernetes CRI规范接口的约束,在容器内执行命令时存在以下限制:
使用限制
限制说明
只支持通过容器默认用户执行命令。
当您同时指定容器ID ContainerId 和容器名称 ContainerName ,或者指定其中一个参数。此时,同时指定的 Username 参数将不会生效,而是使用容器的默认用户执行命令。
Username
如果您希望切换命令的执行用户,可以在容器镜像支持的情况下,尝试使用容器内的 sudo 命令切换执行用户。
sudo
只支持在容器的默认工作目录下执行命令。
当您同时指定容器ID ContainerId 和容器名称 ContainerName ,或者指定其中一个参数。此时,同时指定的 WorkingDir 参数将不会生效,而是在容器的默认工作目录下执行命令。
WorkingDir
如果您希望切换命令的工作目录,可以尝试在Shell脚本开头加入 cd 命令进行切换。
cd
只支持执行Shell脚本,不支持在脚本开头使用类似 #!/usr/bin/python 命令的形式指定脚本内容的解释器。
#!/usr/bin/python
当您同时指定容器ID ContainerId 和容器名称 ContainerName ,或者指定其中一个参数,Linux下Shell脚本会直接传递给容器中的 /bin/sh 执行,因此无法识别通过 #! 指定的解释器。
/bin/sh
#!
如果您希望在容器内执行其他语言的脚本,可以尝试直接调用容器内的解释器并传递待执行的脚本内容,例如在脚本开头使用 /usr/bin/python -c 'import sys; print(sys.version_info)' 命令。
/usr/bin/python -c 'import sys; print(sys.version_info)'
查看Kubernetes容器ID和名称。
方法一:使用kubectl查看Kubernetes容器ID和名称。
您可以通过 kubectl --namespace <指定namespace> describe pod <指定pod> 命令查看指定pod下属容器的 ContainerId ,或者通过 Kubernetes apiserver 查询Kubernetes容器ID和名称。
kubectl --namespace <指定namespace> describe pod <指定pod>
Kubernetes apiserver
远程连接实例。
具体操作,请参见 通过密码或密钥认证登录Linux实例 。
执行如下命令,查询Kubernetes容器ID。
以namespace为kube-system、pod下属容器为kube-proxy-h4slq为例,命令执行结果如下。
[test@localhost ~]# kubectl --namespace kube-system describe pod kube-proxy-h4slq Name: kube-proxy-h4slq Namespace: kube-system Priority: 2000001000 Priority Class Name: system-node-critical Node: master1/192.168.1.11 Start Time: Thu, 11 Aug 2022 16:33:04 +0800 Labels: controller-revision-hash=9c5d7**** k8s-app=kube-proxy pod-template-generation=1 Annotations: <none> Status: Running IP: 192.168.1.11 IP: 192.168.1.11 Controlled By: DaemonSet/kube-proxy Containers: kube-proxy: Container ID: docker://fe17ab0409739e63f526aed7c79e87989e90d19f0429******************** Image: k8s.gcr.io/kube-proxy:v1.23.9 Image ID: docker://sha256:9e6a540eeeb62a64450dad488760cc3769b23d19fc21******************** Port: <none> Host Port: <none> Command: /usr/local/bin/kube-proxy --config=/var/lib/kube-proxy/config.conf --hostname-override=$(NODE_NAME) State: Running Started: Thu, 11 Aug 2022 16:33:06 +0800 Ready: True Restart Count: 0 Environment: NODE_NAME: (v1:spec.nodeName) Mounts: /lib/modules from lib-modules (ro) /run/xtables.lock from xtables-lock (rw) /var/lib/kube-proxy from kube-proxy (rw) /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-69g97 (ro)
从 Containers 部分可以看到下属名为 kube-proxy 容器的 Container ID 为 docker://fe17ab0409739e63f526aed7c79e87989e90d19f0429******************** ,表明该容器使用的是Docker容器运行时,具体的容器ID为 fe17ab0409739e63f526aed7c79e87989e90d19f0429******************** ,Kubernetes通过CRI规范管理时标记的名称为kube-proxy。
Containers
kube-proxy
Container ID
docker://fe17ab0409739e63f526aed7c79e87989e90d19f0429********************
fe17ab0409739e63f526aed7c79e87989e90d19f0429********************
(可选) 执行如下命令,查看Kubernetes集群中节点上所使用的容器运行时类型和版本。
kubectl get nodes -o wide
命令执行结果,示例如下。
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME node1 Ready <none> 17h v1.23.6 192.168.1.101 <none> Ubuntu 20.04.4 LTS 5.4.0-123-generic containerd://1.6.7 node2 Ready <none> 17h v1.23.6 192.168.1.102 <none> openSUSE Leap 15.4 5.14.21-150400.24.11-default cri-o://1.22.0 master1 Ready control-plane,master 18h v1.23.6 192.168.1.11 <none> CentOS Linux 7 (Core) 3.10.0-1160.71.1.el7.x86_64 docker://20.10.17 node3 Ready <none> 17h v1.23.6 192.168.1.103 <none> Debian GNU/Linux 11 (bullseye) 5.10.0-16-amd64 docker://20.10.17
在回显最后一列的 CONTAINER-RUNTIME 参数中,列出了不同节点上不同的容器运行时。
CONTAINER-RUNTIME
方法二:使用 云助手Agent 查看Kubernetes容器ID和名称。
Linux实例的 云助手Agent 不仅支持在容器内执行命令,还支持列出实例内由Kubernetes通过CRI规范管理的且在docker、containerd、cri-o容器运行时上运行的容器,方便您在不使用kubectl命令的场景下,快速查看当前实例中存在的容器。
云助手Agent 列出实例内容器的子命令为 list-containers ,您可以基于该子命令,根据需要指定参数,详情如下:
list-containers
执行 aliyun-service list-containers --source cri 命令。
aliyun-service list-containers --source cri
指定 --source cri 参数,可以列出由Kubernetes通过CRI规范管理的且在docker、containerd、cri-o容器运行时上正在运行的容器。命令执行示例如下:
--source cri
[test@localhost ~]# aliyun-service list-containers --source cri Container Id Container Name Pod Name Runtime State Data Source 4f14883f30580007b2b386be16c743048d7b7b6a6522******************** etcd etcd-izbp199sm5j54********** docker RUNNING CRI 60775315aa50765de7332764322f7697ded2783e4860******************** kube-apiserver kube-apiserver-izbp199sm5j54********** docker RUNNING CRI 8d8dd01f09f451109285a0094eef0c144bdfdef6913e******************** coredns coredns-64897********** docker RUNNING CRI aee068814a7b10419186bb944832e65df2a8b3cab32b******************** kube-scheduler kube-scheduler-izbp199sm5j54********** docker RUNNING CRI b06609d4246be717c324b366d4e6c392fcf226ecbc4b******************** kube-flannel kube-flanne********** docker RUNNING CRI c0992c3401ad52b3fce105ce5188026f28db7d5fe202******************** kube-controller-manager kube-controller-manager-izbp199sm5j54********** docker RUNNING CRI d1add169bb596f53d31030f84d69e494e7b23135acd2******************** coredns coredns-64897********** docker RUNNING CRI fe17ab0409739e63f526aed7c79e87989e90d19f0429******************** kube-proxy kube-proxy-***** docker RUNNING CRI
回显中的 Container Id 和 Container Name 两列的值分别可作为在容器内执行命令时 ContainerId 和 ContainerName 参数的值; Pod Name 一列指该容器对应的Kubernetes Pod。
Container Id
Container Name
Pod Name
执行 aliyun-service list-containers --source cri --all 命令。
aliyun-service list-containers --source cri --all
指定 --all 参数,可以列出由Kubernetes通过CRI规范管理的且在docker、containerd、cri-o容器运行时上所有存在的容器。命令执行示例如下:
--all
[test@localhost ~]# aliyun-service list-containers --source cri --all Container Id Container Name Pod Name Runtime State Data Source 240246ecbb7b4bfc3e0fd1bad51a76d43603c9cdee6a******************** install-cni kube-flannel-ds-***** docker EXITED CRI 4f14883f30580007b2b386be16c743048d7b7b6a6522******************** etcd etcd-izbp199sm5j************ docker RUNNING CRI 60775315aa50765de7332764322f7697ded2783e4860******************** kube-apiserver kube-apiserver-izbp199sm5j************ docker RUNNING CRI 8d8dd01f09f451109285a0094eef0c144bdfdef6913e******************** coredns coredns-64897985d-8qz25 docker RUNNING CRI aee068814a7b10419186bb944832e65df2a8b3cab32b******************** kube-scheduler kube-scheduler-izbp199sm5j************ docker RUNNING CRI b06609d4246be717c324b366d4e6c392fcf226ecbc4b******************** kube-flannel kube-flannel-ds-***** docker RUNNING CRI bdf9a2aff47a6858897d5c734c481535f7bb70321c8b******************** install-cni-plugin kube-flannel-ds-***** docker EXITED CRI c0992c3401ad52b3fce105ce5188026f28db7d5fe202******************** kube-controller-manager kube-controller-manager-izbp199sm53************ docker RUNNING CRI d1add169bb596f53d31030f84d69e494e7b23135acd2******************** coredns coredns-*************** docker RUNNING CRI fe17ab0409739e63f526aed7c79e87989e90d19f0429******************** kube-proxy kube-proxy-***** docker RUNNING CRI
执行 aliyun-service list-containers 命令。
aliyun-service list-containers
不指定 --source 参数,不仅可以列出由Kubernetes通过CRI规范管理的且在Docker、containerd、CRI-O容器运行时上的容器,还可以列出Docker运行时上未能通过Kubernetes CRI规范的接口列出的其他容器。命令执行示例如下:
--source
只支持在由Kubernetes通过CRI规范管理的且在Docker、containerd、CRI-O容器运行时上的容器中执行命令,不支持在Docker运行时上未能通过Kubernetes CRI规范的接口列出的其他容器中执行命令。
[test@localhost ~]# aliyun-service list-containers Container Id Container Name Pod Name Runtime State Data Source 4f14883f30580007b2b386be16c743048d7b7b6a6522******************** etcd etcd-izbp199sm5j************ docker RUNNING CRI 60775315aa50765de7332764322f7697ded2783e4860******************** kube-apiserver kube-apiserver-izbp199sm5j************ docker RUNNING CRI 8d8dd01f09f451109285a0094eef0c144bdfdef6913e******************** coredns coredns-648************ docker RUNNING CRI aee068814a7b10419186bb944832e65df2a8b3cab32b******************** kube-scheduler kube-scheduler-izbp199sm5j************ docker RUNNING CRI b06609d4246be717c324b366d4e6c392fcf226ecbc4b******************** kube-flannel kube-flannel-******** docker RUNNING CRI c0992c3401ad52b3fce105ce5188026f28db7d5fe202******************** kube-controller-manager kube-controller-manager-izbp199sm5j************ docker RUNNING CRI d1add169bb596f53d31030f84d69e494e7b23135acd2******************** coredns coredns-648************ docker RUNNING CRI fe17ab0409739e63f526aed7c79e87989e90d19f0429******************** kube-proxy kube-proxy-***** docker RUNNING CRI b6864279148b3cef6e72c983f7ffa041dfe7ab5e2c57******************** k8s_POD_coredns-64897985d-8qz25_kube-system_5422418e****************************** docker RUNNING docker fa99eaa067927e47f4e30795ad45065383efc8669687******************** k8s_POD_coredns-64897985d-cxvdq_kube-system_f59766f0****************************** docker RUNNING docker 3236c0f21b4a8f15fadeaaf813afb21d59889163056c******************** k8s_POD_kube-flannel-ds-qwf9p_kube-flannel_66c0205******************************* docker RUNNING docker 016bd6794042da8d4eb3b8f5f90594bad104b360670d******************** k8s_POD_kube-proxy-h4slq_kube-system_e2ce593******************************* docker RUNNING docker ae30393668288624472d1a594be2cb45996798d6b750******************** k8s_POD_kube-scheduler-izbp199sm5j54yl36as4h9z_kube-system_f77f****************************** docker RUNNING docker c2ced280d972f54aab32fda8de1f74f8799237cc51e2******************** k8s_POD_kube-controller-manager-izbp199sm5j54yl36as4h9z_kube-system_5c6******************************* docker RUNNING docker c92bce6b84d133b807d0310d215423870101d730ede2******************** k8s_POD_kube-apiserver-izbp199sm5j54yl36as4h9z_kube-system_7f6f****************************** docker RUNNING docker 4a5fe93977ad8eb945889cffe29f9d99d1540e870e69******************** k8s_POD_etcd-izbp199sm5j54yl36as4h9z_kube-system_4a85****************************** docker RUNNING docker a87c87c7dc162e99749cb78f8f270765e90f3df921d2******************** modest_bose docker RUNNING docker
回显中最后一列 Data Source 的值,说明如下:
Data Source
CRI :表示由Kubernetes通过CRI规范管理的容器。
CRI
docker :表示Docker运行时上未能通过Kubernetes CRI规范的接口列出的其他容器。
docker
执行 aliyun-service list-containers --source cri --json 命令。
aliyun-service list-containers --source cri --json
指定 --json 参数,可以使用JSON格式列出获取的容器信息。您可以通过云助手执行该命令查询并解析,获取实例上的容器列表,并针对性地执行相关的管理和运维操作。
--json
[test@localhost ~]# aliyun-service list-containers --source cri --json [{"id":"4f14883f30580007b2b386be16c743048d7b7b6a6522********************","name":"etcd","podId":"4a5fe93977ad8eb945889cffe29f9d99d1540e870e6*********************","podName":"etcd-izbp199sm5j54**********","runtimeName":"docker","state":"RUNNING","dataSource":"CRI"},{"id":"60775315aa50765de7332764322f7697ded2783e4860********************","name":"kube-apiserver","podId":"c92bce6b84d133b807d0310d215423870101d730ede2********************","podName":"kube-apiserver-izbp199sm5j54**********","runtimeName":"docker","state":"RUNNING","dataSource":"CRI"},{"id":"8d8dd01f09f451109285a0094eef0c144bdfdef6913e********************","name":"coredns","podId":"b6864279148b3cef6e72c983f7ffa041dfe7ab5e2c57********************","podName":"coredns-64897**********","runtimeName":"docker","state":"RUNNING","dataSource":"CRI"},{"id":"aee068814a7b10419186bb944832e65df2a8b3cab32b********************","name":"kube-scheduler","podId":"ae30393668288624472d1a594be2cb45996798d6b750********************","podName":"kube-scheduler-izbp199sm5j54**********","runtimeName":"docker","state":"RUNNING","dataSource":"CRI"},{"id":"b06609d4246be717c324b366d4e6c392fcf226ecbc4b********************","name":"kube-flannel","podId":"3236c0f21b4a8f15fadeaaf813afb21d59889163056c********************","podName":"kube-flannel-ds-*****","runtimeName":"docker","state":"RUNNING","dataSource":"CRI"},{"id":"c0992c3401ad52b3fce105ce5188026f28db7d5fe202********************","name":"kube-controller-manager","podId":"c2ced280d972f54aab32fda8de1f74f8799237cc51e2********************","podName":"kube-controller-manager-izbp199sm5j54**********","runtimeName":"docker","state":"RUNNING","dataSource":"CRI"},{"id":"d1add169bb596f53d31030f84d69e494e7b23135acd2********************","name":"coredns","podId":"fa99eaa067927e47f4e30795ad45065383efc8669687********************","podName":"coredns-64897**********","runtimeName":"docker","state":"RUNNING","dataSource":"CRI"},{"id":"fe17ab0409739e63f526aed7c79e87989e90d19f0429********************","name":"kube-proxy","podId":"016bd6794042da8d4eb3b8f5f90594bad104b360670d********************","podName":"kube-proxy-*****","runtimeName":"docker","state":"RUNNING","dataSource":"CRI"}]
使用云助手在容器内执行命令。
仅支持通过OpenAPI在指定容器内执行命令,调用云助手接口( RunCommand 或 InvokeCommand )执行命令时,同时指定容器ID( ContainerId 参数)、容器名称( ContainerName 参数),或者指定其中一个参数,才能在指定容器内执行命令。
使用云助手执行命令的使用限制请参见 立即执行命令 中的前提条件和背景信息。
您可以调用云助手接口( DescribeInvocations 或 DescribeInvocationResults )查看命令的执行状态或执行结果。同时,您可以在接口的返回信息中,查看执行命令的容器ID( ContainerId 参数)和容器名称( ContainerName 参数)。