如何優雅的跨 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.pswp.cn/news/287080.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287080.shtml
英文地址,請注明出處:http://en.pswp.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;迷茫的你會找到答案。系列教程將會…