如何跨 Namespace 同步 Secret 和 ConfigMap?

Secret 和 ConfigMap 资源对象是命名空间级别的。它们只能被同一命名空间中的 Pod 引用。所以有时候不得不手动为每个命名空间创建它们。

但有很多场景,我们想让它们是全局的,至少可以是跨命名空间共享的 Secret 和 ConfigMap,例如这些场景:

  1. 所有命名空间都有相同的私有注册表,避免为每个命名空间创建相同的 Secret

  2. Kubeshere 中 Devops 项目中的 harbor 凭证、源代码仓库的凭证

如何自动化的在跨命名空间,甚至跨 Kubernetes 集群之间“同步”这些配置,有很多方法。本文就此用例讨论,并用凭证在 Kubesphere Devops 项目之间同步做示例。

可选的方案

脚本

使用 jq实现简单的同步:

kubectl get secret cure-for-covid-19 -n china -o json \| jq 'del(.metadata["namespace","creationTimestamp","resourceVersion","selfLink","uid"])' \| kubectl apply -n rest-of-world -f -

sed 实现简单的同步:

kubectl get secret cure-for-covid-19 -n china -o json \| jq 'del(.metadata["namespace","creationTimestamp","resourceVersion","selfLink","uid"])' \| kubectl apply -n rest-of-world -f -

上面这两种可定制化不强,还是手动方式。

ClusterSecret

要跨命名空间自动共享或同步 Secret,可以使用 Python 开发的 ClusterSecret Operator:

https://github.com/zakkg3/ClusterSecret

ClusterSecret Operator 通过 ClusterSecret CRD 去管理。确保所有匹配的(包括新创建的) 命名空间都有可用的 Secret。ClusterSecret 上的任何更改都会更新所有相关的 Secret。删除 ClusterSecret 也会删除所有克隆的 Secret。

kubernetes-reflector

C#开发的 Kubernetes 反射器:

https://github.com/EmberStack/kubernetes-reflector

它将存储在 Secret 中的凭据或证书自动传播到所有命名空间并保持同步,修改源会更新所有副本。该扩展允许您通过注释自动复制和保持跨命名空间的 Secret:

在源 Secret 上添加注释:

annotations:reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true"

这将在所有命名空间中创建密钥的副本。您可以使用以下方法限制创建副本的命名空间:

reflector.v1.k8s.emberstack.com/reflection-allowed-namespaces: "namespace-1,namespace-2,namespace-[0-9]*"

不足

Kubernetes-reflector 和 ClusterSecret 已经很强大,但还是美中不足。

ClusterSecret 不支持 ConfigMaps 的同步和跨集群的同步,只是简单的通过 matchNamespaceavoidNamespaces 实现模糊的匹配和不匹配。

Kubernetes-reflector 不支持跨集群同步,也是通过正则表达式实现了目标命名空间的模糊匹配。

就项目的 README来看,二者都不支持 label 选择 namespace,用户在 Kubesphere 上创建 Devops 项目,不可能永远遵循模糊匹配表达式。

Config Syncer

以前的名称为 Kubed:

https://github.com/kubeops/config-syncer

Config Syncer 可以 保持 ConfigMaps 和 Secrets 在命名空间和集群之间同步。使用 Go 语言开发,官方文档也比较细致。

参考官方文档安装:

https://appscode.com/products/kubed/v0.12.0/setup/install/

安装 config-syncer

添加 Helm 仓库和更新仓库:

$ helm repo add appscode https://charts.appscode.com/stable/
$ helm repo update

搜索可用的最新安装包:

#  helm search repo appscode/kubed --version v0.13.2
NAME            CHART VERSION   APP VERSION     DESCRIPTION
appscode/kubed  v0.13.2         v0.13.2         Config Syncer by AppsCode - Kubernetes daemon

拉取到本地并解压:

helm fetch  appscode/kubed --version v0.13.2
tar -zxf kubed-v0.13.2.tgz
cd kubed/

修改 values.yaml:

config:# Set cluster-name to something meaningful to you, say, prod, prod-us-east, qa, etc.# so that you can distinguish notifications sent by kubedclusterName: dev# If set, configmaps and secrets from only this namespace will be syncedconfigSourceNamespace: ""# kubeconfig file content for configmap and secret syncerkubeconfigContent: ""

这里的 config.clusterName 默认为 unicorn,如果不修改,kubed 同步之后的资源对象的 label 上会为 kubed.appscode.com/origin.cluster: unicorn,所以出于规范考虑,建议集群名设置为真实的集群名。如果 kubed 只在本集群内同步,就不需要填写 kubeconfigContent 了。

执行安装:

$ helm install config-sync -f values.yaml  -n kubed --create-namespace .
NAME: config-sync
LAST DEPLOYED: Fri May 20 19:43:00 2022
NAMESPACE: kubed
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
To verify that Config Syncer has started, run:kubectl get deployment --namespace kubed -l "app.kubernetes.io/name=kubed,app.kubernetes.io/instance=config-sync"

查看 Pod 启动是否成功:

$ kubectl get pod --namespace kubed -l "app.kubernetes.io/name=kubed,app.kubernetes.io/instance=config-sync"
NAME                                 READY   STATUS    RESTARTS   AGE
config-sync-kubed-8687c98ffb-ldsvz   1/1     Running   0          3m50s$ kubectl get deployment --namespace kubed -l "app.kubernetes.io/name=kubed,app.kubernetes.io/instance=config-sync"
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
config-sync-kubed   1/1     1            1           3m53s

在 Kubesphere 中实践

Kubeshere Devops 项目中的 harbor 凭证、源代码仓库的凭证,有时候每个项目都是一样的,所以没必要每次创建 Devops 项目都去手动创建凭证,一切都变的自动化才是正道。

Kyverno 规则

需要提前创建一个 Kyverno 规则,创建这个的目的下面会做说明。

cat <<EOF | kubectl apply -f -
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:generation: 10name: mutate-credential-secret
spec:background: truefailurePolicy: Failrules:- exclude:resources:namespaces:- kubesphere-devops-systemgenerate:clone: {}match:resources:kinds:- Secretselector:matchLabels:kubed.appscode.com/origin.namespace: kubesphere-devops-systemmutate:patchStrategicMerge:metadata:labels:participant: kyvernofinalizers:- finalizers.kubesphere.io/credentialtype: credential.devops.kubesphere.io/basic-authname: mutate-credential-secret
EOF

可以参考 Kyverno 官方文档 sample-example:

https://kyverno.io/docs/writing-policies/match-exclude/#resource-filters

源 Secret

我们将kubesphere-devops-system命名空间中的凭证作为同步的来源:

cat <<EOF | kubectl apply -f -
kind: Secret
apiVersion: v1
metadata:name: common-encodenamespace: kubesphere-devops-systemlabels:app: common-encodeannotations:kubed.appscode.com/sync: "kubesphere.io/devopsproject"kubesphere.io/creator: adminkubesphere.io/description: 密码经过UrlEncode
data:id: XX==password: XX==username: XX==
type: will-be-modify-by-kyverno
---
kind: Secret
apiVersion: v1
metadata:name: commonnamespace: kubesphere-devops-systemlabels:app: commonannotations:kubed.appscode.com/sync: "kubesphere.io/devopsproject"kubesphere.io/creator: adminkubesphere.io/description: 公用账户
data:password: XX==username: XX==
type: will-be-modify-by-kyverno
EOF

参考 kubed 官方文档:

https://appscode.com/products/kubed/v0.12.0/guides/config-syncer/intra-cluster/

源 Secret 必须指定注解:

kubed.appscode.com/sync: "kubesphere.io/devopsproject"

表明目标命名空间中必须包含label keykubesphere.io/devopsprojectKubesphereDevops项目,默认包含这个label key

需要说明的是:

Kubesphere 根据 Secret 的 type 字段前缀有:credential.devops.kubesphere.io/就会处理。为了避免 kubesphere-devops-system 下的源 Secret 被 ks-controller-manager 同步。所以源 Secret 的 type 不可为:

type: credential.devops.kubesphere.io/basic-auth

源 Secret type 可以自定义一个:

type: will-be-modify-by-kyverno

通过 kyverno 修改为:

type: credential.devops.kubesphere.io/basic-auth

目标命名空间

下面这个 Devops 项目作为命名空间:

k get ns -l kubesphere.io/devopsproject
NAME                       STATUS   AGE
test-ns1xxx                Active   133d

同步结果

创建之后,就在存在 label keykubesphere.io/devopsproject的 namespace 下创建了同名 Secret:

$  k get secret -A | grep common
kubesphere-devops-system          common                                                          will-be-modify-by-kyverno                    2      29s
kubesphere-devops-system          common-encode                                                   will-be-modify-by-kyverno                    3      13m
test-ns1xxx                       common                                                          credential.devops.kubesphere.io/basic-auth   2      28s
test-ns1xxx                       common-encode                                                   credential.devops.kubesphere.io/basic-auth   3      13m

同步之后,kubed 会加一些 labels:

  • kubed.appscode.com/origin.cluster

  • kubed.appscode.com/origin.name

  • kubed.appscode.com/origin.namespace

和 annotations:

  • kubed.appscode.com/origin

apiVersion: v1data:id: XX==password: XX==username: XX==kind: Secretmetadata:annotations:kubed.appscode.com/origin: '{"namespace":"kubesphere-devops-system","name":"common-encode","uid":"a649bc60-0197-4ec2-914b-b6412d2c7d29","resourceVersion":"589340738"}'labels:app: common-encodekubed.appscode.com/origin.cluster: unicornkubed.appscode.com/origin.name: common-encodekubed.appscode.com/origin.namespace: kubesphere-devops-systemname: common-encodenamespace: des-nstype: will-be-modify-by-kyverno

而且会将同步源 Secret 中设置的注解去掉

kubed.appscode.com/sync: "kubesphere.io/devopsproject"

总结

Kubed 可以跨 Kubernetes 命名空间、跨集群同步 ConfigMaps/Secrets。而且暴露了各种监控指标,可以满足大多数配置同步场景。

- END -


后台回复“加群”,带你进入高手交流群

推荐阅读

还怕记不住 Kubectl 命令?K9s 太强大了

Kubernetes 微服务最佳实践

Kubernetes Pod 删除操作源码解析

使用 Lux 下载B站视频,真强大

38 万K8s API 服务暴露在公网上可能被攻击?

大规模 K8s 集群性能瓶颈和调优实践

优雅的跨 Namespace 同步 Secret 和 ConfigMap?

Kruise 轻松让 K8S 应用实现渐进式交付

图解 Kubernetes Pod 如何获取 IP 地址

使用 Telepresence 轻松在本地调试 k8s 应用程序

GitOps 工具选型,33 款工具任你挑!

就在刚刚 k8s 1.24 正式发布,来看功能总览

Nomad 会替代 Kubernetes 吗?两者如何选择?

Docker 入门终极指南,详细版!

漫画轻松看懂如何用 Kubernetes 实现 CI/CD

阿里开源的低代码引擎,已收获 4.5K 星星

新手必须知道的 Kubernetes 架构

Kubernetes 架构核心点详细总结!

10d345520f1e99f1e3b888edd6f95a12.png

全网粉丝20W的头部大号,专注云原生、Golang、Linux实用脚本,效率工具,免费CSDN下载,回复【go】获取近 6 万 Star 的资源回复【1024】获取全种类IT资料,回复【红包封面】获取超好看封面,回复【加群】进入高手如云技术交流群

03ebd0f707274bcbe0cd2571549c5c36.png

分享、点赞和在看

支持我们分享更多好文章,谢谢!

 点个在看集群永保稳定👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文总结学习 Python 的 14 张思维导图

本文主要涵盖了 Python 编程的核心知识&#xff08;暂不包括标准库及第三方库&#xff0c;后续会发布相应专题的文章&#xff09;。 首先&#xff0c;按顺序依次展示了以下内容的一系列思维导图&#xff1a;基础知识&#xff0c;数据类型&#xff08;数字&#xff0c;字符串&am…

GEE学习笔记

掩膜 ​ 在遥感图像处理中&#xff0c;"掩膜"是指一种用于隐藏或保留图像特定部分的技术。掩膜通常是一个二进制图像&#xff0c;其中的像素值为0或1&#xff0c;分别表示遮蔽或保留。 ​ 在去除云的情境中&#xff0c;掩膜通常用于隐藏图像中被云覆盖的部分&#…

十一、飞机大战(IVX 快速开发教程)

十一、飞机大战 制作微信小游戏大致流程与微信小程序、Web类似&#xff0c;不同的在于是组件的使用。 文章目录十一、飞机大战11.1.1 完成游戏角色制作11.1.2 完成物理世界添加11.1.3 完成子弹对象反重力运动11.1.4 使用对象组创建子弹11.1.5 子弹优化11.1.6 设置敌机11.1.7 优…

中国版LinkedIn呼之欲出

迄今为止&#xff0c;发展势头强劲的Facebook仍未上市&#xff0c;而美国职业社交网站LinkedIn 却率先登录纽约证券交易所&#xff0c;股价在第一天的交易中飙升&#xff0c;从45美元的发行价上涨了一倍&#xff0c;然后超过100美元&#xff0c;最终以94.25美元收盘。 LinkedIn…

Android之实现RecyclerView拖拽效果和固定部分元素不进行交换位置(包含源代码下载地址)

1、效果爆照 启动的效果 拖动过程中的效果 拖动后的效果 2、需求和问题 需求:RecyclerView实现拖拽效果,但是部分固定位置不能进行拖拽也不能在拖拽的过程中交换顺序

各主流浏览器内核介绍

所谓的“浏览器内核”无非指的是一个浏览器最核心的部分——“Rendering Engine”&#xff0c;直译这个词汇叫做“渲染引擎”&#xff0c;不过我们也常称其为“排版引擎”、“解释引擎”。这个引擎的作用是帮助浏览器来渲染网页的内容&#xff0c;将页面内 容和排版代码转换为用…

测绘地理信息标准(国家、行业、地方)大全来了:测绘地理信息标准化服务平台

测绘地理信息标准化服务平台&#xff0c;这里有你需要的所有标准&#xff0c;赶快来围观吧&#xff01;

WPF效果第一百八十七篇之再玩ListBox

大周末的接着上一篇又玩了ListBox,这不又来再次去玩耍ListBox;毕竟是我的最爱,没办法就喜欢玩耍他;闲话也不多扯了,直接看最终效果:2、ItemsPanel还是老样子:<ItemsPanelTemplate x:Key"CommonItemsPanelTemplate"><WrapPanel Orientation"Horizontal&…

利用pdf.js开发嵌入pdf显示,以及利用jquery-ui左右分栏显示

原来考虑用pdf.js的viewer.html页面&#xff0c;但怎么用都不方便。因此直接用pdf.js在左侧连续显示pdf所有内容&#xff0c;右侧显示其它相关内容&#xff0c;并且左右宽度可以任意拖动&#xff0c;最终实现效果如图&#xff1a; 代码&#xff1a;<!DOCTYPE html><ht…

十三、制作 iVX音乐分享小程序

功能介绍 通过前几节的学习&#xff0c;我们对完成一个应用已经有了一些自己的心得。在此再次再制作一个小的音乐小程序应用。该应用一共分为首页、榜单页、音乐分享页和音乐搜索页。 首页&#xff1a; 榜单内容页&#xff1a; 音乐分享页&#xff1a; 音乐搜索页&#xff1a…

01_反射_02_反射类的构造方法

【工程截图】 【Person.java】 //将要被反射的类 package com.Higgin.reflect; import java.util.List;public class Person {private String name"NULL";private int age0;public Person(){System.out.println("构造方法&#xff1a;Person()");}public P…

私有云搭建 OpenStack(centos7.3, centos-release-openstack-ocata)

OpenStack&#xff08;centos7.3,centos-release-openstack-ocata&#xff09;nova&#xff1a;计算节点queue&#xff1a;消息队列&#xff0c;系统瓶颈所在scheduler&#xff1a;调度机制conductor&#xff1a;更新数据库cert&#xff08;objectstore&#xff09;&#xff1a…

C# 类继承中的私有字段都去了哪里?

最近在看 C 类继承中的字段内存布局&#xff0c;我就很好奇 C# 中的继承链那些 private 字段都哪里去了? 在内存中是如何布局的&#xff0c;毕竟在子类中是无法访问的。一&#xff1a;举例说明 为了方便讲述&#xff0c;先上一个例子&#xff1a;internal class Program{stati…

大型分布式网站架构技术总结

本文是学习大型分布式网站架构的技术总结。对架构一个高性能&#xff0c;高可用&#xff0c;可伸缩&#xff0c;可扩展的分布式网站进行了概要性描述&#xff0c;并给出一个架构参考。一部分为读书笔记&#xff0c;一部分是个人经验总结。对大型分布式网站架构有很好的参考价值…

python 数据分析找到老外最喜欢的中国美食【完整代码】

一、环境及依赖 语言&#xff1a;python3.8 抓取&#xff1a;selenium 代理&#xff1a;ipide **注&#xff1a;**想要完整代码的在末尾&#xff0c;注意新手建议慢慢看完。在此提示一下本篇文章的编写步骤&#xff1a;1.获取数据、2.翻译、3.数据清洗、4.切词词权重、5.词云 …

hihoCoder 1257 Snake Carpet(很简单的构造方法)

2015 ACM / ICPC 北京现场赛 I 题 构造 注意一个小坑&#xff0c;每条蛇的输出是要从头到尾输出的。 还要注意的是&#xff0c;不能开数组去模拟构造过程&#xff0c;然后输出&#xff0c;那样会TLE的。 #include <cstdio> #include <cstring> #include <cmath&…

西北师范大学地理与环境科学学院考研真题汇总(高等数学)持续更新。。。

西北师范大学地理与环境学科学院研究生入学考试的所有专业(地图学与地理信息系统、自然地理学、人文地理学、环境科学、环境工程)的数学均为自主命题,复习参考教材为同济大学第五版。

Java网络编程二:Socket详解

Socket又称套接字&#xff0c;是连接运行在网络上两个程序间的双向通讯的端点。 一、使用Socket进行网络通信的过程 服务端&#xff1a;服务器程序将一个套接字绑定到一个特定的端口&#xff0c;并通过此套接字等待和监听客户端的连接请求。 客户端&#xff1a;客户端程序根据你…

在 .NET 中使用 FixedTimeEquals 应对计时攻击

计时攻击 在计算机安全中&#xff0c;计时攻击&#xff08;Timing attack&#xff09;是旁道攻击 &#xff08;Side-channel attack&#xff09; 的一种&#xff0c;而旁道攻击是根据计算机处理过程发出的信息进行分析&#xff0c;包括耗时&#xff0c;声音&#xff0c;功耗等…

解读大型网站系统架构的演化

解读大型网站系统架构的演化 大型网站的架构是根据业务需求不断完善的&#xff0c;根据不同的业务特征会做特定的设计和考虑&#xff0c;本文只是讲述一个常规大型网站会涉及的一些技术和手段。作者&#xff1a;李平来源&#xff1a;LEE的博客前言 一个成熟的大型网站&#xff…