備戰(zhàn)CKA每日一題——第9天 | secret類型、創(chuàng)建、Pod使用以及ServiceAccount關(guān)聯(lián)Secret,網(wǎng)絡(luò)隔離考題引出

昨日考題

創(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-managerservice 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):我的小碗湯,作者:小碗湯)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容