【云原生】kubernetes中secret原理詳解與應用實戰

在這里插入圖片描述

?? 歡迎大家來到景天科技苑??

🎈🎈 養成好習慣,先贊后看哦~🎈🎈

🏆 作者簡介:景天科技苑
🏆《頭銜》:大廠架構師,華為云開發者社區專家博主,阿里云開發者社區專家博主,CSDN全棧領域優質創作者,掘金優秀博主,51CTO博客專家等。
🏆《博客》:Python全棧,前后端開發,小程序開發,人工智能,js逆向,App逆向,網絡系統安全,數據分析,Django,fastapi,flask等框架,云原生k8s,linux,shell腳本等實操經驗,網站搭建,數據庫等分享。

所屬的專欄:云原生K8S,零基礎到進階實戰
景天的主頁:景天科技苑

文章目錄

  • 1.Secret概述
    • 1.1 Secret是什么?
    • 1.2 使用Secret
      • 1、通過環境變量引入Secret
      • 2、通過volume掛載Secret

1.Secret概述

1.1 Secret是什么?

前面我們一起探討了k8s的Configmap一般是用來存放明文數據的,如配置文件,
對于一些敏感數據,如密碼、私鑰等數據時,要用secret類型。

Secret解決了密碼、token、秘鑰等敏感數據的配置問題,而不需要把這些敏感數據暴露到鏡像或者Pod Spec中。
Secret可以以Volume或者環境變量的方式使用。

要使用 secret,pod 需要引用 secret。Pod 可以用兩種方式使用 secret:
作為 volume 中的文件被掛載到 pod 中的一個或者多個容器里,
或者當 kubelet 為 pod 拉取鏡像時使用。

secret可選參數有三種:

  • generic: 通用類型,通常用于存儲密碼數據。
  • tls:此類型僅用于存儲私鑰和證書。
  • docker-registry: 若要保存docker倉庫的認證信息的話,就必須使用此種類型來創建。

Secret類型有三種:

  • Service Account:用于被 serviceaccount 引用。
    serviceaccout 創建時 Kubernetes 會默認創建對應的 secret。
    Pod 如果使用了 serviceaccount,對應的 secret 會自動掛載到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目錄中。

  • Opaque:base64編碼格式的Secret,用來存儲密碼、秘鑰等。可以通過base64 --decode解碼獲得原始數據,因此安全性弱

  • kubernetes.io/dockerconfigjson:用來存儲私有docker registry的認證信息。

1.2 使用Secret

1、通過環境變量引入Secret

#把mysql的root用戶的password創建成secret

[root@master01 secret ]#kubectl create secret generic mysql-password --from-literal=password=Jxxxxxxx3x
secret/mysql-password created
[root@master01 secret ]#kubectl get secret
NAME                          TYPE                                  DATA   AGE
default-token-xc8dr           kubernetes.io/service-account-token   3      12d
mysql-password                Opaque                                1      19s
nfs-provisioner-token-8mxt9   kubernetes.io/service-account-token   3      4d22h
[root@master01 secret ]#kubectl describe secret mysql-password
Name:         mysql-password
Namespace:    default
Labels:       <none>
Annotations:  <none>Type:  OpaqueData
====
password:  14 bytes

#password的值是加密的,
#但secret的加密是一種偽加密,它僅僅是將數據做了base64的編碼.

#創建pod,引用secret

[root@master01 secret ]#vim pod-secret.yaml 
apiVersion: v1
kind: Pod
metadata:name: pod-secretlabels:app: myapp
spec:containers:- name: myappimage: ikubernetes/myapp:v1imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80env:- name: MYSQL_ROOT_PASSWORD   #它是Pod啟動成功后,Pod中容器的環境變量名.valueFrom:secretKeyRef:name: mysql-password  #這是secret的對象名key: password      #它是secret中的key名
[root@master01 secret ]#kubectl apply -f pod-secret.yaml 
pod/pod-secret created
[root@master01 secret ]#kubectl exec -it pod-secret -- /bin/sh
/ # printenv 
MYAPP_SVC_PORT_80_TCP_ADDR=10.98.57.156
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://192.168.0.1:443
MYAPP_SVC_PORT_80_TCP_PORT=80
HOSTNAME=pod-secret
SHLVL=1
MYAPP_SVC_PORT_80_TCP_PROTO=tcp
HOME=/root
MYSQL_ROOT_PASSWORD=Jxxxxxxxx3x  這就是傳遞進來的變量
MYAPP_SVC_PORT_80_TCP=tcp://10.98.57.156:80
TERM=xterm
NGINX_VERSION=1.12.2
KUBERNETES_PORT_443_TCP_ADDR=192.168.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
MYAPP_SVC_SERVICE_HOST=10.98.57.156
KUBERNETES_PORT_443_TCP=tcp://192.168.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
PWD=/
KUBERNETES_SERVICE_HOST=192.168.0.1
MYAPP_SVC_SERVICE_PORT=80
MYAPP_SVC_PORT=tcp://10.98.57.156:80

傳遞到pod里面后,自動解密了

2、通過volume掛載Secret

1)創建Secret
手動加密,基于base64加密

[root@xianchaomaster1 ~]# echo -n 'admin' | base64
YWRtaW4=
echo -n 'jingtian123456f' | base64

在這里插入圖片描述

解碼:

echo amluZ3RpYW4xMjM0NTZm|base64 -d

在這里插入圖片描述

2)創建yaml文件

[root@master01 secret ]#vim secret.yaml
apiVersion: v1
kind: Secret
metadata:name: mysecret
type: Opaque
data:username: YWRtaW4=password: amluZ3RpYW4xMjM0NTZm
[root@master01 secret ]#kubectl apply -f secret.yaml 
secret/mysecret created
[root@master01 secret ]#
[root@master01 secret ]#kubectl get secret
NAME                          TYPE                                  DATA   AGE
default-token-xc8dr           kubernetes.io/service-account-token   3      12d
mysecret                      Opaque                                2      7s
mysql-password                Opaque                                1      14m
nfs-provisioner-token-8mxt9   kubernetes.io/service-account-token   3      4d23h
[root@master01 secret ]#kubectl describe secret mysecret
Name:         mysecret
Namespace:    default
Labels:       <none>
Annotations:  <none>Type:  OpaqueData
====
password:  15 bytes
username:  5 bytes

3)將Secret掛載到Volume中

[root@master01 secret ]#vim pod_secret_volume.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-secret-volume
spec:containers:- name: myappimage: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1volumeMounts:- name: secret-volumemountPath: /etc/secretreadOnly: truevolumes:- name: secret-volumesecret:secretName: mysecret
[root@master01 secret ]#kubectl apply -f pod_secret_volume.yaml 
pod/pod-secret-volume created
[root@master01 secret ]#kubectl get pods
NAME                               READY   STATUS      RESTARTS        AGE
mysql-pod                          0/1     Completed   0               88m
mysql-pod-envfrom                  0/1     Completed   0               76m
mysql-pod-volume                   0/1     Completed   0               65m
nfs-provisioner-847fb5b8f5-lzvcf   1/1     Running     7 (6h38m ago)   3d7h
pod-pvc                            1/1     Running     1 (7h38m ago)   3d5h
pod-secret                         1/1     Running     0               11m
pod-secret-volume                  1/1     Running     0               15s
test-hostpath                      2/2     Running     6 (7h38m ago)   4d5h
test-nfs-volume                    1/1     Running     3 (7h38m ago)   4d3h
web-0                              1/1     Running     1 (7h38m ago)   2d22h
web-1                              1/1     Running     1 (7h38m ago)   2d22h
web-2                              1/1     Running     1 (7h38m ago)   2d22h
web-3                              1/1     Running     1 (7h38m ago)   2d22h

進去容器查看

[root@master01 secret ]#kubectl exec -it pod-secret-volume -- /bin/sh/ # ls /etc/secret/
password  username
[root@master01 secret ]#kubectl exec -it pod-secret-volume -- /bin/sh
/ # cat /etc/sec
secret/    securetty
/ # cat /etc/secret/username 
admin/ # / # cat /etc/secret/password 
jingtian123456f/ # 

#由上可見,以卷的方式掛載到pod ,在pod中的secret信息實際已經被解密。

Secret 的類型
創建 Secret 時,你可以使用 Secret 資源的 type 字段,或者與其等價的 kubectl 命令行參數(如果有的話)為其設置類型。
Secret 類型有助于對 Secret 數據進行編程處理。

Kubernetes 提供若干種內置的類型,用于一些常見的使用場景。
針對這些類型,Kubernetes 所執行的合法性檢查操作以及對其所實施的限制各不相同。

內置類型 用法

Opaque	用戶定義的任意數據
kubernetes.io/service-account-token	服務賬號令牌
kubernetes.io/dockercfg	~/.dockercfg 文件的序列化形式
kubernetes.io/dockerconfigjson	~/.docker/config.json 文件的序列化形式
kubernetes.io/basic-auth	用于基本身份認證的憑據
kubernetes.io/ssh-auth	用于 SSH 身份認證的憑據
kubernetes.io/tls	用于 TLS 客戶端或者服務器端的數據
bootstrap.kubernetes.io/token	啟動引導令牌數據

docker私有倉庫,加了https認證后拉取鏡像:

imagePullSecret資源將Secret提供的密碼傳遞給kubelet從而在拉取鏡像前完成必要的認證過程,
簡單說就是你的鏡像倉庫是私有的,每次拉取是需要認證的。

創建docker-registry類型的Secret對象,并在定義pod資源時明確通過"imagePullSecrets"字段來申明使用哪個私鑰去認證;

創建docker-registry類型的Secret對象,然后把它添加到某個ServiceAccount對象中,
使用了這個ServiceAccount對象創建出來的pod就自然而然通過認證獲取到鏡像;

配置過程
這里創建Secret對象有兩種方式,各有千秋。

方式一:通過命令行直接創建Secret

kubectl create secret docker-registry video-docker-redistry-key \--docker-server=10.3.9.107:5000 \--docker-username='gsafety' \--docker-password='123456'

查看key

# kubectl get secret
NAME                        TYPE                                  DATA   AGE
default-token-d9phm         kubernetes.io/service-account-token   3      19h
video-docker-redistry-key   kubernetes.io/dockerconfigjson        1      2s

最后在yaml文件中使用這個創建出來的Secret:

apiVersion: v1
kind: Pod
metadata:name: foonamespace: awesomeapps
spec:containers:- name: fooimage: janedoe/awesomeapp:v1imagePullSecrets:- name: xxx-key

方式二:通過現存的docker認證文件來創建Secret,首先使用docker login 登錄到某個倉庫,會在本地保存認證信息

[root@master01 ~ ]#kubectl create secret generic harborsecret --from-file=.dockerconfigjson=/root/.docker/config.json --type=kubernetes.io/dockerconfigjson
secret/harborsecret created

或者:

  #Create a new secret named my-secret from ~/.docker/config.jsonkubectl create secret docker-registry my-secret --from-file=.dockerconfigjson=path/to/.docker/config.json
[root@master01 ~ ]#kubectl create secret docker-registry my-secret --from-file=.dockerconfigjson=/root/.docker/config.json 
secret/my-secret created

注意:config.json文件需要在主機上通過docker login 的方式登錄后,才會生成。
這種方式有一個好處,就是如果有多個鏡像倉庫,都先存在于一個config.json文件中,然后通過命令打入Secret。

[root@master01 ~ ]#kubectl get secret harborsecret -oyaml
apiVersion: v1
data:.dockerconfigjson: ewoJImF1dGhzIjogewoJCSJyZXBvc2l0b3J5Lmd1b2tpbmdoay5jb20iOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2VkdacGFHSXRjSEp2WkhWamRFQXlNREl5IgoJCX0KCX0KfQ==
kind: Secret
metadata:creationTimestamp: "2022-11-07T05:52:41Z"name: harborsecretnamespace: defaultresourceVersion: "2355"uid: 14503d3d-3992-4d31-9b1d-ff4049990d51
type: kubernetes.io/dockerconfigjson

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

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

相關文章

讀AI未來進行式筆記02深度偽造

1. 計算機視覺 1.1. 在人的六感之中&#xff0c;視覺是最重要的 1.1.1. 人類只要看上一眼視頻&#xff0c;就能瞬間在腦海中抓取并消化內容和信息 1.1.2. 人類能夠對事物進行廣義的理解和抽象的認知&#xff0c;即使同一物體在不同的角度…

聲量2024 | 內容創作者,該怎樣保護你的知識產權

點擊文末“閱讀原文”即可參與節目互動 剪輯、音頻 / 卷圈 運營 / SandLiu 卷圈 監制 / 姝琦 封面 / 姝琦Midjourney 產品統籌 / bobo 場地支持 / 阿那亞 聯合制作 / 聲量The Power of Voice 特別鳴謝 / 深夜談談播客網絡 本期節目錄制于第二屆「聲量The Power of Voic…

opencascade 布爾運算筆記

BRepAlgoAPI_Common 對兩個topods求解 沒有公共部分也返回結果了 我想要的結果是沒有公共部分返回false 在 Open CASCADE 中使用 BRepAlgoAPI_Common 進行布爾操作時&#xff0c;即使兩個 TopoDS_Shape 沒有公共部分&#xff0c;操作仍會返回一個結果。為了判斷兩個形狀是否確…

vue3封裝echarts組件---通俗易懂

1、封裝的原因 如果在vue項目中有多個組件或者同個組件多出地方需要不同的圖表&#xff0c;因此自己封裝一個方便多次復用的Mycharts圖表組件。 2、具體步驟&#xff1a; 2.1 安裝echarts pnpm i echarts --save 2.2 新建MyCharts組件 : ~components/echarts/MyCharts.vu…

x264 參考幀管理原理:i_poc 變量

POC H.264中的POC(Picture Order Count)用于表示解碼幀的顯示順序。當視頻碼流中存在B幀時,解碼順序和顯示順序可能不一致,因此需要根據POC來重新排列視頻幀的顯示順序,以避免跳幀或畫面不連貫的問題。 具體來說,POC的作用包括: 重排顯示順序:POC確保即使在存在B幀的情…

基于javacv ffmpeg 使用原生ffmpeg命令

基于javacv ffmpeg 使用原生ffmpeg命令 1. ffmpeg2. ffprobe 相關閱讀&#xff1a; javacv ffmpeg使用筆記 測試過程中&#xff0c;發現ffmpeg-6.0-1.5.9-linux-x86_64.jar 存在問題&#xff08;ffmpeg原生命令執行失敗&#xff09;&#xff0c;降級到ffmpeg-5.1.2-1.5.8-linux…

RPG Maker MV 踩坑十一 精靈及背景繪制問題

精靈繪制問題 RPG Maker MV戰斗問題入場飛身戰斗背景繪制精靈集及精靈 RPG Maker MV戰斗問題 在RMMV中戰斗是在場景中調用戰斗管理器&#xff0c;通過管理器去操作角色對象行動及精靈的繪制的。 入場飛身 在其中就發現一個問題加載圖片進場時&#xff0c;會偏高&#xff0c;…

Python編程學習第一篇——Python零基礎快速入門(五)—元組(Tuple)操作

Python元組是一種不可變的有序集合&#xff0c;可以存儲多個不同類型的數據。元組使用小括號來表示&#xff0c;其中的元素用逗號分隔開。與列表不同&#xff0c;元組的元素不能被修改、刪除或添加。它的一些常規操作包括元組的創建、訪問、添加、修改、刪除、運算等等&#xf…

電力電子功率模塊在工程應用中測溫NTC的使用

電力電子功率模塊在工程應用中測溫NTC的使用 1.概述2.什么是NTC3.模塊內部NTC3.1 絕緣隔離措施3.2 NTC熱量考慮 4.使用模擬方法測量NTC溫度4.1 分壓電阻大小 5.使用數字方法測量NTC溫度 1.概述 最近做項目的時候突然被問到一個問題。做實驗測溫用的NTC到底怎么用&#xff1f;為…

【Python】超時請求或計算的處理

超時機制 一般應用于處理阻塞問題 場景&#xff1a; 復雜度較大的計算&#xff08;解析&#xff09;某個數值、加解密計算等請求中遇到阻塞&#xff0c;避免長時間等待網絡波動&#xff0c;避免長時間請求&#xff0c;浪費時間 1. requests 請求超時機制 reqeusts 依賴中的…

[大師C語言(第十九篇)]C語言函數式編程技術詳解

引言 函數式編程&#xff08;Functional Programming&#xff0c;FP&#xff09;是一種編程范式&#xff0c;強調通過使用純函數和不可變數據來編寫代碼。這種范式具有許多優點&#xff0c;如易于測試、可維護性高、并發友好等。盡管C語言被認為是一種過程式編程語言&#xff…

JAVA設計模式-策略模式及在Springboot2.X中寫法

JAVA設計模式-策略模式及在Springboot2.X中寫法 一、經典的策略模式寫法二、Springboot2.X中策略模式寫法 策略模式的定義&#xff1a;策略模式是一種行為型設計模式,定義了一系列算法,并將每個算法封裝起來,使它們可以互相替換 策略模式&#xff1a;在策略模式&#xff08;Str…

算法 java 排序和查找

排序和查找 冒泡排序&#xff08;穩定&#xff09;選擇排序&#xff08;不穩定&#xff09;插入排序&#xff08;穩定&#xff09;希爾排序&#xff08;不穩定&#xff09;歸并排序&#xff08;穩定&#xff09;快速排序&#xff08;不穩定&#xff09;堆排序計數排序桶排序基數…

YOLOv8+PyQt5海洋船只檢測(可以重新訓練,yolov8模型,從圖像、視頻和攝像頭三種路徑識別檢測)

1.效果視頻&#xff1a;海洋船只檢測yoloV8檢測&#xff08;https://mbd.pub/o/bread/mbd-ZpaYk55r&#xff09;_嗶哩嗶哩_bilibili資源包含可視化的海洋船只檢測系統&#xff0c;可對于高空拍攝到的海洋圖片進行輪船檢測&#xff0c;基于最新的YOLOv8訓練的海洋船只檢測模型&a…

多線程知識-11

Runnable 和 Thread 用哪個好 使用Runnable接口的好處是&#xff1a; 避免了單繼承的限制&#xff1a;當你的類已經繼承了另一個類時&#xff0c;你仍然可以實現Runnable接口來創建線程。提高代碼的復用性&#xff1a;你可以將Runnable對象傳遞給多個線程來執行&#xff0c;從…

C++設計模式-策略模式,AI角色動態選擇行為

運行在VS2022&#xff0c;x86&#xff0c;Debug下。 27. 策略模式 策略模式讓算法的選擇與使用獨立開來&#xff0c;使得代碼更靈活、可擴展和易維護。應用&#xff1a;如在游戲開發中&#xff0c;AI角色需要根據環境和條件做出不同的行為&#xff0c;如尋路、攻擊、躲避等。可…

深度解析CSS中為什么會有Stacking Context的概念

CSS中的堆疊上下文&#xff08;Stacking Context&#xff09;概念是為了管理和控制網頁元素的重疊順序而引入的。堆疊上下文的引入解決了以下幾個關鍵問題&#xff1a; 層次管理&#xff1a; 在網頁中&#xff0c;多個元素可能會相互重疊&#xff0c;堆疊上下文定義了這些元素的…

01-CompressionWebpackPlugin---提高 Web 應用性能的利器

CompressionWebpackPlugin—提高 Web 應用性能的利器 筆記分享 在現代 Web 開發中&#xff0c;優化資源加載速度是提升用戶體驗的重要環節。減少文件大小可以顯著提升網頁加載速度&#xff0c;從而改善用戶體驗。CompressionWebpackPlugin 是一個強大的 Webpack 插件&#xff…

【安裝筆記-20240529-Windows-Electerm 終端工具】

安裝筆記-系列文章目錄 安裝筆記-20240529-Windows-Electerm 終端工具 文章目錄 安裝筆記-系列文章目錄安裝筆記-20240529-Windows-Electerm 終端工具 前言一、軟件介紹名稱&#xff1a;Wireshark主頁官方介紹功能特性 二、安裝步驟測試版本&#xff1a;electerm-1.39.35-win-…

【藍橋杯】常見的數據結構

&#x1f338;個人主頁&#xff1a;Yang-ai-cao &#x1f4d5;系列專欄&#xff1a;藍橋杯 C語言 &#x1f34d;博學而日參省乎己&#xff0c;知明而行無過矣 目錄 &#x1f338;個人主頁&#xff1a;Yang-ai-cao &#x1f4d5;系列專欄&#xff1a;藍橋杯 C語言 &…