這篇文章主要介紹了kubernetes中TLS bootstrapping有什么用,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
我們提供的服務(wù)有:成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、南宮ssl等。為成百上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的南宮網(wǎng)站制作公司一: 前言
當(dāng)集群開啟了 TLS 認(rèn)證后,每個(gè)節(jié)點(diǎn)的 kubelet 組件都要使用由 apiserver 使用的 CA 簽發(fā)的有效證書才能與 apiserver 通訊;此時(shí)如果節(jié)點(diǎn)多起來,為每個(gè)節(jié)點(diǎn)單獨(dú)簽署證書將是一件非常繁瑣的事情;TLS bootstrapping 功能就是讓 kubelet 先使用一個(gè)預(yù)定的低權(quán)限用戶連接到 apiserver,然后向 apiserver 申請(qǐng)證書,kubelet 的證書由 apiserver 動(dòng)態(tài)簽署;
Bootstrap 是很多系統(tǒng)中都存在的程序,比如 Linux 的bootstrap,bootstrap 一般都是作為預(yù)先配置在開啟或者系統(tǒng)啟動(dòng)的時(shí)候加載,這可以用來生成一個(gè)指定環(huán)境。Kubernetes 的 kubelet 的啟動(dòng)時(shí)同樣可以加載一個(gè)這樣的配置文件,這個(gè)文件的內(nèi)容類似如下形式:
02b50b05283e98dd0fd71db496ef01e8,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
在配合 RBAC 授權(quán)模型下的工作流程大致如下:
二:TLS bootstrapping 相關(guān)術(shù)語
1.kubernet相關(guān)端口
kubelet 組件在工作時(shí),采用主動(dòng)的查詢機(jī)制,即定期請(qǐng)求 apiserver 獲取自己所應(yīng)當(dāng)處理的任務(wù),如哪些 pod 分配到了自己身上,從而去處理這些任務(wù);同時(shí) kubelet 自己還會(huì)暴露出兩個(gè)本身 api 的端口,用于將自己本身的私有 api 暴露出去,這兩個(gè)端口分別是 10250 與 10255;對(duì)于 10250 端口,kubelet 會(huì)在其上采用 TLS 加密以提供適當(dāng)?shù)蔫b權(quán)功能;對(duì)于 10255 端口,kubelet 會(huì)以只讀形式暴露組件本身的私有 api,并且不做鑒權(quán)處理
就是說 kubelet 上實(shí)際上有兩個(gè)地方用到證書,一個(gè)是用于與 API server 通訊所用到的證書,另一個(gè)是 kubelet 的 10250 私有 api 端口需要用到的證書
2.CSR請(qǐng)求類型
kubelet 發(fā)起的 CSR 請(qǐng)求都是由 controller manager 來做實(shí)際簽署的,對(duì)于 controller manager 來說,TLS bootstrapping 下 kubelet 發(fā)起的 CSR 請(qǐng)求大致分為以下三種:
1. nodeclient :用戶的客戶端認(rèn)證請(qǐng)求 O=system:nodes ,CN=system:node:(node name) 。
2. selfnodeclient :更新具有相同 O 和 CN 的客戶端證書的節(jié)點(diǎn)。
3. selfnodeserver :更新服務(wù)證書的節(jié)點(diǎn)。
nodeclient 類型的 CSR 僅在第一次啟動(dòng)時(shí)會(huì)產(chǎn)生,selfnodeclient 類型的 CSR 請(qǐng)求實(shí)際上就是 kubelet renew 自己作為 client 跟 apiserver 通訊時(shí)使用的證書產(chǎn)生的,selfnodeserver 類型的 CSR 請(qǐng)求則是 kubelet 首次申請(qǐng)或后續(xù) renew 自己的 10250 api 端口證書時(shí)產(chǎn)生的
1.TLS 作用
眾所周知 TLS 的作用就是對(duì)通訊加密,防止中間人竊聽;同時(shí)如果證書不信任的話根本就無法與 apiserver 建立連接,更不用提有沒有權(quán)限向 apiserver 請(qǐng)求指定內(nèi)容。
2.RBAC 作用
當(dāng) TLS 解決了通訊問題后,那么權(quán)限問題就應(yīng)由 RBAC 解決(可以使用其他權(quán)限模型,如 ABAC);RBAC 中規(guī)定了一個(gè)用戶或者用戶組(subject)具有請(qǐng)求哪些 api 的權(quán)限;在配合 TLS 加密的時(shí)候,實(shí)際上 apiserver 讀取客戶端證書的 CN 字段作為用戶名,讀取 O 字段作為用戶組.
以上說明:第一,想要與 apiserver 通訊就必須采用由 apiserver CA 簽發(fā)的證書,這樣才能形成信任關(guān)系,建立 TLS 連接;第二,可以通過證書的 CN、O 字段來提供 RBAC 所需的用戶與用戶組。
3.kubelet 首次啟動(dòng)流程
既然 TLS bootstrapping 功能是讓 kubelet 組件去 apiserver 申請(qǐng)證書,然后用于連接 apiserver;那么第一次啟動(dòng)時(shí)沒有證書如何連接 apiserver ?
在 apiserver 配置中指定了一個(gè) token.csv 文件,該文件中是一個(gè)預(yù)設(shè)的用戶配置;同時(shí)該用戶的 Token 和 apiserver 的 CA 證書被寫入了 kubelet 所使用的 bootstrap.kubeconfig 配置文件中;這樣在首次請(qǐng)求時(shí),kubelet 使用 bootstrap.kubeconfig 中的 apiserver CA 證書來與 apiserver 建立 TLS 通訊,使用 bootstrap.kubeconfig 中的用戶 Token 來向 apiserver 聲明自己的 RBAC 授權(quán)身份.
首次啟動(dòng)時(shí),可能與遇到 kubelet 報(bào) 401 無權(quán)訪問 apiserver 的錯(cuò)誤;這是因?yàn)樵谀J(rèn)情況下,kubelet 通過 bootstrap.kubeconfig 中的預(yù)設(shè)用戶 Token 聲明了自己的身份,然后創(chuàng)建 CSR 請(qǐng)求;但是不要忘記這個(gè)用戶在我們不處理的情況下他沒任何權(quán)限的,包括創(chuàng)建 CSR 請(qǐng)求;所以需要如下命令創(chuàng)建一個(gè) ClusterRoleBinding,將預(yù)設(shè)用戶 kubelet-bootstrap 與內(nèi)置的 ClusterRole system:node-bootstrapper 綁定到一起,使其能夠發(fā)起 CSR 請(qǐng)求
點(diǎn)擊(此處)折疊或打開
cd /etc/kubernetes
export KUBE_APISERVER="https://x.x.x.x:6443"
# 設(shè)置集群參數(shù)
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=bootstrap.kubeconfig
# 設(shè)置客戶端認(rèn)證參數(shù)
kubectl config set-credentials kubelet-bootstrap \
--token=${BOOTSTRAP_TOKEN} \
--kubeconfig=bootstrap.kubeconfig
# 設(shè)置上下文參數(shù)
kubectl config set-context default \
--cluster=kubernetes \
--user=kubelet-bootstrap \
--kubeconfig=bootstrap.kubeconfig
# 設(shè)置默認(rèn)上下?
kubectl config use-context default --kubeconfig=bootstrap.kubeco
nfig
4.手動(dòng)簽發(fā)證書
在 kubelet 首次啟動(dòng)后,如果用戶 Token 沒問題,并且 RBAC 也做了相應(yīng)的設(shè)置,那么此時(shí)在集群內(nèi)應(yīng)該能看到 kubelet 發(fā)起的 CSR 請(qǐng)求:
出現(xiàn) CSR 請(qǐng)求后,可以使用 kubectl 手動(dòng)簽發(fā)(允許) kubelet 的證書
kubectl certificate approve node-csr-ICyEqgl55a222oGUbA3U5CE22roAKo6AoGT6Eff_ehY
當(dāng)成功簽發(fā)證書后,目標(biāo)節(jié)點(diǎn)的 kubelet 會(huì)將證書寫入到 --cert-dir= 選項(xiàng)指定的目錄中
而 kubelet 與 apiserver 通訊所使用的證書為 kubelet-client.crt,剩下的 kubelet.crt 將會(huì)被用于 kubelet server(10250) 做鑒權(quán)使用;注意,此時(shí) kubelet.crt 這個(gè)證書是個(gè)獨(dú)立于 apiserver CA 的自簽 CA,并且刪除后 kubelet 組件會(huì)重新生成它
四:證書及配置文件
1.token.csv
該文件為一個(gè)用戶的描述文件,基本格式為 Token,用戶名,UID,用戶組;這個(gè)文件在 apiserver 啟動(dòng)時(shí)被 apiserver 加載,然后就相當(dāng)于在集群內(nèi)創(chuàng)建了一個(gè)這個(gè)用戶;接下來就可以用 RBAC 給他授權(quán);持有這個(gè)用戶 Token 的組件訪問 apiserver 的時(shí)候,apiserver 根據(jù) RBAC 定義的該用戶應(yīng)當(dāng)具有的權(quán)限來處理相應(yīng)請(qǐng)求
2.bootstarp.kubeconfig
該文件中內(nèi)置了 token.csv 中用戶的 Token,以及 apiserver CA 證書;kubelet 首次啟動(dòng)會(huì)加載此文件,使用 apiserver CA 證書建立與 apiserver 的 TLS 通訊,使用其中的用戶 Token 作為身份標(biāo)識(shí)像 apiserver 發(fā)起 CSR 請(qǐng)求
3.kubelet-client.crt
該文件在 kubelet 完成 TLS bootstrapping 后生成,此證書是由 controller manager 簽署的,此后 kubelet 將會(huì)加載該證書,用于與 apiserver 建立 TLS 通訊,同時(shí)使用該證書的 CN 字段作為用戶名,O 字段作為用戶組向 apiserver 發(fā)起其他請(qǐng)求
4.kubelet.crt
該文件在 kubelet 完成 TLS bootstrapping 后并且沒有配置 --feature-gates=RotateKubeletServerCertificate=true 時(shí)才會(huì)生成;這種情況下該文件為一個(gè)獨(dú)立于 apiserver CA 的自簽 CA 證書,有效期為 1 年;被用作 kubelet 10250 api 端口
5.apiserver配置文件
點(diǎn)擊(此處)折疊或打開
###
## kubernetes system config
##
## The following values are used to configure the kube-apiserver
##
#
## The address on the local server to listen to.
KUBE_API_ADDRESS="--advertise-address=10.116.137.196 --bind-address=10.116.137.196 --insecure-bind-address=10.116.137.196"
#
## The port on the local server to listen on.
#KUBE_API_PORT="--port=8080"
#
## Port minions listen on
#KUBELET_PORT="--kubelet-port=10250"
#
## Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="--etcd-servers=https://10.116.137.196:2379,https://10.116.82.28:2379,https://10.116.36.57:2379"
#
## Address range to use for services
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
#
## default admission control policies
KUBE_ADMISSION_CONTROL="--admission-control=ServiceAccount,NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota"
#
## Add your own!
KUBE_API_ARGS="--authorization-mode=RBAC --runtime-config=rbac.authorization.k8s.io/v1beta1 --kubelet-https=true --experimental-bootstrap-token-auth --token-auth-file=/etc/kubernetes/token.csv --service-node-port-range=30000-32767 --tls-cert-file=/etc/kubernetes/ssl/kubernetes.pem --tls-private-key-file=/etc/kubernetes/ssl/kubernetes-key.pem --client-ca-file=/etc/kubernetes/ssl/ca.pem --service-account-key-file=/etc/kubernetes/ssl/ca-key.pem --etcd-cafile=/etc/kubernetes/ssl/ca.pem --etcd-certfile=/etc/kubernetes/ssl/kubernetes.pem --etcd-keyfile=/etc/kubernetes/ssl/kubernetes-key.pem --enable-swagger-ui=true --apiserver-count=1 --audit-log-maxage=30 --audit-log-maxbackup=3 --audit-log-maxsize=100 --audit-log-path=/var/lib/audit.log --event-ttl=1h"
6.kubelet配置文件
點(diǎn)擊(此處)折疊或打開
## kubelet (minion) config
#
## The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=10.116.82.28"
#
## The port for the info server to serve on
#KUBELET_PORT="--port=10250"
#
## You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=10.116.82.28"
#
## location of the api-server
#KUBELET_API_SERVER="--api-servers=http://10.116.137.196:8080"
#
## pod infrastructure container
#KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=sz-pg-oam-docker-hub-001.tendcloud.com/library/pod-infrastructure:rhel7"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure"
#
## Add your own!
KUBELET_ARGS="--cgroup-driver=systemd --cluster-dns=10.254.0.2 --experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig --kubeconfig=/etc/kubernetes/kubelet.kubeconfig --require-kubeconfig --cert-dir=/etc/kubernetes/ssl --cluster-domain=cluster.local. --hairpin-mode promiscuous-bridge --serialize-image-pulls=false --runtime-cgroups=/systemd/system.slice --kubelet-cgroups=/systemd/system.slice"
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“kubernetes中TLS bootstrapping有什么用”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!
分享標(biāo)題:kubernetes中TLSbootstrapping有什么用-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://jinyejixie.com/article38/dispsp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、品牌網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、電子商務(wù)、App設(shè)計(jì)、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容