昨日考題
創(chuàng)建Secret名為cka1127-secret,內(nèi)含有password字段,值為cka1127,然后在名為cka1127-01的Pod1里使用ENV進(jìn)行調(diào)用,名為cka1127-02的Pod2里使用Volume掛載在/data 下;
注意:提交評(píng)論:包含命令和yaml,以及注意點(diǎn)??煞侄啻卧u(píng)論。
昨日答案
創(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形式驗(yàn)證,保證/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)境變量形式驗(yà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簡(jiǎn)介
Kubernetes中的Secret資源可以用來(lái)存儲(chǔ)密碼、Token、秘鑰等敏感數(shù)據(jù), 將這些敏感信息保存在Secret中,相對(duì)于暴露到Pod、鏡像中更加的安全和靈活。
你可能會(huì)覺(jué)得,secret一般不會(huì)用到,實(shí)際上在創(chuàng)建Pod時(shí),Kubernetes會(huì)自動(dòng)創(chuàng)建包含用于訪問(wèn)API的憑據(jù)的secret(由kube-controller-manager的service account token controller控制),并且它會(huì)自動(dòng)修改Pod以使用這種類型的secret(這個(gè)由Admission Controller來(lái)控制)。
k8s每個(gè)namespace都會(huì)有一個(gè)Service Account,當(dāng)我們創(chuàng)建namespace時(shí),service account controller會(huì)監(jiān)聽(tīng)namespace的創(chuàng)建,會(huì)在該namespace中創(chuàng)建一個(gè)名為default的Service Account,同時(shí)service account token controller會(huì)監(jiān)聽(tīng)Service Account的創(chuàng)建,創(chuàng)建對(duì)應(yīng)的secret,并將這個(gè)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]#

當(dāng)我們創(chuàng)建Pod時(shí),如果未指定Service Account,則默認(rèn)會(huì)在同一命令空間namespace中自動(dòng)為其分配Service Account。則可以看到該spec.serviceAccountName字段已被自動(dòng)設(shè)置。

您可以使用自動(dòng)添加的Service Account憑據(jù)從Pod內(nèi)部訪問(wèn)API,Service Account的API權(quán)限取決于所使用的授權(quán)插件和策略。
有關(guān)Service Account如何工作的更多信息,請(qǐng)參見(jiàn)文檔:
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)部訪問(wèn)Kubernetes API,Kubernetes提供了Service Account資源。 Service Account會(huì)自動(dòng)創(chuàng)建和掛載訪問(wèn)Kubernetes API的Secret,會(huì)掛載到Pod的 /var/run/secrets/kubernetes.io/serviceaccount目錄中。 namespace創(chuàng)建時(shí)自動(dòng)創(chuàng)建的Service Account用到的Secret就是這種類型的。

Opaque Secret
Opaque類型的Secret是一個(gè)map結(jié)構(gòu)(key-value),其中vlaue要求以base64格式編碼,以下示例中基本都為Opaque類型的Secret。
kubernetes.io/dockerconfigjson Secret
kubernetes.io/dockercfg類型的Secret用于存放私有Docker Registry的認(rèn)證信息。 當(dāng)Kubernetes在創(chuàng)建Pod并且需要從私有Docker Registry pull鏡像時(shí),需要使用認(rèn)證信息,就會(huì)用到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時(shí)需要在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ū)默認(rèn)的ServiceAccount添加imagePullSecrets,以至于創(chuàng)建的所有Pod可以自動(dòng)添加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)建后會(huì)被base64編碼;
--from-file:可以使用密鑰文件的文件路徑指定密鑰文件,在這種情況下,將為它們指定默認(rèn)名稱;或者可以選擇使用指定目錄,這樣將迭代該目錄中的每個(gè)有效文件密鑰。
--type:創(chuàng)建的秘密類型,上面已經(jīng)介紹過(guò)三種類型;
--dry-run:如果為true,則僅打印將要向APIServer發(fā)送創(chuàng)建的對(duì)象,而不發(fā)送它。默認(rèn)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
默認(rèn)情況下,kubectl describe 命令能避免顯示文件的內(nèi)容。這可以防止將 secret 中的內(nèi)容暴露給從終端日志記錄中刻意尋找它們的人。
特殊字符,例如$,\,*,和!需要逃逸。在大多數(shù)常見(jiàn)的shell中,最簡(jiǎn)單的轉(zhuǎn)義密碼方法是用單引號(hào)(')引起來(lái)。例如,如果您的實(shí)際密碼是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' 您無(wú)需從文件(--from-file)中轉(zhuǎn)義密碼中的特殊字符。
手動(dòng)創(chuàng)建秘密
還可以先在文件中以json或yaml格式創(chuàng)建一個(gè)Secret,然后創(chuàng)建該對(duì)象。該secret包含兩種:data和是stringData是。data字段用于存儲(chǔ)使用base64編碼的任意數(shù)據(jù)。提供stringData字段是為了方便起見(jiàn),它允許提供未編碼的字符串。
例如,要使用data將兩個(gè)字符串存儲(chǔ)在Secret中,請(qǐng)按如下所示將它們轉(zhuǎn)換為base64:
echo -n 'admin' | base64
YWRtaW4=
echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm
注意:在轉(zhuǎn)base64編碼時(shí),一定記得加-n參數(shù),否則可能會(huì)遇到坑。
然后創(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字符串。換行符在這些字符串中無(wú)效,因此必須省略。base64在Darwin/macOS上使用該實(shí)用程序時(shí),用戶應(yīng)避免使用該-b選項(xiàng)來(lái)分隔長(zhǎng)行。相反,如果選項(xiàng)不可用,Linux用戶應(yīng)將選項(xiàng)添加-w 0到base64命令或管道中。base64 | tr -d '\n'-w
從生成器創(chuàng)建秘密
從1.14開(kāi)始,Kubectl支持使用Kustomize管理對(duì)象。使用此新功能,您還可以從生成器創(chuàng)建一個(gè)Secret,然后將其應(yīng)用于在Apiserver上創(chuàng)建對(duì)象。
使用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目錄下會(huì)生成mysecret中的所有映射文件。
將密鑰投影到特定路徑
我們還可以控制secret映射到卷中的路徑。您可以使用.spec.volumes[].secret.items更改每個(gè)鍵的目標(biāo)路徑:
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存儲(chǔ)在/etc/foo/my-group/my-username文件而非/etc/foo/username;而且沒(méi)有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;
請(qǐng)注意,JSON規(guī)范不支持八進(jìn)制表示法,因此對(duì)于0400權(quán)限,請(qǐng)使用值256。如果您使用yaml而不是json描述Pod,則可以使用八進(jìn)制表示法以更自然的方式指定權(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為十進(jìn)制,在這種情況下,生成的文件的/etc/foo/my-group/my-username許可權(quán)值為八進(jìn)制0777。由于JSON的限制,您必須以十進(jìn)制表示法指定mode。
請(qǐng)注意,如果稍后閱讀此權(quán)限值,則可能會(huì)以十進(jìn)制表示法顯示。
環(huán)境變量
Pod中通過(guò)環(huán)境變量引用Secret和題目答案一樣,不做累述;
以上事例來(lái)自于官方文檔。方便大家學(xué)習(xí)。
今日考題
部署三個(gè)deployment應(yīng)用(A,B,C),允許A訪問(wèn)B應(yīng)用,但是不允許C訪問(wèn)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可以訪問(wèn)B應(yīng)用;C不允許訪問(wèn)B應(yīng)用??煞侄啻卧u(píng)論。
作者簡(jiǎn)介
作者:小碗湯,一位熱愛(ài)、認(rèn)真寫(xiě)作的小伙,目前維護(hù)原創(chuàng)公眾號(hào):『我的小碗湯』,專注于寫(xiě)linux、golang、docker、kubernetes等知識(shí)等提升硬實(shí)力的文章,期待你的關(guān)注。轉(zhuǎn)載說(shuō)明:務(wù)必注明來(lái)源(注明:來(lái)源于公眾號(hào):我的小碗湯, 作者:小碗湯)
作者簡(jiǎn)潔
作者:小碗湯,一位熱愛(ài)、認(rèn)真寫(xiě)作的小伙,目前維護(hù)原創(chuàng)公眾號(hào):『我的小碗湯』,專注于寫(xiě)go語(yǔ)言、docker、kubernetes、java等開(kāi)發(fā)、運(yùn)維知識(shí)等提升硬實(shí)力的文章,期待你的關(guān)注。轉(zhuǎn)載說(shuō)明:務(wù)必注明來(lái)源(注明:來(lái)源于公眾號(hào):我的小碗湯,作者:小碗湯)