昨日考題
創(chuàng)建Secret名為cka1127-secret弱匪,內(nèi)含有password字段,值為cka1127璧亮,然后在名為cka1127-01的Pod1里使用ENV進行調(diào)用萧诫,名為cka1127-02的Pod2里使用Volume掛載在/data 下;
注意:提交評論:包含命令和yaml枝嘶,以及注意點帘饶。可分多次評論群扶。
昨日答案
創(chuàng)建secret方式一
cka1127-secret.yaml可以是以下這樣:
apiVersion: v1
kind: Secret
metadata:
name: cka1127-secret
type: Opaque
stringData:
cka1127-password: cka1127
創(chuàng)建
[root@liabio test]# kubectl apply -f cka-1127-secret.yaml
secret/cka1127-secret created
創(chuàng)建secret方式二
kubectl create secret generic cka1127-secret --from-literal=password=cka1127
名為cka1127-01的Pod yaml
apiVersion: v1
kind: Pod
metadata:
name: cka1127-01
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: pwd
mountPath: /data/password
readOnly: true
volumes:
- name: pwd
secret:
secretName: cka1127-secret
名為cka1127-02的Pod yaml
apiVersion: v1
kind: Pod
metadata:
name: cka1127-02
spec:
containers:
- image: nginx
name: nginx
env:
- name: PASSWORD
valueFrom:
secretKeyRef:
name: cka1127-secret
key: password
volume形式驗證及刻,保證/data/password/下有password文件镀裤,文件內(nèi)容為明文cka1127
[root@liabio ~]# kubectl exec -ti cka1127-01 sh
#
# ls -l /data/password
total 0
lrwxrwxrwx 1 root root 15 Nov 28 00:40 password -> ..data/password
# cat /data/password/password
cka1127#
#
環(huán)境變量形式驗證,保證env能查到name為PASSWORD的環(huán)境變量缴饭;
[root@liabio test]# kubectl exec -ti cka1127-02 bash
root@cka1127-02:/#
root@cka1127-02:/# echo $PASSWORD
cka1127
root@cka1127-02:/#
昨日解析
secret官方文檔:
https://kubernetes.io/docs/concepts/configuration/secret/
secret簡介
Kubernetes中的Secret資源可以用來存儲密碼暑劝、Token、秘鑰等敏感數(shù)據(jù)茴扁, 將這些敏感信息保存在Secret中铃岔,相對于暴露到Pod、鏡像中更加的安全和靈活峭火。
你可能會覺得毁习,secret一般不會用到,實際上在創(chuàng)建Pod時卖丸,Kubernetes會自動創(chuàng)建包含用于訪問API的憑據(jù)的secret
(由kube-controller-manager
的service account token controller
控制)纺且,并且它會自動修改Pod以使用這種類型的secret(這個由Admission Controller來控制)。
k8s每個namespace都會有一個Service Account稍浆,當我們創(chuàng)建namespace時载碌,service account controller會監(jiān)聽namespace的創(chuàng)建,會在該namespace中創(chuàng)建一個名為default的Service Account衅枫,同時service account token controller會監(jiān)聽Service Account的創(chuàng)建嫁艇,創(chuàng)建對應(yīng)的secret,并將這個secret綁定到Service Account弦撩。
[root@liabio test]# kubectl create ns cka
namespace/cka created
[root@liabio test]#
[root@liabio test]# kubectl get sa -n cka
NAME SECRETS AGE
default 1 11s
[root@liabio test]# kubectl get secrets -n cka
NAME TYPE DATA AGE
default-token-r77xn kubernetes.io/service-account-token 3 18s
[root@liabio test]#
當我們創(chuàng)建Pod時步咪,如果未指定Service Account,則默認會在同一命令空間namespace中自動為其分配Service Account益楼。則可以看到該spec.serviceAccountName字段已被自動設(shè)置猾漫。
您可以使用自動添加的Service Account憑據(jù)從Pod內(nèi)部訪問API,Service Account的API權(quán)限取決于所使用的授權(quán)插件和策略感凤。
有關(guān)Service Account如何工作的更多信息悯周,請參見文檔:
https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
Secret的類型
--type指定創(chuàng)建的秘密類型,Kubernetes內(nèi)置了三種類型的Secret
kubernetes.io/service-account-token Secret
上面我們已經(jīng)講到陪竿,為了能從Pod內(nèi)部訪問Kubernetes API禽翼,Kubernetes提供了Service Account資源。 Service Account會自動創(chuàng)建和掛載訪問Kubernetes API的Secret族跛,會掛載到Pod的 /var/run/secrets/kubernetes.io/serviceaccount目錄中捐康。 namespace創(chuàng)建時自動創(chuàng)建的Service Account用到的Secret就是這種類型的。
Opaque Secret
Opaque類型的Secret是一個map結(jié)構(gòu)(key-value)庸蔼,其中vlaue要求以base64格式編碼,以下示例中基本都為Opaque類型的Secret贮匕。
kubernetes.io/dockerconfigjson Secret
kubernetes.io/dockercfg類型的Secret用于存放私有Docker Registry的認證信息姐仅。 當Kubernetes在創(chuàng)建Pod并且需要從私有Docker Registry pull鏡像時,需要使用認證信息,就會用到kubernetes.io/dockercfg類型的Secret掏膏。
kubectl create secret docker-registry cka-regsecret \
--docker-server=coderaction \
--docker-username=admin \
--docker-password=123456 \
--docker-email=837448191@qq.com
在創(chuàng)建Pod時需要在Pod的spec中按如下形式使用:
apiVersion: v1
kind: Pod
metadata:
name: cka-private-reg
spec:
containers:
- name: cka-private-reg-container
image: nginx
imagePullSecrets:
- name: cka-regsecret
可以參考官方文檔:
https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod
給分區(qū)默認的ServiceAccount添加imagePullSecrets劳翰,以至于創(chuàng)建的所有Pod可以自動添加spec.imagePullSecrets,詳情參考官方文檔:
https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#add-imagepullsecrets-to-a-service-account
secret創(chuàng)建
kubectl創(chuàng)建secret
kubectl創(chuàng)建seccret官方文檔:
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#-em-secret-em-
格式:
kubectl create secret generic NAME [--type=string] [--from-file=[key=]source] [--from-literal=key1=value1] [--dry-run]
--from-literal:指定要插入的鍵和文字值(即mykey = somevalue)馒疹,value為明文值佳簸,創(chuàng)建后會被base64編碼;
--from-file:可以使用密鑰文件的文件路徑指定密鑰文件颖变,在這種情況下生均,將為它們指定默認名稱;或者可以選擇使用指定目錄腥刹,這樣將迭代該目錄中的每個有效文件密鑰马胧。
--type:創(chuàng)建的秘密類型,上面已經(jīng)介紹過三種類型衔峰;
--dry-run:如果為true佩脊,則僅打印將要向APIServer發(fā)送創(chuàng)建的對象,而不發(fā)送它垫卤。默認false威彰;
使用--from-file創(chuàng)建
[root@liabio cka]# echo -n 'admin' > ./username
[root@liabio cka]# echo -n 'test123' > ./password
[root@liabio cka]# echo -n 'shanghai' > ./city
[root@liabio cka]# ll
total 12
-rw-r--r-- 1 root root 9 Nov 28 20:44 city
-rw-r--r-- 1 root root 8 Nov 28 20:43 password
-rw-r--r-- 1 root root 6 Nov 28 20:43 username
[root@liabio cka]# kubectl create secret generic test-cka1127-01 --from-file=./username --from-file=./password
secret/test-cka1127-01 created
[root@liabio cka]# kubectl create secret generic test-cka1127-02 --from-file=./
secret/test-cka1127-02 created
[root@liabio cka]#
以指定目錄創(chuàng)建的secret,查看到目錄下所有文件都被加到data下:
kubectl get secrets test-cka1127-02 -oyaml
apiVersion: v1
data:
city: c2hhbmdoYWkK
password: dGVzdDEyMwo=
username: YWRtaW4K
kind: Secret
metadata:
creationTimestamp: "2019-11-28T12:44:57Z"
name: test-cka1127-02
namespace: default
resourceVersion: "14636360"
selfLink: /api/v1/namespaces/default/secrets/test-cka1127-02
uid: 4a3a1a5d-09e6-4bf9-bbe3-3300db1ddf7a
type: Opaque
指定username和password創(chuàng)建的secret:
kubectl get secrets test-cka1127-01 -oyaml
apiVersion: v1
data:
password: dGVzdDEyMwo=
username: YWRtaW4K
kind: Secret
metadata:
creationTimestamp: "2019-11-28T12:44:47Z"
name: test-cka1127-01
namespace: default
resourceVersion: "14636347"
selfLink: /api/v1/namespaces/default/secrets/test-cka1127-01
uid: 766516a2-34be-4a18-b4e2-83751a6cd2b7
type: Opaque
默認情況下穴肘,kubectl describe 命令能避免顯示文件的內(nèi)容歇盼。這可以防止將 secret 中的內(nèi)容暴露給從終端日志記錄中刻意尋找它們的人。
特殊字符梢褐,例如$旺遮,\,*盈咳,和!需要逃逸耿眉。在大多數(shù)常見的shell中,最簡單的轉(zhuǎn)義密碼方法是用單引號(')引起來鱼响。例如鸣剪,如果您的實際密碼是S!B*d$zDsb,則應(yīng)以這種方式執(zhí)行命令:
kubectl create secret generic dev-db-secret
--from-literal=username=devuser --from-literal=password='S!B*d$zDsb' 您無需從文件(--from-file)中轉(zhuǎn)義密碼中的特殊字符丈积。
手動創(chuàng)建秘密
還可以先在文件中以json或yaml格式創(chuàng)建一個Secret筐骇,然后創(chuàng)建該對象。該secret包含兩種:data
和是stringData
是江滨。data字段用于存儲使用base64編碼的任意數(shù)據(jù)铛纬。提供stringData字段是為了方便起見,它允許提供未編碼的字符串唬滑。
例如告唆,要使用data將兩個字符串存儲在Secret中棺弊,請按如下所示將它們轉(zhuǎn)換為base64:
echo -n 'admin' | base64
YWRtaW4=
echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm
注意:在轉(zhuǎn)base64編碼時,一定記得加-n參數(shù)擒悬,否則可能會遇到坑模她。
然后創(chuàng)建以下yaml,最終kubectl apply
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
如果用以下yaml創(chuàng)建懂牧,注意到用了stringData侈净,user的值為coderaction明文。
apiVersion: v1
kind: Secret
metadata:
name: cka1127-secret-02
type: Opaque
stringData:
user: coderaction
執(zhí)行kubectl apply
后查看:
apiVersion: v1
data:
user: Y29kZXJhY3Rpb24=
kind: Secret
metadata:
name: cka1127-secret-02
type: Opaque
Y29kZXJhY3Rpb24=解碼為coderaction
[root@liabio cka]# echo Y29kZXJhY3Rpb24= | base64 -d
coderaction
data和stringData的鍵必須由字母數(shù)字字符“-”僧凤,“ _”或“畜侦。”組成拼弃。
編碼注意:secret數(shù)據(jù)的序列化JSON和YAML值被編碼為base64字符串夏伊。換行符在這些字符串中無效,因此必須省略吻氧。base64在Darwin/macOS上使用該實用程序時溺忧,用戶應(yīng)避免使用該-b選項來分隔長行。相反盯孙,如果選項不可用鲁森,Linux用戶應(yīng)將選項添加-w 0到base64命令或管道中。base64 | tr -d '\n'-w
從生成器創(chuàng)建秘密
從1.14開始振惰,Kubectl支持使用Kustomize管理對象歌溉。使用此新功能,您還可以從生成器創(chuàng)建一個Secret骑晶,然后將其應(yīng)用于在Apiserver上創(chuàng)建對象痛垛。
使用Secret
將secret所有內(nèi)容掛載為Pod里的文件
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
這樣Pod中的/etc/foo目錄下會生成mysecret中的所有映射文件。
將密鑰投影到特定路徑
我們還可以控制secret映射到卷中的路徑桶蛔。您可以使用.spec.volumes[].secret.items更改每個鍵的目標路徑:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
items:
- key: username
path: my-group/my-username
這樣Pod中username存儲在/etc/foo/my-group/my-username文件而非/etc/foo/username匙头;而且沒有password的映射文件。
secret文件權(quán)限
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: nginx
volumeMounts:
- name: foo
mountPath: "/etc/foo"
volumes:
- name: foo
secret:
secretName: cka1127-secret
defaultMode: 256
然后仔雷,Secret將被掛載到/etc/foo并且由Secret卷掛載創(chuàng)建的所有文件權(quán)限為0400蹂析;
請注意,JSON規(guī)范不支持八進制表示法碟婆,因此對于0400權(quán)限电抚,請使用值256。如果您使用yaml而不是json描述Pod竖共,則可以使用八進制表示法以更自然的方式指定權(quán)限蝙叛。
也可以像前面的示例一樣使用映射,并為不同的文件指定不同的權(quán)限公给,如下所示:
apiVersion: v1
kind: Pod
metadata:
name: mypod-1
spec:
containers:
- name: mypod
image: nginx
volumeMounts:
- name: foo
mountPath: "/etc/foo"
volumes:
- name: foo
secret:
secretName: cka1127-secret-02
items:
- key: user
path: my-group/my-username
mode: 511
mode值511為十進制甥温,在這種情況下锻煌,生成的文件的/etc/foo/my-group/my-username許可權(quán)值為八進制0777。由于JSON的限制姻蚓,您必須以十進制表示法指定mode。
請注意匣沼,如果稍后閱讀此權(quán)限值狰挡,則可能會以十進制表示法顯示。
環(huán)境變量
Pod中通過環(huán)境變量引用Secret和題目答案一樣释涛,不做累述加叁;
以上事例來自于官方文檔。方便大家學習唇撬。
今日考題
部署三個deployment應(yīng)用(A,B,C),允許A訪問B應(yīng)用,但是不允許C訪問B應(yīng)用它匕。
- Deployment的名稱為cka-1128-01,cka-1128-02窖认,cka-1128-03
- Network Policy的名稱為cka-1128-np
注意:將所用命令豫柬、創(chuàng)建的deployment以及network policy完整yaml、以及證明A可以訪問B應(yīng)用扑浸;C不允許訪問B應(yīng)用。可分多次評論寨闹。
作者簡介
作者:小碗湯氛谜,一位熱愛、認真寫作的小伙酝惧,目前維護原創(chuàng)公眾號:『我的小碗湯』榴鼎,專注于寫linux、golang晚唇、docker巫财、kubernetes等知識等提升硬實力的文章,期待你的關(guān)注缺亮。轉(zhuǎn)載說明:務(wù)必注明來源(注明:來源于公眾號:我的小碗湯翁涤, 作者:小碗湯)
作者簡潔
作者:小碗湯,一位熱愛萌踱、認真寫作的小伙葵礼,目前維護原創(chuàng)公眾號:『我的小碗湯』,專注于寫go語言并鸵、docker鸳粉、kubernetes、java等開發(fā)园担、運維知識等提升硬實力的文章届谈,期待你的關(guān)注枯夜。轉(zhuǎn)載說明:務(wù)必注明來源(注明:來源于公眾號:我的小碗湯,作者:小碗湯)