Kubernetes 卷存储|kubenetes 卷挂载ssh公私钥实现集群pod免密和宿主机与pod免密

本文详细介绍了如何在Kubernetes环境中利用ConfigMap和Secret实现SSH免密登录,包括SSH密钥的工作原理、Dockerfile制作SSH免密镜像、创建ConfigMap和Secret、部署免密Pod以及验证测试。通过这种方法,可以提高操作的安全性和便捷性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、ssh介绍

在这里插入图片描述

SSH公钥和私钥是用于SSH(Secure Shell)协议中的一对密钥,用于身份验证和安全通信。SSH是一种加密的网络协议,常用于在不安全的网络中安全地进行远程登录和执行命令。

公钥:
公钥是密钥对中公开的部分,可以安全地分享给任何人或存储在远程服务器上,没有泄露风险。
公钥通常用于加密会话密钥、验证数字签名或加密可以用相应的私钥解密的数据。
在SSH登录认证过程中,公钥被放置在远程服务器上用户账号的~/.ssh/authorized_keys文件中。当有客户端尝试连接服务器时,服务器会使用公钥来验证客户端发送的签名是否合法,以此确认远程登录用户持有对应的私钥。

私钥:
私钥是密钥对中非公开的部分,它必须保密,绝不能被泄露或分享给其他人。
私钥通常由SSH客户端软件生成并带有密码保护(可选)。
在SSH登录过程中,私钥被用来对服务端发起的挑战进行签名,进而证明客户端确实拥有对应的私钥。

工作原理:
客户端请求连接到SSH服务器。
服务器检查客户端是否提供了一个公钥。
如果客户端提供了一个公钥,服务器使用这个公钥生成一个随机数并发送给客户端作为挑战。
客户端使用私钥对这个挑战进行签名,然后将签名发送回服务器。
服务器用公钥验证这个签名,如果验证成功,则允许客户端登录。
在这里插入图片描述

优势:
提供了更强的安全性,相对于基于密码的身份验证。
允许设置无密码登录,提高了操作的便捷性同时仍然保持了较高的安全性。
用于加密通信,确保数据在传输过程中的机密性。

生成与管理:
使用ssh-keygen命令可以生成SSH公钥和私钥。在生成过程中,可以选择密钥类型、设置密码(可选)等。
公钥可以安全地分享,通常复制并添加到远程代码托管平台账户上进行身份验证。
私钥是与用户身份相关联的关键部分,必须妥善保存在本地,不应与他人共享。

二、ConfigMap和Secret介绍

ConfigMap
ConfigMap是一个Kubernetes资源,允许您将配置数据与应用程序代码分开存储。它提供了一种将配置设置与应用程序本身分离的方法,从而可以更轻松地管理和更新配置,而无需修改应用程序的代码或容器镜像。
ConfigMap通常用于存储键值对或配置文件。它可以通过使用YAML文件的声明性方法或通过 Kubernetes API 创建。创建后,ConfigMap 可以作为卷挂载,也可以作为容器化应用程序中的环境变量公开

Secret
Secret对象是一种用于在集群中安全地存储和管理敏感数据的机制。Secret的主要作用包括安全存储、保密传输和应用集成。

安全存储方面,Secret可以将密码、API密钥、TLS证书、SSH密钥等敏感数据以加密形式存储在集群内部,而不是直接暴露在配置文件或容器镜像中。

保密传输方面,当Secret被挂载到Pod时,虽然数据是以明文形式存在于Pod的文件系统中,但在存储和分发过程中,这些数据会被kubelet自动解密,并确保在集群内部网络中的传输是加密的。

应用集成方面,Secret可以以环境变量或者卷文件的形式注入到Pod中,使得应用程序能够访问必要的私密数据,同时避免了在代码仓库或其他非加密介质中硬编码这些敏感信息

三、Dockerfile制作ssh免密镜像

FROM centos:centos7.9.2009
# 安装openssh-server
RUN yum install -y epel-release
RUN yum install -y openssh-server openssh-clients  cronie && \
    ssh-keygen -A
#设置 root 用户密码
RUN echo "root:root" | chpasswd
# SSH登录设置允许 root 用户
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \
    echo "PubkeyAuthentication yes" >> /etc/ssh/sshd_config && \ 
    echo "AuthorizedKeysFile /root/.ssh/authorized_keys" >> /etc/ssh/sshd_config && \
    mkdir -p /root/.ssh && \
    chmod 700 /root/.ssh
# 暴露 SSH 端口
EXPOSE 22
# 容器启动时启动SSH服务
CMD ["/usr/sbin/sshd", "-D"]

四、创建ConfigMap和Secret

公钥和私钥目录(一般是/root/.ssh)
物理机上

kubectl create configmap ssh-public-keys --from-file=/root/.ssh/id_rsa.pub
kubectl create secret  generic ssh-key-secret  --from-file=/root/.ssh/id_rsa

五、部署免密POD,并挂载公钥和私钥

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ssh
  labels:
    app: ssh
spec:
  selector:
    matchLabels:
      app: ssh
  template:
    metadata:
      labels:
        app: ssh
    spec:
      nodeSelector:
        kubernetes.io/hostname: k8s-node1
      containers:
      - name: ssh
        image: ssh:v1
        command: ["/bin/sh"]
        args:
        - "-c"
        - |
          mkdir -p /root/.ssh &&
          chmod 700 /root/.ssh &&
          echo "$(cat /keys/id_rsa.pub)" > /root/.ssh/authorized_keys &&
          echo "$(cat /keys/id_rsa)" > /root/.ssh/id_rsa &&
          chmod 600 /root/.ssh/authorized_keys /root/.ssh/id_rsa &&
          echo "PubkeyAuthentication yes" >> /etc/ssh/sshd_config &&
          echo "AuthorizedKeysFile /root/.ssh/authorized_keys" >> /etc/ssh/sshd_config &&
          /usr/sbin/sshd -D -e
        ports:
        - containerPort: 22
        volumeMounts:
        - name: ssh-key-volume
          mountPath: "/keys/id_rsa.pub"
          subPath: id_rsa.pub
          readOnly: true
        - name: ssh-key
          mountPath: "/keys/id_rsa"
          subPath: "id_rsa"
          readOnly: true
      volumes:
      - name: ssh-key-volume
        configMap:
          name: ssh-public-keys
      - name: ssh-key
        secret:
          secretName: ssh-key-secret

六、测试

kubectl get po -o wide
ssh ip 试试
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值