如何跨 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.pswp.cn/news/286661.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286661.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286661.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OS X 10.11 安裝Cocoapods

sudo gem install cocoapods報如下錯誤&#xff1a; ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/xcodeproj 解決的辦法是&#xff1a;sudo gem install -n /usr/local/bin cocoapods gem影像改成&#xff1a;https://ruby.taobao.org/…

一文總結學習 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&…

Nginx支持比Apache高并發的原因

1.先從各自使用的多路復用IO模型說起&#xff1a; select模型&#xff1a;&#xff08;apache使用&#xff0c;由于受模塊等限制&#xff0c;用的不多&#xff09; 單個進程能夠 監視的文件描述符的數量存在最大限制select()所維護的 存儲大量文件描述符的數據結構 &#xf…

利用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…

西北師范大學地理與環境科學學院考研真題匯總(自然地理學)持續更新。。。

西北師范大學地理與環境學科學院研究生入學考試的所有專業(地圖學與地理信息系統、自然地理學、人文地理學、環境科學、環境工程)的專業課均為自然地理學,本文持續收集整理歷年自然地理學考研入學考試真題。 1998年 一、名詞 1. 焚風 2. 徑流模數 3. 趨同適應 4. 墨卡托…

Android之提示type checking has run into a recrusive problem. Easiest workaround: specify types of your

1 問題 寫kotlin的時候錯誤提示如下 type checking has run into a recrusive problem. Easiest workaround: specify types of your declarations explicitly 2 分析 我寫得是遞歸函數如下&#xff0c;錯誤提示就是上面&#xff0c;是因為我們寫返回值&#xff0c;才導致 s…

私有云搭建 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.詞云 …

Android之檢查跳轉的Activity是否存在

1、需求 android我們知道經常會跳各種設置頁面,比如設置默認瀏覽器頁面、設置添加快捷方式權限頁面,我們會根據機型進行適配,但是有時候如果找到也找個頁面不try catch操作程序會奔潰 2、檢查跳轉的Activity是否存在代碼實現 public static boolean hasActivity(Context co…