《OpenShift / RHEL / DevSecOps 汇总目录》
说明:本文已经在支持 OpenShift 4.12 的 OpenShift 环境中验证
在《OpenShift 4 - 用 OpenShift Virtualization 运行容器化虚拟机 (视频)》一文中使用了 OpenShift 控制台直接访问运行在 OpenShift 上的 VM。本文将介绍如何通过 SSH 方式从外部访问运行在 OpenShift 上的 VM。
文章目录
创建 VM
创建使用密码登陆的 VM
- 在 OpenShift 控制台创建 VM 的时候,可在 VM 的 Scripts 配置页面中点击 Cloud-init 处的 Edit。
- 切换到 Script,添加 “ssh_pwauth: true” 一行,然后保存即可。
- 当 VM 创建好后,可以执行以下命令查看 VM 使用的内部 IP 地址。
$ oc get vmi fedora-vm1
NAME AGE PHASE IP NODENAME READY
fedora-vm1 15h Running 10.217.1.118 crc-rwwzd-master-0 True
$ VM_IP=10.217.1.118
创建使用证书登陆的 VM
- 执行命令(全部回车即可),生成公钥-私钥对。
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user1/.ssh/id_rsa):
Created directory '/home/user1/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user1/.ssh/id_rsa.
Your public key has been saved in /home/user1/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:YjLzIQx+cbNF59mgLUUBrV5l5OIKMOoGg0FD1dZtF/8 user1@ocp4-bastion.aio.example.com
The key's randomart image is:
+---[RSA 3072]----+
|.+... . ++*+o |
|. . o o O.*+ |
|. . = o =.*oo. |
|.o + = +.o.. . |
|+ o B *.S.. E |
| + . B +.. |
| o . . |
| . |
| |
+----[SHA256]-----+
$ ll ~/.ssh
-rw-------. 1 dawnsky dawnsky 1679 3月 21 12:16 id_rsa
-rw-r--r--. 1 dawnsky dawnsky 393 3月 21 12:16 id_rsa.pub
- 在 OpenShift 控制台创建 VM 的时候,可在 VM 的 Scripts 配置页面中点击 Authorized SSH Key 处的 Edit。
- 然后在 Authorized SSH Key 窗口中提供 public key 的内容。
- 当 VM 创建好后,可以执行以下命令查看 VM 使用的内部 IP 地址。
$ oc get vmi fedora-vm1
NAME AGE PHASE IP NODENAME READY
fedora-vm1 15h Running 10.217.1.118 crc-rwwzd-master-0 True
$ VM_IP=10.217.1.118
从 OCP 外部通过 SSH 访问 VM
手动创建服务
- 以下两种方式可以任选一种,执行命令创建一个 Service,该 Service 指定绑定节点的端口。注意:不过不指定“–node-port”参数,系统将随机指定一个
$ virtctl expose vm fedora-vm1 --port=22 --name=fedora-vm1-ssh --type=NodePort --node-port 32758
$ cat << EOF | oc apply -f
apiVersion: v1
kind: Service
metadata:
name: fedora-vm1-ssh
spec:
externalTrafficPolicy: Cluster
ports:
- protocol: TCP
port: 22
nodePort: 32758
selector:
kubevirt.io/domain: fedora-vm1
type: NodePort
EOF
- 从控制台的 Detail 上查看 VM 运行的节点。
- 由于本文使用的是基于 OpenShift Local 的单机版 OpenShift 环境,因此 VM
$ NODE_IP=192.168.130.11
- 执行命令,使用 Private Key 并通过 NodePort 端口访问运行 VM 的节点。
$ ssh -i ~/.ssh/id_rsa -p 32758 fedora@${NODE_IP}
The authenticity of host '[192.168.130.11]:32758 ([192.168.130.11]:32758)' can't be established.
ECDSA key fingerprint is SHA256:W1V9wkvwSbQm0cNe2ENxkuhKhswqRXN5b69TjUfhxNA.
ECDSA key fingerprint is MD5:4a:b0:ad:90:50:c0:65:8a:a4:61:29:3f:69:ba:1c:8a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.130.11]:32758' (ECDSA) to the list of known hosts.
Last login: Tue Mar 21 07:40:06 2023 from 10.217.0.139
[fedora@fedora-vm1 ~]$
自动创建服务
- 在控制台的 Detail 上查看 VM 的详细信息,打开 SSH over NodePort 选项。此时会自动创建访问 VM 的 Service。
- 复制上图的命令,如需要可加上私钥参数后执行即可登录 VM。
$ ssh fedora@console-openshift-console.apps-crc.testing -p 31837 -i ~/.ssh/id_rsa
在 OCP 内部通过 SSH 访问 VM
通过内部 IP 访问
- 执行以下命令运行一个 pod。
$ cat << EOF | oc apply -f
apiVersion: v1
kind: Pod
metadata:
name: ubi
spec:
containers:
- name: shell
image: registry.access.redhat.com/ubi8/ubi:8.2
stdin: true
tty: true
EOF
- 将 Private Key 复制到 pod 中。
$ oc get pod ubi
NAME READY STATUS RESTARTS AGE
ubi 1/1 Running 0 5h48m
$ oc cp ~/.ssh/id_rsa ubi:/tmp/id_rsa
$ oc exec pod/ubi -- ls -al /tmp/id_rsa
-rw-rw-r--. 1 1000 1000 1679 Mar 21 09:59 /tmp/id_rsa
- 执行以下命令。该命令先进入 pod,然后再使用 Private Key 和 VM 的内部 IP 登录 VM。
$ oc rsh pod/ubi ssh -i /tmp/id_rsa fedora@${VM_IP}
Last login: Wed Mar 22 03:35:58 2023 from 10.217.0.139
[fedora@fedora-vm1 ~]$
通过服务访问
- 参照以上过程再创建一个名为 fedora-vm-2 的 VM,并自动创建对应的服务。
- 参照以上过程先登陆到名为 fedora-vm-1 的 VM 里。
- 在 fedora-vm-1 中创建一个包含可访问 fedora-vm-2 的私钥文件 fedora-vm-2.key,并将私钥复制到其中。
- 修改 fedora-vm-2.key 文件属性。
$ chmod 600 fedora-vm-2.key
- 在 fedora-vm-1 中远程登陆 fedora-vm-2。
$ ssh -i ./fedora-vm-2.key fedora@fedora-vm-2-nodeport-ssh-service-XXXX -p 22000
参考
https://kubevirt.io/user-guide/virtual_machines/service_objects/
https://cloud.redhat.com/blog/accessing-your-vm-using-ssh-and-the-web-console
https://github.com/flozanorht/ocp4-virt-samples/blob/main/ubi-pod.yaml