生成 SSH key 并创建集群 Secret
这个 SSH key 用于默认的连接凭证,SSH 客户端需要它来认证身份,而 SSH 服务端需要授权其 public key 的访问权限。
# 生成一对新的 private/public key
ssh-keygen -t rsa -b 4096 -C "ssh@example" -f ./id_rsa
# 输出 base64 格式字符串
cat ./id_rsa | base64
cat ./id_rsa.pub | base64
创建一个集群的 Secret
, 运行 `kubectl apply -f ssk-key.yaml`
# 文件名 ssk-key.yaml
apiVersion: v1
kind: Secret
metadata:
name: ssh-key
type: Opaque
data:
id_rsa: base64 编码的 id_rsa 文件内容
id_rsa.pub: base64 编码的 id_rsa.pub 文件内容
构建 SSH server 所需的环境
这里基于 ubuntu:18.04
来构建镜像,只是为了描述必要的安装步骤,实际的基础镜像按照业务需求修改。构建完的镜像在这篇文章中命名为 example/ssh-server:latest
FROM ubuntu:18.04
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN apt update
RUN DEBIAN_FRONTEND=noninteractive apt install -y openssh-server
RUN echo "Port 8022" > /etc/ssh/sshd_config.d/default.conf
RUN echo "AuthorizedKeysFile ~/.ssh/authorized_keys" >> /etc/ssh/sshd_config.d/default.conf
部署
用同一个 Deployment 部署两个容器,实现从一个容器可以 ssh 到另一个容器里。
apiVersion: apps/v1
kind: Deployment
metadata:
name: ssh-client-and-server
spec:
replicas: 1
selector:
matchLabels:
app: ssh-client-and-server
template:
metadata:
labels:
app: ssh-client-and-server
spec:
containers:
- name: ssh-client
image: ubuntu:18.04
env:
- name: HOST_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.hostIP
command: ["/bin/bash", "-c", "while true; do sleep 30; done;"]
volumeMounts:
- mountPath: /root/.ssh/id_rsa.pub
name: ssh-keys
subPath: id_rsa.pub
- mountPath: /root/.ssh/id_rsa
name: ssh-keys
subPath: id_rsa
- name: ssh-server
image: example/ssh-server:latest
command: ["/bin/bash", "-c", "while true; do sleep 30; done;"]
ports:
- containerPort: 8022
volumeMounts:
- name: ssh-keys
mountPath: /root/.ssh/authorized_keys
subPath: id_rsa.pub
volumes:
- secret:
secretName: ssh-keys
defaultMode: 0
name: ssh-keys
一些说明:
挂载 Secret 的 id_rsa 和 id_rsa.pub 到
ssh-client 的 ~/.ssh 目录下用于 ssh 登录的凭证
挂载 Secret 的 id_rsa.pub 到 ssh-server 的 `
/root/.ssh/authorized_keys` 用于允许改 public key 的访问
ssh-server 的端口是 8022
ssh-client 容器通过 HOST_IP 环境变量获取 Pod 的 IP
因为两个容器是共享同一个 Pod 的 IP,只是端口不同,在 ssh-client 里可以通过下面的命令 SSH 到 ssh-server 容器里
ssh $HOST_IP -p 8022
搞定。