本篇主要 記錄一下 在 k8s 中如果想要 從 harbor拉取鏡像 該怎么操作,以及介紹了一下 k8s 中 Secret 是什么
1.Secret 是什么
1.1 Secret 概述
Secret 是一種包含少量敏感信息例如密碼
教硫、令牌或密鑰
的對象歧匈。 這樣的信息可能會(huì)被放在 Pod 規(guī)約中或者鏡像中枢舶。 使用 Secret 意味著你不需要在應(yīng)用程序代碼中包含機(jī)密數(shù)據(jù)愈诚。
由于創(chuàng)建 Secret 可以獨(dú)立于使用它們的 Pod邮绿, 因此在創(chuàng)建烛谊、查看和編輯 Pod 的工作流程中暴露 Secret(及其數(shù)據(jù))的風(fēng)險(xiǎn)較小地沮。 Kubernetes 和在集群中運(yùn)行的應(yīng)用程序也可以對 Secret 采取額外的預(yù)防措施嗜浮, 例如避免將機(jī)密數(shù)據(jù)寫入非易失性存儲(chǔ)羡亩。
Secret 類似于 ConfigMap 但專門用于保存機(jī)密數(shù)據(jù)。
說白了就是用于保存 重要的密碼等信息
Pod 可以用三種方式之一來使用 Secret:
- 作為掛載到一個(gè)或多個(gè)容器上的卷 中的文件周伦。
- 作為容器的環(huán)境變量夕春。
- 由 kubelet 在為 Pod 拉取鏡像時(shí)使用。
本篇主要說一下 在Pod拉取鏡像時(shí) 如何使用
1.2 Secret 的類型
創(chuàng)建 Secret 時(shí)专挪,你可以使用 Secret 資源的 type
字段及志,或者與其等價(jià)的 kubectl
命令行參數(shù)(如果有的話)為其設(shè)置類型。 Secret 類型有助于對 Secret 數(shù)據(jù)進(jìn)行編程處理寨腔。
Kubernetes 提供若干種內(nèi)置的類型速侈,用于一些常見的使用場景。 針對這些類型迫卢,Kubernetes 所執(zhí)行的合法性檢查操作以及對其所實(shí)施的限制各不相同倚搬。
內(nèi)置類型 | 用法 |
---|---|
Opaque |
用戶定義的任意數(shù)據(jù) |
kubernetes.io/service-account-token |
服務(wù)賬號令牌 |
kubernetes.io/dockercfg |
~/.dockercfg 文件的序列化形式 |
kubernetes.io/dockerconfigjson |
~/.docker/config.json 文件的序列化形式 |
kubernetes.io/basic-auth |
用于基本身份認(rèn)證的憑據(jù) |
kubernetes.io/ssh-auth |
用于 SSH 身份認(rèn)證的憑據(jù) |
kubernetes.io/tls |
用于 TLS 客戶端或者服務(wù)器端的數(shù)據(jù) |
bootstrap.kubernetes.io/token |
啟動(dòng)引導(dǎo)令牌數(shù)據(jù) |
本篇主要涉及 kubernetes.io/dockerconfigjson
用于Pod 拉取鏡像使用的 Secret
2.Docker pull 概述
我們都知道 docker pull 鏡像之前的時(shí)候 其實(shí)是需要 docker login 進(jìn)行登錄的,如下:
當(dāng)我去拉取harbor 的時(shí)候乾蛤,提示 沒有進(jìn)行認(rèn)證
當(dāng)我們docker login 后 密碼就被加密存儲(chǔ)在 ~/.docker/config.json 中
~/.docker/config.json
文件內(nèi)容如下:
{
"auths":{
"harbor.demo.com:5667":
{
"username":"admin",
"password":"Harbor12345",
"auth":"YWRtaW46SGFyYm9yMTIzNDU="
}
}
}
那我們思考每界,如果讓k8s 去拉取這個(gè) harbor 上的鏡像的時(shí)候,它肯定也要去認(rèn)證 家卖,讓我們來試一下吧 不認(rèn)證的情況
3.編寫部署 文件 (未配置Secret)
指定鏡像拉取地址是 harbor 眨层,鏡像還是 前面創(chuàng)建的springboot 簡單鏡像
apiVersion: apps/v1
kind: Deployment
metadata:
name: pull-harbor-web-demo
spec:
selector:
matchLabels:
app: pull-harbor-web-demo
template:
metadata:
labels:
app: pull-harbor-web-demo
spec:
containers:
- name: boot-demo
image: harbor.demo.com:5667/k8s-project/boot-k8s-demo:v2 #指定從 harbor 拉取鏡像
ports:
- containerPort: 8081
---
apiVersion: v1
kind: Service
metadata:
name: pull-harbor-web-demo
spec:
selector:
app: pull-harbor-web-demo
ports:
- port: 8081
name: boot-demo
targetPort: 8081
type: NodePort
4.部署服務(wù)(未認(rèn)證,失斏系础)
kubectl apply -f deploy-many-container_test.yaml
kubectl get pods #可以看到 pod 狀態(tài)是 ImagePullBackOff
kubectl describe pods name | grep Failed #可以查看到具體信息
可以看到趴樱,在沒有配置 secret 的時(shí)候 ,k8s 調(diào)度起pod 酪捡,因?yàn)槔〔坏綄?yīng)的鏡像
5.創(chuàng)建Secret
5.1 文件的方式 創(chuàng)建 Secret (kubernetes.io/dockerconfigjson)
你可以使用下面兩種 type
值之一來創(chuàng)建 Secret叁征,用以存放訪問 Docker 倉庫 來下載鏡像的憑據(jù)。
-
kubernetes.io/dockercfg
老舊類型 不展開說 kubernetes.io/dockerconfigjson
類型 kubernetes.io/dockerconfigjson
被設(shè)計(jì)用來保存 JSON 數(shù)據(jù)的序列化形式逛薇, 該 JSON 也遵從 ~/.docker/config.json
文件的格式規(guī)則捺疼,是 ~/.dockercfg
的新版本格式。使用此 Secret 類型時(shí)金刁,Secret 對象的 data
字段必須包含 .dockerconfigjson
鍵帅涂,其鍵值為 base64 編碼的字符串包含 ~/.docker/config.json
文件的內(nèi)容。
下面是一個(gè) kubernetes.io/dockercfg
類型 Secret 的示例:
apiVersion: v1
kind: Secret
metadata:
name: secret-dockercfg
type: kubernetes.io/dockerconfigjson #指定類型 使用新版本的
data:
.dockerconfigjson: |
"<base64 encoded ~/.docker/config.json file>"
5.2 命令的方式 創(chuàng)建 Secret (kubernetes.io/dockerconfigjson)
kubectl create secret docker-registry loginharbor \
--docker-email=tiger@acme.example \ #可以不填寫
--docker-username=admin \
--docker-password=Harbor12345 \
--docker-server=harbor.demo.com:5667 #harbor的 地址 要加端口的
-
kubectl create secret docker-registry
固定部分 -
loginharbor
自定義的 secret 的名稱 - 指定 username password
- 指定 鏡像倉庫地址
kubectl get secret loginharbor -o yaml #查看 自動(dòng)生成的 secret 文件信息
tips:
注意它不會(huì)在 master節(jié)點(diǎn)上保留 這個(gè) ~/.docker/config.json 尤蛮,而是把 secret 文件信息保存到 etcd 存儲(chǔ)里面,后續(xù)下發(fā)到對應(yīng)的pod 引用的 node 節(jié)點(diǎn)上
通過上面的描述 : .dockerconfigjson 其鍵值為 base64 編碼的字符串包含 ~/.docker/config.json
文件的內(nèi)容,那我們嘗試用 base64解密一下 看看內(nèi)容是什么
echo "eyJhdXRocyI6eyJoYXJib3IuZGVtby5jb206NTY2NyI6eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJIYXJib3IxMjM0NSIsImF1dGgiOiJZV1J0YVc0NlNHRnlZbTl5TVRJek5EVT0ifX19" | base64 -d #解密 base64
可以看到 內(nèi)容就是
6.修改部署 文件 (配置Secret)
6.1 Pod 配置 Secret
如果你嘗試從私有倉庫拉取容器鏡像斯议,你需要一種方式讓每個(gè)節(jié)點(diǎn)上的 kubelet 能夠完成與鏡像庫的身份認(rèn)證产捞。你可以配置 鏡像拉取 Secret 來實(shí)現(xiàn)這點(diǎn)。 Secret 是在 Pod 層面來配置的哼御。
Pod 的 imagePullSecrets
字段是一個(gè)對 Pod 所在的名字空間中的 Secret 的引用列表坯临。你可以使用 imagePullSecrets
來將鏡像倉庫訪問憑據(jù)傳遞給 kubelet焊唬。 kubelet 使用這個(gè)信息來替你的 Pod 拉取私有鏡像。
6.2 ServiceAccount 引用 Secret
你可以手動(dòng)創(chuàng)建 imagePullSecret
看靠,并在一個(gè) ServiceAccount 中引用它赶促。 對使用該 ServiceAccount 創(chuàng)建的所有 Pod,或者默認(rèn)使用該 ServiceAccount 創(chuàng)建的 Pod 而言挟炬,其 imagePullSecrets
字段都會(huì)設(shè)置為該服務(wù)賬號鸥滨。 請
下面 簡單點(diǎn) 選擇第一種 方式,對上面的 部署文件進(jìn)行修改谤祖,添加 imagePullSecrets
6.3 修改部署文件 添加 imagePullSecrets
7. 再次部署服務(wù)(認(rèn)證婿滓,成功)
kubectl delete -f deploy-many-container_test.yaml
kubectl apply -f deploy-many-container_test.yaml
kubectl describe pods name #查看 pods 詳情
8.測試訪問
隨便訪問集群的任何節(jié)點(diǎn),因?yàn)樯厦娴腟ervice type = NodePort
總結(jié)
本篇主要介紹了k8s 中的 Secret 粥喜, 以及使用它的 kubernetes.io/dockerconfigjson 類型測試 集成Pod 拉取 Harbor鏡像倉庫 凸主,Secret 還是蠻簡單的 官網(wǎng)擼一遍 即可實(shí)操作
歡迎大家訪問 個(gè)人博客 Johnny小屋