k8s 部署远程开发环境

1. Python

1.1. 核心步骤概述

  • 在 k8s 中运行一个带有 Python 环境的 Pod(如 Ubuntu + Python + SSH)。
  • 通过 VS Code Remote-SSH 连接 到 Pod 进行开发。
  • 持久化存储(避免代码丢失)。

1.2. 准备镜像

编写 Dockerfile:

# Containerfile
# 基于官方 Python 镜像(可替换版本)
FROM python:3.11-bookworm

# 安装基础工具链
RUN apt-get update && apt-get install -y \
    git \
    curl \
    wget \
    vim \
    openssh-server \
    sudo \
    htop \
    iputils-ping \
    tar \
    && rm -rf /var/lib/apt/lists/*

# 配置 SSH(允许 root 登录 + 密码认证)
RUN mkdir /var/run/sshd \
    && echo "root:password" | chpasswd \
    && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config \
    && sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config

# 创建开发用户(可选)
RUN useradd -m -s /bin/bash devuser \
    && echo "devuser:password" | chpasswd \
    && usermod -aG sudo devuser \
    && echo "devuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

# 安装常用 Python 工具(可选)
RUN pip install --upgrade pip \
    && pip install \
    pipenv \
    poetry \
    black \
    flake8 \
    mypy \
    pylint \
    pytest \
    ipython \
    jupyterlab \
    debugpy \
    && rm -rf ~/.cache/pip

# 配置工作目录
RUN mkdir -p /workspace
WORKDIR /workspace

# 暴露 SSH 端口
EXPOSE 22

# 启动 SSH 服务(保持容器运行)
CMD ["/usr/sbin/sshd", "-D"]
Dockerfile

构建镜像:

nerdctl build -t python-dev:3.11-bookworm -f Containerfile .
Bash

上传到镜像仓库:

nerdctl tag python-dev:3.11-bookworm crpi-sozjkv641zbs4m9x.cn-shenzhen.personal.cr.aliyuncs.com/pingk-k8s-test/python-dev:3.11-bookworm

nerdctl push crpi-sozjkv641zbs4m9x.cn-shenzhen.personal.cr.aliyuncs.com/pingk-k8s-test/python-dev:3.11-bookworm
Bash

1.3. 准备 Kubernetes 资源

创建 yaml 配置文件

# python-dev-env.yaml

# 创建名称空间
apiVersion: v1
kind: Namespace
metadata:
  name: dev-env
  labels:
    env: dev

---
# 配置文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: python-config
  namespace: dev-env  # 与 Deployment 同命名空间
data:
  # pip 配置文件内容,指定安装的第三方库的存放路径
  pip.conf: |
    [global]
    target=/workspace/site-packages
    proxy = http://192.168.2.100:20172
  # 告诉 Python 解释器额外搜索该路径下的模块。
  custom_path.pth: |
    /workspace/site-packages  

---
# ssh 公钥
apiVersion: v1
kind: Secret
metadata:
  name: ssh-public-key
  namespace: dev-env
data:
  id_rsa.pub: c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBQkl3QUFBUUVBdXBqM2V0aGV6VjZtVVlUUEdXN3A2SkhQSzdXR0RmY0pGSHMxbyt4WGNXV1ozODk5L1JsN1NhRkkwZ3NqUnRkSVRVOElpNlJncXZ4eTVMSHkvbnk1VnhiWVlpenJjMGh6Q2l4aVZFUHJkTVhCWFNJWFRFTDM3N1hrNFlGeTZ1c3dZSUJJUlB5UVVDazlIVGkwZFJKNnNXSTlwdzRuRDZ2Zmxka1h4RTdSM0ptcEFsS0w1aExmQXJBU1NwRUlaeHV6TzhYM0xCbnhuQ1BaS3NrTUlYQTBZVnlDVTJPa25QV0xjV0h2UVpGSGxCYlRnekFNSWhpZGcvYU5qK0hMUEVlVjB0ZytXbTFsM3c1ditrVDJuWHNqTDZobHRXeFphcy9LV1pGNjA5dk9hOTd3TThkaDBqNG4rdlpLVTIvNm14d3R1b3M1V1pmdzBzRFdxTjl0azVOZlhRPT0gcnNhIDIwNDgtMDUzMTI0

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: python-dev-env
  namespace: dev-env
spec:
  replicas: 1
  selector:
    matchLabels:
      app: python-dev
  template:
    metadata:
      labels:
        app: python-dev
    spec:
      nodeName: k8s-node-01 # 本案例使用 hostPath 持久化存储,需要固定调度到某个节点
      containers:
      - name: python-container
        image: crpi-sozjkv641zbs4m9x.cn-shenzhen.personal.cr.aliyuncs.com/pingk-k8s-test/python-dev:3.11-bookworm  # 镜像地址
        ports:
        - containerPort: 22     # SSH 端口
        env:
        - name: TZ  # 时区变量
          value: "Asia/Shanghai"
        volumeMounts:
        - name: pip-config-volume
          mountPath: /root/.pip/pip.conf
          subPath: pip.conf  # 从 ConfigMap 的 data.pip.conf 提取内容
        - name: pip-config-volume
          mountPath: /usr/local/lib/python3.11/site-packages/custom_path.pth
          subPath: custom_path.pth
        - name: code-storage
          mountPath: /workspace # 持久化存储
        - name: vscode-config
          mountPath: /root/.vscode-server  # VS Code 远程扩展目录
        - name: ssh-public-key
          mountPath: "/root/.ssh"
          readOnly: true
        resources:
          limits:
            cpu: "2"
            memory: "4Gi"
          requests:
            cpu: "1"
            memory: "2Gi"
      volumes:
      - name: pip-config-volume
        configMap:
          name: python-config
      - name: code-storage
        hostPath:
          path: /code-storage   # 宿主机目录
          type:  DirectoryOrCreate  # 表示目录不存在则会自动创建
      - name: vscode-config
        hostPath:
          path: /vscode-config
          type: DirectoryOrCreate
      - name: ssh-public-key
        secret:
          secretName: ssh-public-key
          items:
          - key: id_rsa.pub
            path: authorized_keys
   
---
# Service 暴露 SSH
apiVersion: v1
kind: Service
metadata:
  name: python-dev-service
  namespace: dev-env
spec:
  type: NodePort  # 或 LoadBalancer(云环境)
  ports:
  - port: 22
    targetPort: 22
    nodePort: 30022  # 30000-32767 范围
  selector:
    app: python-dev
YAML

部署到 k8s:

kubectl apply -f python-dev-env.yaml
Bash

1.4. 配置 VS Code 远程连接

安装 VS Code 插件:

  • Remote – SSH(微软官方插件)
  • Python(用于 Python 开发支持)

配置 SSH 连接:

Host python-dev
    HostName 192.168.2.151  # 该示例使用 NodePort Service,即可以通过任意一个 k8s节点连接
    User devuser
    Port 30022
    # 禁用 SSH 主机密钥检查,如果 pod 重启会导致主机密钥检查失败报错
    StrictHostKeyChecking no
    UserKnownHostsFile nul   # Windows 的空设备
    IdentityFile C:\xxx  # 私钥
Bash
上一篇
下一篇