跳转至

Kubernetes Secret 跨 Namespace 使用指南

概述

在 Kubernetes 集群中,当我们需要从私有镜像仓库拉取镜像时,通常需要在 Pod 中配置 imagePullSecrets。如果这个 Secret 已经存在于 default namespace 中,而我们需要在其他 namespace 中使用它来拉取镜像,有几种方法可以实现。

场景说明

假设在 default namespace 中已经存在一个用于拉取私有镜像的 Secret:

kubectl get secret -n default

例如,Secret 名称可能是 regcreddocker-registry-secret

方法一:复制 Secret 到目标 Namespace(推荐)

这是最简单直接的方法,将 Secret 从 default namespace 复制到目标 namespace。

步骤 1:导出 Secret

# 导出 default namespace 中的 Secret
kubectl get secret <secret-name> -n default -o yaml > secret.yaml

例如:

kubectl get secret openbayes-regcred -n default -o yaml > regcred.yaml

步骤 2:修改 Secret 的 Namespace

编辑导出的 YAML 文件,删除以下字段:

  • metadata.namespace
  • metadata.uid
  • metadata.resourceVersion
  • metadata.creationTimestamp
  • metadata.selfLink

只修改 namespace:

metadata:
  namespace: istio-ingress

步骤 3:应用到目标 Namespace

# 应用到目标 namespace
kubectl apply -f secret.yaml -n <target-namespace>

方案 2:Namespace 默认 ServiceAccount(全局模板) 虽然 secret 不能跨 namespace,但你可以:

给每个 namespace 的 default ServiceAccount 都自动附带 imagePullSecret

这样 Kubernetes 会把该 namespace 内的所有 Pod 都自动使用此 secret。

kubectl patch serviceaccount default \
  -n istio-system \
  -p '{"imagePullSecrets":[{"name":"openbayes-regcred"}]}'

步骤4:测试

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ssh-security-mon
  namespace: test
spec:
  selector:
    matchLabels:
      name: ssh-security-mon
  template:
    metadata:
      labels:
        name: ssh-security-mon
    spec:
      nodeSelector:
        kubernetes.io/arch: amd64  # 选择 AMD 架构的节点
      tolerations:
      # 容忍 master 节点的污点
      - key: "node-role.kubernetes.io/master"
        operator: "Equal"
        effect: "NoSchedule"
      # 容忍 control-plane 节点的污点
      - key: "node-role.kubernetes.io/control-plane"
        operator: "Equal"
        effect: "NoSchedule"
      containers:
      - name: busybox
        image: registry-lm.cmft.com/cmhk-cmais-lmmp-prd/ssh-security-monitor:v1.0
        imagePullPolicy: Always  # 设置镜像拉取策略为 Always
        command:
        - /bin/sh
        - -c
        - "while true; do sleep 3600; done"
回到页面顶部