零代碼入侵:Kubernetes 部署時自動注入 kube-system UID 到 .NET 9 環境變量

在現代化 .net9 應用部署階段,零代碼入侵模式,自動獲取 kubernetes 命名空間 kube-systemUID,并其作為變量配置到應用。

以下是幾種實現方式:

方法一:使用 InitContainer + Downward API

您可以通過 KubernetesDownward APIinitContainers 在部署時將 kube-system 命名空間的 UID 自動注入到 .NET 9 應用的環境變量中,無需編寫代碼。

apiVersion: apps/v1
kind: Deployment
metadata:name: dotnet-app
spec:replicas: 1selector:matchLabels:app: dotnet-apptemplate:metadata:labels:app: dotnet-appspec:serviceAccountName: dotnet-app-sainitContainers:- name: get-cluster-uidimage: bitnami/kubectl:latestcommand:- sh- -c- |# 獲取 kube-system 命名空間的 UIDKUBE_SYSTEM_UID=$(kubectl get namespace kube-system -o jsonpath='{.metadata.uid}')echo "kube-system UID: $KUBE_SYSTEM_UID"# 將 UID 寫入共享卷echo "$KUBE_SYSTEM_UID" > /shared/cluster-uidvolumeMounts:- name: shared-datamountPath: /sharedcontainers:- name: dotnet-appimage: your-dotnet-app:latestenv:# 通過 Downward API 從卷中讀取 UID- name: KUBE_SYSTEM_UIDvalueFrom:configMapKeyRef:name: cluster-infokey: kube-system-uidoptional: truevolumeMounts:- name: shared-datamountPath: /sharedvolumes:- name: shared-dataemptyDir: {}
---
apiVersion: v1
kind: ServiceAccount
metadata:name: dotnet-app-sa
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: dotnet-app-cluster-role
rules:
- apiGroups: [""]resources: ["namespaces"]verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: dotnet-app-cluster-rolebinding
subjects:
- kind: ServiceAccountname: dotnet-app-sanamespace: default
roleRef:kind: ClusterRolename: dotnet-app-cluster-roleapiGroup: rbac.authorization.k8s.io

方法二:使用 ConfigMap + Helm 或 Kustomize 預處理

1. 創建預處理腳本 (pre-deploy.sh)

#!/bin/bash# 獲取 kube-system UID
KUBE_SYSTEM_UID=$(kubectl get namespace kube-system -o jsonpath='{.metadata.uid}')# 創建包含 UID 的 ConfigMap
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:name: cluster-info
data:kube-system-uid: "$KUBE_SYSTEM_UID"cluster-created: "$(date -u +%Y-%m-%dT%H:%M:%SZ)"
EOFecho "ConfigMap 'cluster-info' created with kube-system UID: $KUBE_SYSTEM_UID"

2. Deployment 配置

apiVersion: apps/v1
kind: Deployment
metadata:name: dotnet-app
spec:replicas: 1selector:matchLabels:app: dotnet-apptemplate:metadata:labels:app: dotnet-appspec:containers:- name: dotnet-appimage: your-dotnet-app:latestenv:# 直接從 ConfigMap 注入環境變量- name: KUBE_SYSTEM_UIDvalueFrom:configMapKeyRef:name: cluster-infokey: kube-system-uid- name: CLUSTER_CREATEDvalueFrom:configMapKeyRef:name: cluster-infokey: cluster-created

方法三:使用 Kubernetes Job 預先創建 ConfigMap

1. 創建 Job 來生成 ConfigMap

apiVersion: batch/v1
kind: Job
metadata:name: create-cluster-info
spec:ttlSecondsAfterFinished: 300  # Job 完成后 5 分鐘自動清理template:spec:serviceAccountName: cluster-info-sarestartPolicy: Nevercontainers:- name: kubectlimage: bitnami/kubectl:latestcommand:- sh- -c- |# 等待 API Server 準備就緒sleep 5# 獲取 kube-system UIDKUBE_SYSTEM_UID=$(kubectl get namespace kube-system -o jsonpath='{.metadata.uid}')# 創建 ConfigMapkubectl create configmap cluster-info \--from-literal=kube-system-uid="$KUBE_SYSTEM_UID" \--from-literal=cluster-created="$(date -u +%Y-%m-%dT%H:%M:%SZ)" \--dry-run=client -o yaml | kubectl apply -f -echo "Successfully created ConfigMap with kube-system UID: $KUBE_SYSTEM_UID"
---
apiVersion: v1
kind: ServiceAccount
metadata:name: cluster-info-sa
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: cluster-info-role
rules:
- apiGroups: [""]resources: ["namespaces"]verbs: ["get", "list"]
- apiGroups: [""]resources: ["configmaps"]verbs: ["create", "get", "update"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: cluster-info-rolebinding
subjects:
- kind: ServiceAccountname: cluster-info-sa
roleRef:kind: Rolename: cluster-info-roleapiGroup: rbac.authorization.k8s.io

2. 主應用 Deployment

apiVersion: apps/v1
kind: Deployment
metadata:name: dotnet-app
spec:replicas: 1selector:matchLabels:app: dotnet-apptemplate:metadata:labels:app: dotnet-appspec:containers:- name: dotnet-appimage: your-dotnet-app:latestenv:# 從預先創建的 ConfigMap 注入環境變量- name: KUBE_SYSTEM_UIDvalueFrom:configMapKeyRef:name: cluster-infokey: kube-system-uid- name: CLUSTER_CREATEDvalueFrom:configMapKeyRef:name: cluster-infokey: cluster-created

方法四:使用 Admission Controller 或 Mutating Webhook

如果您有更高級的需求,可以創建一個 Mutating Webhook,在 Pod 創建時自動注入環境變量:

# 簡化的示例,實際實現需要編寫 Webhook 服務
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:name: cluster-info-injector
webhooks:
- name: cluster-info.example.comclientConfig:service:name: webhook-servicenamespace: webhook-namespacepath: "/mutate"rules:- operations: ["CREATE"]apiGroups: [""]apiVersions: ["v1"]resources: ["pods"]# 其他配置...

在 .NET 9 應用中讀取環境變量

無論使用哪種方案,您的 .NET 9 應用都可以通過標準方式讀取環境變量:

// Program.cs
var kubeSystemUID = Environment.GetEnvironmentVariable("KUBE_SYSTEM_UID");
Console.WriteLine($"Kube System UID: {kubeSystemUID}");// 或者使用 IConfiguration
var kubeSystemUID = builder.Configuration["KUBE_SYSTEM_UID"];

推薦方案

對于大多數場景,我推薦使用 方法二(ConfigMap + 預處理腳本),因為:

  1. 簡單可靠:不需要復雜的初始化邏輯
  2. 易于維護ConfigMap 可以獨立管理和更新
  3. 性能好:不需要在每次 Pod 啟動時執行額外操作
  4. 靈活性高:可以同時注入多個集群相關信息

部署流程:

# 1. 運行預處理腳本創建 ConfigMap
./pre-deploy.sh# 2. 部署應用
kubectl apply -f deployment.yaml

這樣您的 .NET 9 應用就可以通過標準的環境變量方式獲取 KUBE_SYSTEM_UID,而無需編寫任何代碼來獲取該信息。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96425.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96425.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96425.shtml

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

相關文章

基于Redis設計一個高可用的緩存

本文為您介紹&#xff0c;如何逐步設計一個基于Redis的高可用緩存。 目錄 業務背景 步驟一&#xff1a;寫一個最簡單的緩存設計 存在的問題&#xff1a;大量冷數據占據Redis內存 解決思路&#xff1a;讓緩存自主釋放 步驟二&#xff1a;為緩存設置超時時間 存在的問題&a…

從原理到實踐:LVS+Keepalived構建高可用負載均衡集群

從原理到實踐&#xff1a;LVSKeepalived構建高可用負載均衡集群 文章目錄從原理到實踐&#xff1a;LVSKeepalived構建高可用負載均衡集群一、為什么需要LVSKeepalived&#xff1f;二、核心原理&#xff1a;Keepalived與VRRP協議1. VRRP的核心思想2. Keepalived的三大功能三、LV…

iOS混淆工具實戰 在線教育直播類 App 的課程與互動安全防護

近年來&#xff0c;在線教育直播類 App 已成為學生與培訓機構的重要工具。無論是 K12 教育、職業培訓&#xff0c;還是興趣學習&#xff0c;App 中承載的課程視頻、題庫與互動邏輯都是極高價值的內容資產。 然而&#xff0c;教育直播應用同樣面臨多重安全風險&#xff1a;課程視…

第2節-過濾表中的行-BETWEEN

摘要: 在本教程中&#xff0c;您將學習如何在 WHERE 子句中使用 PostgreSQL 的 BETWEEN 運算符來檢查某個值是否在兩個值之間。 PostgreSQL BETWEEN 運算符 BETWEEN運算符是一種比較運算符&#xff0c;如果某個值介于兩個值之間&#xff0c;則返回true。 以下是 BETWEEN 運算符…

Windows 11 手動下載安裝配置 uv、配置國內源

Windows 11 手動下載安裝配置 uv、配置國內源 本文對應的講解視頻鏈接&#xff1a;https://www.bilibili.com/video/BV1WnYTzZEpW 文章目錄Windows 11 手動下載安裝配置 uv、配置國內源1. 下載、安裝、配置 uv2. 參考信息重要聲明&#xff1a; uv 的安裝有很多種方式&#xff…

平板熱點頻繁斷連?三步徹底解決

平板反復斷開熱點連接是一個非常常見且令人煩惱的問題。這通常不是單一原因造成的&#xff0c;而是多種因素疊加的結果。 我們可以從熱點發射設備&#xff08;手機等&#xff09;、平板本身、以及環境因素三個方面來排查和解決。 一、 熱點發射端&#xff08;通常是手機&#x…

Qt文件操作的學習(三)

一、實現簡易文本編輯器 主要用到帶菜單欄的窗口&#xff0c;而非單一窗口。QT已經寫好相關操作&#xff0c;就不在重新造輪子了功能設計&#xff1a;新建文本文檔&#xff0c;打開文件&#xff0c;保存文件&#xff0c;另存為 這次不同于之前直接可以在控件上面右擊槽了&…

ArcGIS學習-20 實戰-縣域水文分析

水文分析任務提取區域內水流方向、匯流累積量、河網、流域、子流域前置操作環境更改加載數據檢查投影坐標系河網分析洼地填充限制默認為空&#xff0c;認為所有洼地都是需要填充的&#xff0c;這里更正一下Fill_DEM需要加上后綴.tif流向分析得到流量分析得到這里的黑色代表非河…

本地 Docker 環境 Solr 配置 SSL 證書

一、簡介 在本地開發環境中為 Solr 配置 SSL 證書,是提升開發與測試一致性的關鍵步驟。尤其是在涉及安全傳輸需求的場景中,本地環境的 HTTPS 配置能有效避免因環境差異導致的問題。本文將詳細介紹如何利用 Docker 容器,快速為 Solr 服務配置自簽名 SSL 證書,實現本地 HTTP…

MacOS 運行CosyVoice

CosyVoic主要特點&#xff1a;1、支持中文、英文、上海話、天津話、四川話等方言。語音非常自然。2、支持3秒語音零樣本克隆&#xff0c;效果非常好。3、克隆時間比較長&#xff08;取決于GPU性能&#xff0c;使用H20以滿足低延遲輸出&#xff09;&#xff0c;L4 克隆默認文本需…

我不是掛王-用python實現燕雙鷹小游戲3

在前兩個版本的更新后,越來越多內容,操作和運行也不方便,優化第三版本窗口可視化界面 本次版本更新使得可讀性和可操作性大幅度增加,前面2版本可分別參考 我不是掛王-用python實現燕雙鷹小游戲 和 我不是掛王-用python實現燕雙鷹小游戲2 一.燕雙鷹窗口可視化(燕雙鷹3.0) 新燕雙…

裝飾(Decorator)模式可以在不修改對象外觀和功能的情況下添加或者刪除對象功能

試題&#xff08;35&#xff09;、&#xff08;36&#xff09;某系統中的文本顯示類&#xff08;TextView&#xff09;和圖片顯示類&#xff08;PictureView&#xff09;都繼承了組件類&#xff08;Component&#xff09;&#xff0c;分別顯示文本和圖片內容&#xff0c;現需要…

深度學習基礎概念【持續更新】

1. 梯度消失如果網絡中某一層的激活函數&#xff08;如 sigmoid 或 tanh&#xff09;在輸入較大的情況下有很小的梯度&#xff08;比如接近零&#xff09;&#xff0c;那么當這些小的梯度通過多層反向傳播時&#xff0c;它們會逐漸變得更小。這意味著在深層網絡的前面幾層&…

上下文工程:AI應用成功的關鍵架構與實踐指南

在AI應用開發中&#xff0c;模型能力只決定性能上限&#xff0c;而上下文質量決定性能下限——上下文工程正是確保AI系統理解用戶意圖、生成準確響應的核心工程技術&#xff0c;已成為區分普通AI應用與卓越AI應用的關鍵因素。一、上下文工程&#xff1a;AI應用的新核心競爭力 1…

數據傳輸優化-異步不阻塞處理增強首屏體驗

背景&#xff1a;主 project 頁面中會將視頻存儲到云端后獲得 ID &#xff0c;然后用 ID 調用 后端API POST到數據庫后拿到掛載頁面URL&#xff0c;接著傳入視頻分享組件&#xff08;由于視頻分享子組件的目標是分享視頻掛載頁面&#xff0c;所以前置步驟不能少&#xff09;con…

【芯片設計-信號完整性 SI 學習 1.0 -- SI 介紹】

文章目錄一、SoC 設計驗證階段的 SI 測試主要工作舉例二、芯片 Bringup 階段的 SI 測試主要工作舉例三、SI-PI 聯合仿真主要內容舉例四、整體總結一、SoC 設計驗證階段的 SI 測試 在 前硅階段&#xff08;pre-silicon&#xff09;&#xff0c;設計團隊需要確保 SoC 與外設接口…

C語言鏈表設計及應用

鏈表鏈表節點設計鏈表項目鏈表中的傳址調用檢查申請空間鏈表尾插鏈表頭插鏈表尾部刪除鏈表頭部刪除鏈表的查找指定位置之前插入指定位置之后插入數據刪除指定位置&#xff08;節點&#xff09;數據刪除指定位置&#xff08;節點&#xff09;之后的數據鏈表的銷毀前面學習了順序…

使用 YAML 自動化 Azure DevOps 管道

1. 在 Azure DevOps 中設置 YAML 管道 開始之前,您需要擁有一個 Azure DevOps 帳戶和一個 git 倉庫。 要創建 YAML 管道, 1. 導航至 Azure DevOps → 選擇您的項目 2. 前往“管道”→ 點擊“新建管道” 3. 選擇您的倉庫(Azure Repos、GitHub 等) 4. 選擇“Starter Pipelin…

基于Spring Boot的幼兒園管理系統

基于Spring Boot的幼兒園管理系統 源碼獲取&#xff1a;https://mbd.pub/o/bread/YZWXlZtsbQ 引言 在數字化轉型的浪潮中&#xff0c;教育行業的信息化建設顯得尤為重要。幼兒園作為基礎教育的重要環節&#xff0c;其管理系統的現代化水平直接關系到教育質量和運營效率。本文…

【NVIDIA-B200】 ‘CUDA driver version is insufficient for CUDA runtime version‘

目錄 一、錯誤核心原因 二、排查步驟 1. 檢查當前驅動版本 2. 檢查 CUDA 運行時版本 3. 驗證驅動與 CUDA 的兼容性 三、解決方法 1. 確保驅動正確加載 2. 重新安裝匹配的驅動與 CUDA 3. 驗證環境正確性 四、關鍵注意事項 報錯日志: bash nccl.sh ------------5.安…