如何优雅的跨 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 -

 点个在看集群永保稳定👇

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

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

相关文章

定量遥感:计算地方时和太阳高度角(C++代码)

在定量遥感中,通常需要计算地方时和太阳高度角,本文采用C++语言实现。 #include <cmath> #include <iostream> #include <fstream> using namespace std; void main() {int JD,NF,Y,R,s[5],F[5];float JF,WD;float N0;ifstream data1("d:\\result\\da…

html5 语义化标签

html5 语义化标签 在HTML 5出来之前&#xff0c;我们用div来表示页面章节&#xff0c;但是这些div都没有实际意义。&#xff08;即使我们用css样式的id和class形容这块内容的意义&#xff09;。这些标签只是我们提供给浏览器的指令&#xff0c;只是定义一个网页的某些部分。但…

Android之实现首尾带圆角的多颜色水平条

1 效果图 3 代码实现 这里我们采用PercentRelativeLayout布局,首尾我们用半圆shape实现,代码如下 color.xml <color name="progress_first">#1ebBd5</color><color name="progress_second">#f36f53</color><color name=&…

setAutoCommit(false)导致读不到数据

如果把Connection的AutoCommit设为False,两次executeQuery之间&#xff0c;通过其它途径&#xff08;我通过Navicat&#xff09;修改了status值为1&#xff0c;第二次executeQuery依然把那条数据读出来了&#xff0c;也就是说&#xff0c;我在Navicat中的操作就像没有发生一样&…

log4j简介及应用

一、介绍 Log4j是Apache的一个开放源代码项目&#xff0c;通过使用Log4j&#xff0c;我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等&#xff1b;我们也可以控制每一条日志的输出格式&#xff1b;通过…

(9)有一些人在学习编程的时候总以为代码是死板的

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

GPS实验一:GPS手持机的使用

一、实习目的 了解GPS手持机的使用 二、实习内容 了解GPS手持机的功能和相关操作 三、实习地点 选择视野开阔的场所,方便接受卫星信号。 四、实习工具 GPS接收机是一款手持型的个人导航设备,它可以利用GPS卫星星座计算出当前的位置。其主要图标有:OUT/IN(放大/缩小)、N…

.NET性能优化-推荐使用Collections.Pooled

简介性能优化就是如何在保证处理相同数量的请求情况下占用更少的资源&#xff0c;而这个资源一般就是CPU或者内存&#xff0c;当然还有操作系统IO句柄、网络流量、磁盘占用等等。但是绝大多数时候&#xff0c;我们就是在降低CPU和内存的占用率。之前分享的内容都有一些局限性&a…

Android之PC浏览器上传表单格式大文件到手机客户端read函数阻塞问题

1 、问题 PC浏览器上传表单格式大文件到手机服务器端,然后read文件真实数据时候出现阻塞。 比如 User-Agent: PostmanRuntime/7.26.1Accept: */*Cache-Control: no-cachePostman-Token: c7e5e240-4398-4ac6-ba7f-98e99b5b4a01Host: 10.15.42.180:9999Accept-Encoding: gzip,…

避免活跃性危险(第十章)

2019独角兽企业重金招聘Python工程师标准>>> 避免活跃性危险 在安全性与活跃性之间通常存在着某种制衡&#xff0c;我们使用加锁机制来确保线程安全&#xff0c;但如果过度地使用加锁&#xff0c;则可能导致“锁顺序死锁”。同样&#xff0c;我们使用线程池和信号量…

[poj2446]Chessboard

Description 给定一个mn的棋盘&#xff0c;上面有k个洞&#xff0c;求是否能在不重复覆盖且不覆盖到洞的情况下&#xff0c;用21的卡片完全覆盖棋盘。 Input 第一行有三个整数n,m,k(0<m,n<32, 0<k<mn)&#xff0c;m表示行数&#xff0c;n表示列数。 接下来k行&…

Ubuntu下编译内核

一、下载源代码和编译软件的准备 下载内核源代码&#xff1a;http://www.kernel.org/ 注意&#xff0c;点击2.6.25内核的F版&#xff0c;即完整版。 如果你懒得去网站点联接&#xff0c;运行下列命令&#xff1a; 代码:$cd ~$ wget http://www.kernel.org/pub/linux/kernel/v2.…

(10)C#偷懒的开始永无止境的循环?

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

活照片 android,活照片app安卓

活照片app是当前国内一款最新的图片处理应用软件&#xff0c;能帮助大家快速进行最新的手机拍照、处理功能&#xff0c;当前活照片app已经推出了安卓、苹果版本&#xff0c;可以帮助大家一键修图&#xff0c;将你的图片变得更加有趣。活照片app功能&#xff1a;它可以让你的照片…

Jwt隐藏大坑,通过源码揭秘

前言JWT是目前最为流行的接口认证方案之一&#xff0c;有关JWT协议的详细内容&#xff0c;请参考&#xff1a;https://jwt.io/introduction今天分享一下在使用JWT在项目中遇到的一个问题&#xff0c;主要是一个协议的细节&#xff0c;非常容易被忽略&#xff0c;如果不是自己遇…

GPS实验二:GPS接收机的使用

一、实习目的 1、了解GPS接收机的基本结构; 2、掌握GPS接收机的一般操作方法。 二、实习内容 1、了解GPS接收机的外观及主要构成单元; 2、学习GPS接收机的安装及静态测量的操作方法; 3、了解GPS接收机工作时的基本状态信息。 三、实习地点 选择视野开阔的场所,视场…

Android之解决CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout+RecyclerView里面再嵌套RecyclerView滑动颤抖问题

1 问题 主页面用的是这种结构 CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout+RecyclerView(里面再嵌套RecyclerView,然后这个RecyclerView再嵌套一个RecyclerView)上下滑动在AppBarLayout下面出现页面上下颤抖问题 2 分析 我的主页代码如下 <?xml versio…

文件传输基础——Java IO流

一、文件的编码 1 package com.study.io;2 3 4 /**5 * 测试文件编码6 */7 public class EncodeDemo {8 9 /** 10 * param args 11 * throws Exception 12 */ 13 public static void main(String[] args) throws Exception { 14 String s&quo…

keepalived实现nginx的高可用(双主模型)

实验环境&#xff1a;RS1&#xff1a;rip&#xff08;172.16.125.7&#xff09;&#xff0c;安装httpd软件包&#xff1b;RS2&#xff1a;rip&#xff08;172.16.125.8&#xff09;&#xff0c;安装httpd软件包&#xff1b;director1&#xff08;7-1.lcs.com&#xff09;&#…

【必懂C++】第一个程序当然是HelloWorld呀 01

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。系列教程将会…