如何使用 containerd 运行时 ssh 进入类集群节点?
How to ssh into kind cluster nodes with containerd runtime?
我已经使用 containerd 运行时创建了一个 Kind 集群。
这是我的节点:
root@dev-001:~# k get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
local-cluster-control-plane Ready control-plane,master 7d8h v1.20.2 172.18.0.2 <none> Ubuntu 20.10 5.4.0-81-generic containerd://1.4.0-106-gce4439a8
local-cluster-worker Ready <none> 7d8h v1.20.2 172.18.0.5 <none> Ubuntu 20.10 5.4.0-81-generic containerd://1.4.0-106-gce4439a8
local-cluster-worker2 Ready <none> 7d8h v1.20.2 172.18.0.3 <none> Ubuntu 20.10 5.4.0-81-generic containerd://1.4.0-106-gce4439a8
local-cluster-worker3 Ready <none> 7d8h v1.20.2 172.18.0.4 <none> Ubuntu 20.10 5.4.0-81-generic containerd://1.4.0-106-gce4439a8
如何通过 ssh 连接到节点?
种类版本:0.11.1 或更高版本
运行时:containerd(不是 docker)
一个简单的 google 搜索将揭示答案:
https://cloud.google.com/anthos/clusters/docs/on-prem/1.3/how-to/ssh-cluster-node
使用 SSH 连接到用户集群节点
- 获取用户集群的 SSH 密钥:
kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get secrets \
-n [USER_CLUSTER_NAME] ssh-keys \
-o jsonpath='{.data.ssh\.key}' | base64 -d > \
~/.ssh/[USER_CLUSTER_NAME].key \
&& chmod 600 ~/.ssh/[USER_CLUSTER_NAME].key
其中:
[ADMIN_CLUSTER_KUBECONFIG]
是管理员集群的 kubeconfig 文件的路径。
[USER_CLUSTER_NAME]
是您的用户集群的名称。
前面的命令执行以下步骤:
- 从管理员集群中,获取 [USER_CLUSTER_NAME] 命名空间中名为 ssh-keys 的 Secret 的
ssh.key
字段。
- Base64 解码密钥。
- 将解码后的密钥存储在文件 ~/.ssh/[USER_CLUSTER_NAME].key.
- 为密钥文件设置适当的访问权限。
使用密钥通过 SSH 连接到用户集群节点:
ssh -i ~/.ssh/[USER_CLUSTER_NAME].key user@[NODE_IP]
其中:
[NODE_IP]
是您之前收集的用户集群中节点的内部 IP 地址。
Kind Kuberenetes 使用 Docker 到 create container(s) which will be Kubernetes node(s):
kind is a tool for running local Kubernetes clusters using Docker container “nodes”.
所以基本上这些层是:你的主机 -> 容器托管在你的主机 docker 上,它们充当 Kubernetes 节点 -> 在节点上有容器 运行次用于运行宁pods
为了通过 SSH 进入节点,您需要执行 docker 容器。让我们开始吧。
首先,我们将通过 运行ning kubectl get nodes -o wide
:
获取节点列表
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
kind-control-plane Ready control-plane,master 5m5s v1.21.1 172.18.0.2 <none> Ubuntu 21.04 5.11.0-1017-gcp containerd://1.5.2
kind-worker Ready <none> 4m38s v1.21.1 172.18.0.4 <none> Ubuntu 21.04 5.11.0-1017-gcp containerd://1.5.2
kind-worker2 Ready <none> 4m35s v1.21.1 172.18.0.3 <none> Ubuntu 21.04 5.11.0-1017-gcp containerd://1.5.2
假设我们想通过 SSH 连接到 kind-worker
节点。
现在,我们将获得 docker 个容器的列表(docker ps -a
)并检查是否所有节点都在这里:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ee204ad5fd1 kindest/node:v1.21.1 "/usr/local/bin/entr…" 10 minutes ago Up 8 minutes kind-worker
434f54087e7c kindest/node:v1.21.1 "/usr/local/bin/entr…" 10 minutes ago Up 8 minutes 127.0.0.1:35085->6443/tcp kind-control-plane
2cb2e9465d18 kindest/node:v1.21.1 "/usr/local/bin/entr…" 10 minutes ago Up 8 minutes kind-worker2
查看 NAMES
列 - 这是 Kubernetes 中使用的节点名称。
现在我们将使用标准 docker exec
command 连接到 运行ning 容器并连接到它的 shell - docker exec -it kind-worker sh
,然后我们将 运行 ip a
在容器上检查 IP 地址是否与来自 kubectl get nodes
命令的地址相匹配:
# ls
bin boot dev etc home kind lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
...
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
inet 172.18.0.4/16 brd 172.18.255.255 scope global eth0
...
#
可以看到,我们成功连接到 Kind Kubernetes 使用的节点 - IP 地址 172.18.0.4
与 kubectl get nodes
命令中的 IP 地址匹配。
我已经使用 containerd 运行时创建了一个 Kind 集群。 这是我的节点:
root@dev-001:~# k get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
local-cluster-control-plane Ready control-plane,master 7d8h v1.20.2 172.18.0.2 <none> Ubuntu 20.10 5.4.0-81-generic containerd://1.4.0-106-gce4439a8
local-cluster-worker Ready <none> 7d8h v1.20.2 172.18.0.5 <none> Ubuntu 20.10 5.4.0-81-generic containerd://1.4.0-106-gce4439a8
local-cluster-worker2 Ready <none> 7d8h v1.20.2 172.18.0.3 <none> Ubuntu 20.10 5.4.0-81-generic containerd://1.4.0-106-gce4439a8
local-cluster-worker3 Ready <none> 7d8h v1.20.2 172.18.0.4 <none> Ubuntu 20.10 5.4.0-81-generic containerd://1.4.0-106-gce4439a8
如何通过 ssh 连接到节点?
种类版本:0.11.1 或更高版本
运行时:containerd(不是 docker)
一个简单的 google 搜索将揭示答案:
https://cloud.google.com/anthos/clusters/docs/on-prem/1.3/how-to/ssh-cluster-node
使用 SSH 连接到用户集群节点
- 获取用户集群的 SSH 密钥:
kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get secrets \
-n [USER_CLUSTER_NAME] ssh-keys \
-o jsonpath='{.data.ssh\.key}' | base64 -d > \
~/.ssh/[USER_CLUSTER_NAME].key \
&& chmod 600 ~/.ssh/[USER_CLUSTER_NAME].key
其中:
[ADMIN_CLUSTER_KUBECONFIG]
是管理员集群的 kubeconfig 文件的路径。
[USER_CLUSTER_NAME]
是您的用户集群的名称。
前面的命令执行以下步骤:
- 从管理员集群中,获取 [USER_CLUSTER_NAME] 命名空间中名为 ssh-keys 的 Secret 的
ssh.key
字段。 - Base64 解码密钥。
- 将解码后的密钥存储在文件 ~/.ssh/[USER_CLUSTER_NAME].key.
- 为密钥文件设置适当的访问权限。
使用密钥通过 SSH 连接到用户集群节点:
ssh -i ~/.ssh/[USER_CLUSTER_NAME].key user@[NODE_IP]
其中:
[NODE_IP]
是您之前收集的用户集群中节点的内部 IP 地址。
Kind Kuberenetes 使用 Docker 到 create container(s) which will be Kubernetes node(s):
kind is a tool for running local Kubernetes clusters using Docker container “nodes”.
所以基本上这些层是:你的主机 -> 容器托管在你的主机 docker 上,它们充当 Kubernetes 节点 -> 在节点上有容器 运行次用于运行宁pods
为了通过 SSH 进入节点,您需要执行 docker 容器。让我们开始吧。
首先,我们将通过 运行ning kubectl get nodes -o wide
:
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
kind-control-plane Ready control-plane,master 5m5s v1.21.1 172.18.0.2 <none> Ubuntu 21.04 5.11.0-1017-gcp containerd://1.5.2
kind-worker Ready <none> 4m38s v1.21.1 172.18.0.4 <none> Ubuntu 21.04 5.11.0-1017-gcp containerd://1.5.2
kind-worker2 Ready <none> 4m35s v1.21.1 172.18.0.3 <none> Ubuntu 21.04 5.11.0-1017-gcp containerd://1.5.2
假设我们想通过 SSH 连接到 kind-worker
节点。
现在,我们将获得 docker 个容器的列表(docker ps -a
)并检查是否所有节点都在这里:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ee204ad5fd1 kindest/node:v1.21.1 "/usr/local/bin/entr…" 10 minutes ago Up 8 minutes kind-worker
434f54087e7c kindest/node:v1.21.1 "/usr/local/bin/entr…" 10 minutes ago Up 8 minutes 127.0.0.1:35085->6443/tcp kind-control-plane
2cb2e9465d18 kindest/node:v1.21.1 "/usr/local/bin/entr…" 10 minutes ago Up 8 minutes kind-worker2
查看 NAMES
列 - 这是 Kubernetes 中使用的节点名称。
现在我们将使用标准 docker exec
command 连接到 运行ning 容器并连接到它的 shell - docker exec -it kind-worker sh
,然后我们将 运行 ip a
在容器上检查 IP 地址是否与来自 kubectl get nodes
命令的地址相匹配:
# ls
bin boot dev etc home kind lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
...
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
inet 172.18.0.4/16 brd 172.18.255.255 scope global eth0
...
#
可以看到,我们成功连接到 Kind Kubernetes 使用的节点 - IP 地址 172.18.0.4
与 kubectl get nodes
命令中的 IP 地址匹配。