|
我們知道在k8s上APIserver是整個(gè)集群的訪問入口,etcd是保存整個(gè)集群所有資源狀態(tài)配置信息的kv鍵值存儲數(shù)據(jù)庫,一旦etcd宕機(jī),k8s整個(gè)集群將無法正常工作,為此我們需要對etcd做高可用;除此之外為了保證etcd中的數(shù)據(jù)安全,k8s只允許APIserver去訪問/操作etcd;這也是APIserver為什么是整個(gè)集群的訪問入口的原因;簡單講etcd的客戶端只有APIserver,我們用客戶端想要查看對應(yīng)資源的狀態(tài)或者修改對應(yīng)資源屬性等等操作,都需要把請求發(fā)送給APIserver,由APIserver再把客戶端的請求代理到etcd上,從而實(shí)現(xiàn)客戶端訪問/操作etcd中對應(yīng)資源的狀態(tài)或?qū)傩孕畔?;這樣一來APIserver就承擔(dān)了整個(gè)etcd的數(shù)據(jù)訪問安全;一旦APIserver出現(xiàn)問題,把惡意請求放進(jìn)來,對應(yīng)etcd的中的數(shù)據(jù)安全將無從保證;為此APIserver就必須擁有一套對客戶端請求進(jìn)行驗(yàn)證管控的機(jī)制;如下圖
1、用戶認(rèn)證 首先APIserver要驗(yàn)證客戶端是否是合法客戶端,在k8s上我們用kubectl工具去管理k8s集群,APIserver首先要驗(yàn)證kubectl客戶端的證書,同時(shí)kubectl也要驗(yàn)證對應(yīng)APIserver的證書;這個(gè)過程我們叫k8s用戶認(rèn)證的過程;在k8s上除了有通過證書方式認(rèn)證客戶端,還有其他機(jī)制,比如用戶名和密碼,利用token機(jī)制去驗(yàn)證對應(yīng)客戶端;其中利用token機(jī)制中有明文token(plain token)和引導(dǎo)token(bootstrap token);不管是用戶名密碼還是token方式認(rèn)證用戶,在發(fā)送給APIserver時(shí)都是通過把對應(yīng)的信息轉(zhuǎn)化成http協(xié)議頭部信息傳遞給APIserver;對應(yīng)APIserver收到對應(yīng)客戶端請求,就會把對應(yīng)頭部信息檢索下來,進(jìn)行驗(yàn)證;不同的是plain token主要用于驗(yàn)證對應(yīng)客戶端是否合法,是否能夠登陸APIserver;而對應(yīng)bootstrap token是用來驗(yàn)證對應(yīng)節(jié)點(diǎn)是否能夠加入到k8s集群,如果bootstrap認(rèn)證通過后,對應(yīng)APIserver會調(diào)用ca給對應(yīng)節(jié)點(diǎn)上的kubelet和kubeproxy頒發(fā)證書;此后kubelet和kubeproxy就可以通過APIserver認(rèn)可的ca頒發(fā)的證書到APIserver認(rèn)證,訪問對應(yīng)資源的信息了; 用戶認(rèn)證只是驗(yàn)證對應(yīng)客戶端是否是合法客戶端,這里的驗(yàn)證的機(jī)制是一票通過的機(jī)制;所謂一票通過是指在APIserver上有多種驗(yàn)證機(jī)制(方法),它會從上至下依次進(jìn)行驗(yàn)證,如果對應(yīng)驗(yàn)證方法沒有明確拒絕,接著它會用下一個(gè)驗(yàn)證方法,直到有一個(gè)機(jī)制通過以后,余下的就不驗(yàn)證了;比如,在k8s上有證書驗(yàn)證,用戶名密碼驗(yàn)證,token驗(yàn)證,如果此時(shí)有一個(gè)客戶端拿著一個(gè)token來登陸APIserver,此時(shí)APIserver就會先用證書驗(yàn)證的方法驗(yàn)證客戶端,如果對應(yīng)驗(yàn)證方法沒有明確拒絕,說明此方法不識別對應(yīng)的客戶端信息,接著它會用用戶名密碼的方法進(jìn)行驗(yàn)證,如果對應(yīng)方法也沒有明確拒絕,接著它會用token方法進(jìn)行驗(yàn)證,如果對應(yīng)方法通過了,那么接下來的其他方法驗(yàn)證就不會再進(jìn)行下去;如果所有驗(yàn)證方法都沒有拒絕,說明該客戶端提供的認(rèn)證信息在k8s上不適配,此時(shí)apiserver 就會把對應(yīng)客戶端歸納為匿名用戶;當(dāng)然此類用戶雖然登陸到APIserver上,但它沒有權(quán)限操作資源; 2、驗(yàn)證授權(quán) 只有驗(yàn)證通過的客戶端,才會有機(jī)會進(jìn)行權(quán)限驗(yàn)證,所謂權(quán)限驗(yàn)證是指驗(yàn)證對應(yīng)客戶端是否擁有對應(yīng)k8s上的資源訪問/操作權(quán)限;驗(yàn)證權(quán)限也是一票通過的機(jī)制;只要對應(yīng)客戶端有對應(yīng)資源的操作/訪問權(quán)限,則其他資源的權(quán)限驗(yàn)證就不會再進(jìn)行下去;如果沒有對應(yīng)資源訪問/操作權(quán)限,此時(shí)APIserver就直接響應(yīng)對應(yīng)的客戶端請求沒有權(quán)限訪問;如果對應(yīng)客戶端有對資源的訪問/操作操作權(quán)限,此時(shí)客戶端請求會進(jìn)入到下一個(gè)步驟,準(zhǔn)入控制; 3、準(zhǔn)入控制 所謂準(zhǔn)入控制是指檢查對應(yīng)客戶端的請求是否符合對應(yīng)請求/操作API規(guī)范;傳遞參數(shù)是否是正確的;比如我們要想k8s上創(chuàng)建一個(gè)pod,此時(shí)準(zhǔn)入控制會檢查我們提交的信息是否符合創(chuàng)建對應(yīng)資源的規(guī)范,如果符合規(guī)范就創(chuàng)建,不符合規(guī)范就拒絕;準(zhǔn)入控制這個(gè)環(huán)節(jié)是使用的一票否決的機(jī)制,所謂一票否決是指只要有一項(xiàng)不通過,則整個(gè)請求都將是拒絕的,即便余下的檢查都是通過的;當(dāng)然只要有一項(xiàng)沒有通過,余下的驗(yàn)證就不會再進(jìn)行;除了檢查對應(yīng)客戶端提交的信息是否符合對應(yīng)API資源的規(guī)范,準(zhǔn)入控制還會幫助我們把我們沒有明確指定的字段信息,通過默認(rèn)值的方式把對應(yīng)的字段填充到客戶端請求中;然后把填充好的信息一并由APIserver把客戶端請求更新到對應(yīng)資源在etcd中的對應(yīng)信息上; k8s上的用戶 在k8s上用戶有兩類,一類是常規(guī)用戶(normal users),一類是服務(wù)賬號(Service Account);所謂常規(guī)用戶就是指對應(yīng)客戶端現(xiàn)實(shí)生活中的操作者,這個(gè)有點(diǎn)類似Linux上的登錄用戶;它把對應(yīng)操作該客戶端的人,映射到對應(yīng)客戶端的名稱上;比如我們用kubectl去操作k8s集群,在k8s上我們自己就是對應(yīng)kubeclt持有的證書信息中的/CN對應(yīng)的字符串;服務(wù)賬號是指非人類操作的客戶端所用到的用戶名,有點(diǎn)類似Linux系統(tǒng)上的系統(tǒng)賬號;它的存在只是為了在k8s上方便權(quán)限的劃分;簡單講服務(wù)賬號就是用來針對那些程序自身向apiserver發(fā)起連接時(shí),附加的用戶信息,主要作用是apiserver可以根據(jù)對應(yīng)的用戶信息,來判斷對應(yīng)客戶端在apiserver上的權(quán)限;如下所示
提示:上圖是一個(gè)pod的詳細(xì)信息,其中我們并沒有定義存儲卷,創(chuàng)建pod后,它默認(rèn)會生成這個(gè)存儲卷;這個(gè)存儲卷被掛載到對應(yīng)pod容器內(nèi)部的//var/run/secrets/kubernetes.io/serviceaccount 這個(gè)路徑;其實(shí)這個(gè)就是對應(yīng)pod檢索/更新自己的狀態(tài)信息,要在apiserver上進(jìn)行認(rèn)證的serviceaccount信息,保存在secret存儲卷中;如下圖所示
提示:對應(yīng)pod掛載secret存儲卷,主要作用是在檢索/更新自己的狀態(tài)信息時(shí),它會把這個(gè)token發(fā)送給apiserver進(jìn)行驗(yàn)證;apiserver認(rèn)證通過后就把對應(yīng)狀態(tài)信息更新到etcd中進(jìn)行保存;正是因?yàn)閜od提供了sa(serviceaccount的簡寫)賬號token信息,使得apiserver才能正常判斷出對應(yīng)token對應(yīng)用戶的權(quán)限;這個(gè)token是在創(chuàng)建pod時(shí),對應(yīng)準(zhǔn)入控制器自動生成sa賬號,并把對應(yīng)的sa賬號的token信息以secret存儲卷的方式掛載至對應(yīng)pod的對應(yīng)位置,pod更新或檢索自己的信息時(shí),它會把/var/run/secrets/kubernetes.io/serviceaccount這個(gè)文件中的信息發(fā)送給apiserver進(jìn)行驗(yàn)證;此時(shí)apiserver一驗(yàn)證對應(yīng)token信息,就能知道這個(gè)token是對應(yīng)sa賬號的token信息,從而識別到對應(yīng)sa賬號的權(quán)限;所以pod才能夠正常的通過apiserver更新/檢索自己的狀態(tài)信息; 客戶端配置文件kubeconfig 在k8s上各個(gè)客戶端都是優(yōu)先使用證書來做認(rèn)證,apiserver通過驗(yàn)證各客戶端的證書來確認(rèn)對應(yīng)的客戶端是否能夠正常訪問apiserver;在k8s上證書驗(yàn)證是雙向的,apiserver會驗(yàn)證客戶端的證書中的subj中的CN(common name)的信息,是否符合對應(yīng)客戶端持有的身份信息,即用戶名稱;把證書中的subj中的O(organization)信息視為對應(yīng)用戶組;除此之外apiserver還會驗(yàn)證對應(yīng)客戶端證書是否是自己信任的CA所頒發(fā)的證書;對于客戶端來說,也是同樣的邏輯,它也需要驗(yàn)證apiserver的證書是否吻合對應(yīng)apiserver的名稱,是否是同一CA頒發(fā)的證書;那么問題來了,每次客戶端是怎么向apiserver發(fā)送自己的的證書信息的呢?在k8s上每一個(gè)客戶端都有一個(gè)配置文件,這個(gè)配置文件主要用來記錄客戶端證書驗(yàn)證相關(guān)信息;這個(gè)配置文件有一個(gè)統(tǒng)一的稱呼叫kubeconfig;保存在/etc/kubernetes/目錄下; [root@master01 ~]# ll /etc/kubernetes/ total 32 -rw------- 1 root root 5567 Dec 22 20:00 admin.conf -rw------- 1 root root 5599 Dec 22 20:00 controller-manager.conf -rw------- 1 root root 1955 Dec 22 20:01 kubelet.conf drwxr-xr-x 2 root root 113 Dec 22 20:00 manifests drwxr-xr-x 3 root root 4096 Dec 22 20:00 pki -rw------- 1 root root 5547 Dec 22 20:00 scheduler.conf [root@master01 ~]# 提示:我們使用kubectl客戶端工具去訪問對應(yīng)apiserver時(shí),默認(rèn)沒有指定其配置文件,主要原因是在對應(yīng)Linux用戶的家目錄下有一個(gè).kube的目錄里有一個(gè)config文件;這個(gè)文件是我們在初始化集群后,從/etc/kubernetes/admin.conf文件復(fù)制過來的,兩者內(nèi)容一樣;默認(rèn)不指定其配置文件kubectl會到當(dāng)前Linux用戶所在家目錄下的.kube/config文件作為對應(yīng)訪問apiserver的認(rèn)證文件; 查看kubctl的配置文件內(nèi)容 [root@master01 manifests]# kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://192.168.0.41:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
[root@master01 manifests]#
提示;k8s上的客戶端配置文件主要有4部分組成,分別是,users、clusters、contexts、current-context;users是指定用戶賬號以及相關(guān)認(rèn)證列表;clusters用來指定目標(biāo)集群列表;contexts用來指定以哪個(gè)user接入那個(gè)cluster的對應(yīng)連接組合;curren-context是用來指定當(dāng)前使用的context;從上面的信息可以看到當(dāng)前使用的是kubernetes-admin@kubernetes context連接k8s集群,對應(yīng)context中,集群名叫kubernetes,使用的用戶是kubernetes-admin;而對應(yīng)集群的地址是https://192.168.0.41:6443,對應(yīng)用戶的的證書和私鑰這里被隱藏了; 查看集群列表 [root@master01 manifests]# kubectl config get-clusters NAME kubernetes [root@master01 manifests]# 查看用戶列表 [root@master01 manifests]# kubectl config get-users NAME kubernetes-admin [root@master01 manifests]# 查看context列表 [root@master01 manifests]# kubectl config get-contexts CURRENT NAME CLUSTER AUTHINFO NAMESPACE * kubernetes-admin@kubernetes kubernetes kubernetes-admin [root@master01 manifests]# 查看當(dāng)前使用的context [root@master01 manifests]# kubectl config current-context kubernetes-admin@kubernetes [root@master01 manifests]# 示例:創(chuàng)建一個(gè)集群、常規(guī)用戶、context,把對應(yīng)信息保存到一個(gè)配置文件中,用對應(yīng)配置文件去apiserver上請求資源,看看是否能夠請求到對應(yīng)資源信息? 創(chuàng)建私鑰 [root@master01 manifests]# cd /etc/kubernetes/pki/ [root@master01 pki]# ls apiserver.crt apiserver-kubelet-client.crt etcd front-proxy-client.key apiserver-etcd-client.crt apiserver-kubelet-client.key front-proxy-ca.crt sa.key apiserver-etcd-client.key ca.crt front-proxy-ca.key sa.pub apiserver.key ca.key front-proxy-client.crt [root@master01 pki]# openssl genrsa -out tom.key 2048 Generating RSA private key, 2048 bit long modulus ..............+++ ..........................................................................................................................................................................................................................................+++ e is 65537 (0x10001) [root@master01 pki]# ls apiserver.crt apiserver-kubelet-client.crt etcd front-proxy-client.key apiserver-etcd-client.crt apiserver-kubelet-client.key front-proxy-ca.crt sa.key apiserver-etcd-client.key ca.crt front-proxy-ca.key sa.pub apiserver.key ca.key front-proxy-client.crt tom.key [root@master01 pki]# 使用tom.key為tom用戶生成簽署請求文件tom.csr [root@master01 pki]# openssl req -new -key ./tom.key -out tom.csr -subj "/CN=tom/O=myuser" [root@master01 pki]# ls apiserver.crt apiserver-kubelet-client.key front-proxy-ca.key tom.csr apiserver-etcd-client.crt ca.crt front-proxy-client.crt tom.key apiserver-etcd-client.key ca.key front-proxy-client.key apiserver.key etcd sa.key apiserver-kubelet-client.crt front-proxy-ca.crt sa.pub [root@master01 pki]# 使用apiserver信任的ca給tom用戶簽發(fā)證書 [root@master01 pki]# openssl x509 -req -in tom.csr -CA ./ca.crt -CAkey ./ca.key -CAcreateserial -out tom.crt -days 365 Signature ok subject=/CN=tom/O=myuser Getting CA Private Key [root@master01 pki]# ls apiserver.crt apiserver-kubelet-client.key front-proxy-ca.key tom.crt apiserver-etcd-client.crt ca.crt front-proxy-client.crt tom.csr apiserver-etcd-client.key ca.key front-proxy-client.key tom.key apiserver.key etcd sa.key apiserver-kubelet-client.crt front-proxy-ca.crt sa.pub [root@master01 pki]# 提示:這里使用的CA必須要用apiserver信任的ca來簽發(fā)證書,否則apiserver它不認(rèn); 創(chuàng)建集群,指定對應(yīng)ca的證書信息,集群名字以及集群的地址 [root@master01 ~]# kubectl config set-cluster myk8s --server="https://192.168.0.41:6443" --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true Cluster "myk8s" set. [root@master01 ~]# kubectl config get-clusters NAME myk8s kubernetes [root@master01 ~]# 提示:--embed-certs=ture表示隱藏證書信息;這里默認(rèn)沒有指定將配置信息保存在那個(gè)配置文件,默認(rèn)就保存在當(dāng)前配置文件(用戶家目錄的./kube/config文件中);如果要想指定保存在某個(gè)配置文件中,可以在后面加上--kubeconfig選項(xiàng)來指定對應(yīng)的配置文件即可; 把創(chuàng)建集群的配置保存在/tmp/myk8s.config文件中 [root@master01 ~]# kubectl config set-cluster myk8s --server="https://192.168.0.41:6443" --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --kubeconfig=/tmp/myk8s.config
Cluster "myk8s" set.
[root@master01 ~]# kubectl config get-clusters --kubeconfig=/tmp/myk8s.config
NAME
myk8s
[root@master01 ~]# cat /tmp/myk8s.config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJd01USXdPREEyTXpnMU5Gb1hEVE13TVRJd05qQTJNemcxTkZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSzZXCjl5Mkc5YUxFc3h1Q3dNQllBbEdtRys5TG5nMU9OWm9aRDZDd2ZLUUY3Y3lHSStuN1BwSDJFT2o1K292WlBNWG0KckpNaVFHOXB2bVNDZC9FRkxod05YRWNOREZDbGF6Y0cvQ1B0QjlCRlQ1ZGdVMXJnMGxvRUxEVXduUk16eU43QwozRkdacW9maW9kMXJZaGhRaHpDc2N6a0w3dWJjcTBOS2NFQjY0OTB1N0hyeVZ5Y0pGSmwzR0ZKVnN0d0pYZkV1CmtVQ2s2bVlYNFFWb2NObHlKVWZLaWZUMFBZSVQwVVBqZWwvc2NrTnJIUjFFTU5sVXJOWXlHMkJ1cTFhSENhZ2oKRGNrUWh5dU44cTZqNERiSGwrS0pJUTNtN0dxL29vTzBSMm5LNFlKUVMyZjI4bkFhWkRlRWZZcDEwdmg0ditUQwpjaXI5RStmYm1EYWFUQXNsVGdrQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZMNVRSSG9QUGJDWk4vUFRVcjdCZGVidmdkMFRNQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFBQTRxa3prejNsTGFRYlQ3a0x3SnBoTXZnczJUdzU1b01VYWlzdlBJczVwSk1aZmNwNQpDcFdiRnc1VzR6R0RqWFBpRUExb3BvOEFEQzlXTERZem01eHV3V1ZQeWlWZzRmWjYxK3hISU9KMnlnQW4rWEo1CjRVUHMzYUl3RUJ3OHNPdTM4c1N0a29HNDJTY1gzTXR5cDRjRHJDakFGYnVrMUR5U3E5RytOWG9iL3FVdWxDWC8KSkdzSUJZd3pHVmVDSzVweVJDdHUwY0VRWkp4N1pQc2RhOXcwWXVBdGt5dFN3YkxVakU5MWpMNDV4blRHdllpMwo4eC9ocmJOYVBKUjVlNStpZlZqQVR1TDNHM3liNkduaVNsMGNBSDlNeEUzNE50MStwUFlOTmduVk9HdC9SZTdwClVubzVocXd4RTB2cmQxanU2YlVmVDZ6U0ozb1hpejI5Ri93RwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
server: https://192.168.0.41:6443
name: myk8s
contexts: null
current-context: ""
kind: Config
preferences: {}
users: null
[root@master01 ~]#
提示:這里的證書信息是一base64編碼處理以后的信息; 創(chuàng)建用戶,指定對應(yīng)用戶名稱,用戶證書和私鑰信息 [root@master01 ~]# kubectl config set-credentials tom --client-certificate=/etc/kubernetes/pki/tom.crt --client-key=/etc/kubernetes/pki/tom.key --username=tom --embed-certs=true
User "tom" set.
[root@master01 ~]# kubectl config set-credentials tom --client-certificate=/etc/kubernetes/pki/tom.crt --client-key=/etc/kubernetes/pki/tom.key --username=tom --embed-certs=true --kubeconfig=/tmp/myk8s.config
User "tom" set.
[root@master01 ~]# kubectl config view --kubeconfig=/tmp/myk8s.config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://192.168.0.41:6443
name: myk8s
contexts: null
current-context: ""
kind: Config
preferences: {}
users:
- name: tom
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
username: tom
[root@master01 ~]#
提示:--username指定的名字盡量同證書中的CN名稱相同,因?yàn)閍piserver會把CN的信息識別為對應(yīng)用戶信息;這里補(bǔ)充一點(diǎn),在k8s上沒有真正的人類用戶,它是把對應(yīng)客戶端的證書中的CN信息識別成對應(yīng)操作該客戶端的用戶;只要對應(yīng)的證書能夠通過認(rèn)證,不管對應(yīng)操作者是誰,k8s并不關(guān)心;就像我們在使用Linux時(shí),拿著root用戶登錄了系統(tǒng),只要密碼正確,Linux內(nèi)核就認(rèn)為是root在操作;這里的證書就好比Linuxroot的密碼; 創(chuàng)建context,把tom用戶和myk8s集群做關(guān)聯(lián),并指定對應(yīng)context的名稱 [root@master01 ~]# kubectl config set-context tom@myk8s --cluster=myk8s --user=tom
Context "tom@myk8s" created.
[root@master01 ~]# kubectl config set-context tom@myk8s --cluster=myk8s --user=tom --kubeconfig=/tmp/myk8s.config
Context "tom@myk8s" created.
[root@master01 ~]# kubectl config view --kubeconfig=/tmp/myk8s.config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://192.168.0.41:6443
name: myk8s
contexts:
- context:
cluster: myk8s
user: tom
name: tom@myk8s
current-context: ""
kind: Config
preferences: {}
users:
- name: tom
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
username: tom
[root@master01 ~]#
提示:創(chuàng)建context盡量做到見名知意;一般都是使用用戶名@集群名的格式為context命名; 到此,對應(yīng)tom用戶的配置文件就做好了,我們在/tmp/myk8s.config文件中保存了對應(yīng)新建的用戶、集群、context信息,在當(dāng)前配置文件中也保存了相應(yīng)的配置信息; 測試:在沒有切換配置之前,查看集群運(yùn)行在default名稱空間運(yùn)行的pod [root@master01 ~]# kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes-admin@kubernetes kubernetes kubernetes-admin
tom@myk8s myk8s tom
[root@master01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-pod-demo 1/1 Running 0 117m
web-0 1/1 Running 1 27h
web-1 1/1 Running 1 27h
web-2 1/1 Running 1 27h
web-3 1/1 Running 2 27h
[root@master01 ~]#
提示:當(dāng)前配置還是用的kubernetes-admin@kubernetes這個(gè)context,查看default名稱空間下的pod能夠正常查詢到; 切換context到tom@myk8s context上,看看是否還能看到default名稱空間下的pod 呢? [root@master01 ~]# kubectl config use-context tom@myk8s
Switched to context "tom@myk8s".
[root@master01 ~]# kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
kubernetes-admin@kubernetes kubernetes kubernetes-admin
* tom@myk8s myk8s tom
[root@master01 ~]# kubectl get pods
Error from server (Forbidden): pods is forbidden: User "tom" cannot list resource "pods" in API group "" in the namespace "default"
[root@master01 ~]#
提示:可以看到切換到tom@myk8s這個(gè)context后,再次查看default名稱空間下pod列表就看不到;這里提示我們權(quán)限拒絕;其實(shí)看不到才是正常的,因?yàn)槲覀冎皇前裻om用戶接入到apiserver上進(jìn)行認(rèn)證,并沒有給他授權(quán),所以tom用戶目前只是通過了驗(yàn)證,并沒有對資源的操作權(quán)限,在權(quán)限驗(yàn)證時(shí)給拒絕了; 使用/tmp/myk8s.config配置文件查看default名稱空間下的pod列表 [root@master01 ~]# kubectl config get-contexts --kubeconfig=/tmp/myk8s.config
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
tom@myk8s myk8s tom
[root@master01 ~]# kubectl config use-context tom@myk8s --kubeconfig=/tmp/myk8s.config
Switched to context "tom@myk8s".
[root@master01 ~]# kubectl config get-contexts --kubeconfig=/tmp/myk8s.config
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* tom@myk8s myk8s tom
[root@master01 ~]# kubectl get pods --kubeconfig=/tmp/myk8s.config
Error from server (Forbidden): pods is forbidden: User "tom" cannot list resource "pods" in API group "" in the namespace "default"
[root@master01 ~]#
提示:使用/tmp/myk8s.config配置文件去apiserver上驗(yàn)證,也是一樣的情況看不到pod,響應(yīng)我們對應(yīng)資源禁止訪問; 切回kubernetes-admin@kubernetes context再次查看default名稱空間下的pod列表 [root@master01 ~]# kubectl config use-context kubernetes-admin@kubernetes
Switched to context "kubernetes-admin@kubernetes".
[root@master01 ~]# kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes-admin@kubernetes kubernetes kubernetes-admin
tom@myk8s myk8s tom
[root@master01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-pod-demo 1/1 Running 0 132m
web-0 1/1 Running 1 27h
web-1 1/1 Running 1 27h
web-2 1/1 Running 1 27h
web-3 1/1 Running 2 27h
[root@master01 ~]#
提示:切回kubernetes-admin@kubernetes context后,查看default名稱空間下的pod列表,能夠正常查看到,這是因?yàn)榍袚Qcontext以后,對應(yīng)的用戶認(rèn)證在apiserver有查看對應(yīng)資源的權(quán)限; 創(chuàng)建一個(gè)sa賬號 [root@master01 ~]# cat sa-demo.yaml apiVersion: v1 kind: ServiceAccount metadata: name: sa-demo namespace: default [root@master01 ~]# 提示:sa是k8s上的一個(gè)標(biāo)準(zhǔn)資源,其群組為v1,類型為ServiceAccount;其中metadata.name是用來指定sa賬號的名稱,namespace用來指定其名稱空間信息;創(chuàng)建一個(gè)sa資源用戶只需要定義對應(yīng)的名稱和名稱空間就可以了;對應(yīng)secret資源會自動創(chuàng)建并生成的對應(yīng)的token信息;這樣一來就意味著只要我們創(chuàng)建一個(gè)sa賬號,在k8s上就能夠被認(rèn)證通過;因?yàn)閯?chuàng)建sa它自動創(chuàng)建secret并將對應(yīng)的token生成好;我們可以理解為創(chuàng)建secret并生成token的過程就是在把對應(yīng)sa賬號和對應(yīng)token進(jìn)行關(guān)聯(lián); 應(yīng)用資源清單 [root@master01 ~]# kubectl apply -f sa-demo.yaml
serviceaccount/sa-demo created
[root@master01 ~]# kubectl get sa
NAME SECRETS AGE
default 1 21d
sa-demo 1 5s
[root@master01 ~]# kubectl describe sa sa-demo
Name: sa-demo
Namespace: default
Labels: <none>
Annotations: <none>
Image pull secrets: <none>
Mountable secrets: sa-demo-token-8kjhc
Tokens: sa-demo-token-8kjhc
Events: <none>
[root@master01 ~]# kubectl get secret
NAME TYPE DATA AGE
default-token-xvd4c kubernetes.io/service-account-token 3 21d
docker-registry.io kubernetes.io/dockerconfigjson 1 3d1h
mysql-auth Opaque 2 3d
sa-demo-token-8kjhc kubernetes.io/service-account-token 3 26s
test-secret-demo Opaque 2 2d23h
test-secret-demo1 Opaque 2 2d23h
test-tls kubernetes.io/tls 2 3d
www-myapp-com-ingress-secret kubernetes.io/tls 2 7d23h
[root@master01 ~]# kubectl describe secret sa-demo-token-8kjhc
Name: sa-demo-token-8kjhc
Namespace: default
Labels: <none>
Annotations: kubernetes.io/service-account.name: sa-demo
kubernetes.io/service-account.uid: 34cb62e8-23bd-4f2b-be82-4a8c9afc4037
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1066 bytes
namespace: 7 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4WnU0Z1Q1c0hBNmR5Q1V0ejRaMFk4d2J2WncwWjNiUTAxZk02SGN4OTgifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InNhLWRlbW8tdG9rZW4tOGtqaGMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoic2EtZGVtbyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjM0Y2I2MmU4LTIzYmQtNGYyYi1iZTgyLTRhOGM5YWZjNDAzNyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OnNhLWRlbW8ifQ.XyYaqpeZXexal1wr1aiBaZOelRJtlQ2drElDcvWIep1yj4TNYKhqsEUA11fzazStUahpLzuTMXGHMDG7AKA8MqBgBUxRW7UPNBxF7_radK4dfUxig_049Dp7nBYpPKl3sRyPfZcm_R0bXrnXfiMj7KEsfenx3_Skr7R0Wtc4asuVcLgYR1PGFMKbAqi_FDLlZYsledP74fGs3pGNnQ46LNaZ7-ZrsDuIOCxsaJ-QKR_zUQni8wmmKYzGmuVTRvSmlk79DCjMhmVJ6B-AOtXLc8N8yoZ35_ZtXc5VyBTdGTYtIE6x7O6kUlNMFZQLwYgRnUQJdwbfSEUAJXD4b7KMQw
[root@master01 ~]#
提示:可以看到應(yīng)用資源清單以后,對應(yīng)sa就成功被創(chuàng)建,同時(shí)查看sa的詳細(xì)信息,它關(guān)聯(lián)了一個(gè)secret資源,對應(yīng)secret資源的詳細(xì)信息中明確標(biāo)注了對應(yīng)sa用戶名稱為sa-demo;從上面反饋的信息我們不難理解,創(chuàng)建sa賬號,它會自動創(chuàng)建一個(gè)secret,并且把對應(yīng)的secret中的token與sa賬號做綁定;這就意味著,我們只要拿著對應(yīng)的token去apiserver認(rèn)證,對應(yīng)apiserver一定能夠在etcd中查到對應(yīng)的token綁定的sa賬號;從而對應(yīng)sa賬號就能順利的通過apiserver中的認(rèn)證機(jī)制; |
|
|