普通程序員看k8s的賬戶管理

一、知識準(zhǔn)備

● 賬戶管理分為:userAccount與serviceAccount
● userAccount:通常是給人設(shè)計(jì)使用的,并且userAccount不在k8s集群內(nèi)管理
● serviceAccount:通常是為集群內(nèi)pod,外部service訪問而設(shè)計(jì)的,更輕量級,更專注與實(shí)現(xiàn)某個任務(wù)
● k8s賬戶管理,主要提供身份驗(yàn)證的功能,必須是k8s授權(quán)的賬戶,才能被允許進(jìn)入集群。這里需要注意的是身份驗(yàn)證之后只是被允許進(jìn)入集群,但是不一定有訪問資源的權(quán)限,此時需要用到RBAC來實(shí)現(xiàn)
● k8s賬戶認(rèn)證主要有證書+私鑰、token和賬戶名密碼等方式進(jìn)行認(rèn)證


二、環(huán)境準(zhǔn)備

組件 版本
OS Ubuntu 18.04.1 LTS
docker 18.06.0-ce
k8s v1.10.1


三、userAccount

我們首先生成一個userAccount,生成userAccount的方法:

創(chuàng)建mrvolleyball賬戶私鑰

root@k8s-master:/etc/kubernetes/ssl# openssl genrsa -out mrvolleyball.key 2048
Generating RSA private key, 2048 bit long modulus
.........+++
........................+++
e is 65537 (0x010001)

基于私鑰簽署證書,由k8s的ca來簽署(該ca是創(chuàng)建k8s集群的時候生成的)

root@k8s-master:/etc/kubernetes/ssl# openssl req -new -key mrvolleyball.key -out mrvolleyball.csr -subj "/CN=mrvolleyball"
root@k8s-master:/etc/kubernetes/ssl# openssl x509 -req -in mrvolleyball.csr -CA k8s-root-ca.pem -CAkey k8s-root-ca-key.pem -CAcreateserial -out mrvolleyball.crt
Signature ok
subject=CN = mrvolleyball
Getting CA Private Key

注:k8s-root-ca.pem與k8s-root-ca-key.pem分別是證書與私鑰

簽署完成,k8s是怎么識別你的賬戶名呢:

root@k8s-master:/etc/kubernetes/ssl# openssl x509 -in mrvolleyball.crt -text
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            e5:5e:0d:d2:bc:2e:8a:c6
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = CN, ST = ChengDu, L = ChengDu, O = k8s, OU = System, CN = kubernetes
        Validity
            Not Before: Mar  1 10:23:44 2019 GMT
            Not After : Mar 31 10:23:44 2019 GMT
        Subject: CN = mrvolleyball
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
...

k8s主要是通過Subject: CN = mrvolleyball來識別賬戶名

接下來將賬戶注冊到kubectl config當(dāng)中進(jìn)行管理:

root@k8s-master:/etc/kubernetes/ssl# kubectl config set-cluster mrvolleyball-k8s --server https://192.168.17.171:6443
Cluster "mrvolleyball-k8s" set.
root@k8s-master:/etc/kubernetes/ssl# kubectl config set-cluster mrvolleyball-k8s --certificate-authority=k8s-root-ca.pem
Cluster "mrvolleyball-k8s" set.
root@k8s-master:/etc/kubernetes/ssl# kubectl config set-context context@mrvolleyball-k8s --cluster=mrvolleyball-k8s --user=mrvolleyball
Context "context@mrvolleyball-k8s" created.
root@k8s-master:/etc/kubernetes/ssl# kubectl config set-credentials mrvolleyball --client-certificate=mrvolleyball.crt --client-key=mrvolleyball.key
User "mrvolleyball" set.

創(chuàng)建好之后使用新賬戶來登錄:

root@k8s-master:/etc/kubernetes/ssl# kubectl config use-context context@mrvolleyball-k8s
Switched to context "context@mrvolleyball-k8s".
root@k8s-master:/etc/kubernetes/ssl# kubectl get pod
Error from server (Forbidden): pods is forbidden: User "mrvolleyball" cannot list pods in the namespace "default"

由于沒有權(quán)限,我們只能允許被進(jìn)入k8s集群,但是沒有訪問任何資源的權(quán)限

四、serviceAccount

● 當(dāng)一個pod被創(chuàng)建的時候,pod也需要去k8s-api注冊自己的信息,這時候使用的身份驗(yàn)證及時serviceaccount
● 相對于創(chuàng)建證書與私鑰的方式,serviceaccount突出輕的特點(diǎn),使用token認(rèn)證

對于k8s來說,會默認(rèn)在每一個命名空間下面,創(chuàng)建一個token用于pod進(jìn)行身份驗(yàn)證

root@k8s-master:/etc/kubernetes/ssl# kubectl get secret --all-namespaces | grep default-token
default       default-token-v9nkm                        kubernetes.io/service-account-token   3         192d
kube-public   default-token-hzfqq                        kubernetes.io/service-account-token   3         192d
kube-system   default-token-g9ghd                        kubernetes.io/service-account-token   3         192d
test1         default-token-j5j67                        kubernetes.io/service-account-token   3         85d

當(dāng)pod啟動的時候,會默認(rèn)掛載當(dāng)前namespace下secret進(jìn)入pod,通過這個secret,進(jìn)行身份驗(yàn)證

創(chuàng)建一個busybox進(jìn)行測試:

root@k8s-master:~# echo 'apiVersion: v1
> kind: Pod
> metadata:
>   name: busybox
> spec:
>   containers:
>   - image: busybox:latest
>     name: busybox
>     command: ["sleep","3600"]' | kubectl apply -f -
pod "busybox" created>
root@k8s-master:~# kubectl describe pod busybox
...
Volumes:
  default-token-v9nkm:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-v9nkm
    Optional:    false
...

來到volumes這里,default-token-v9nkm正是我們default namespace中默認(rèn)的key,通過掛載這個secret,pod拿到了進(jìn)入k8s-api的準(zhǔn)入許可

五、小結(jié)

● 本文介紹了k8s的賬戶管理的兩種方式userAccount、serviceAccount,以及兩種不同的驗(yàn)證方式
● 下一節(jié)介紹基于角色的權(quán)限控制RBAC



至此,本文結(jié)束
在下才疏學(xué)淺,有撒湯漏水的,請各位不吝賜教...

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

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

  • 她是不是長得比我好看? 獨(dú)立?活潑?開朗?皮膚好?
    杜子_閱讀 235評論 0 0
  • 心中的空地滿了 長出了胸腔 一蔓 一株 小心翼翼地將它裁下 修枝理葉 貼在年月的記事簿上 任風(fēng)霜竟也不敗 鄭重地...
    蘇不舞閱讀 1,172評論 21 29
  • 前些時間大概看了一下Vue的官方文檔,也大概了解過 Vue 實(shí)現(xiàn)數(shù)據(jù)綁定的原理,但是還是想再深入得了解其具體的代碼...
    sallerli1閱讀 1,864評論 0 2
  • 不知名的鳥叫聲吵醒了一只不知名的蟲 懊惱的秋蟲來不及生氣 便又沉沉的睡了去 浸潤在深秋的涼雨中 空氣里彌漫著很多不...
    九月在宇閱讀 307評論 1 3
  • 1.付出不亞于任何人的努力 2.要謙虛,不要驕傲 3.要每天反省 4.活著,就要感謝 5.積善行,思利他 6.不要...
    linkkof閱讀 188評論 0 1

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