Kubernetes Secret 跨 Namespace 使用指南¶
概述¶
在 Kubernetes 集群中,当我们需要从私有镜像仓库拉取镜像时,通常需要在 Pod 中配置 imagePullSecrets。如果这个 Secret 已经存在于 default namespace 中,而我们需要在其他 namespace 中使用它来拉取镜像,有几种方法可以实现。
场景说明¶
假设在 default namespace 中已经存在一个用于拉取私有镜像的 Secret:
kubectl get secret -n default
例如,Secret 名称可能是 regcred 或 docker-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.namespacemetadata.uidmetadata.resourceVersionmetadata.creationTimestampmetadata.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"