要了解有關(guān)vSphere 7的新功能的更多信息,請(qǐng)?jiān)L問我們的網(wǎng)站:
https://www.vmware.com/products/vsphere.html。
背景介紹
vSphere with Kubernetes 自帶了一個(gè)內(nèi)嵌的映像注冊表(image registry)–Harbor。 大多數(shù)映像注冊表(image registry)都啟用了HTTPS,Harbor也是如此。通常來說在Kubernetes中部署的應(yīng)用要訪問映像注冊表(GCR,Docker Hub或Harbor),您需要準(zhǔn)備兩種憑證:
- 映像注冊表的服務(wù)器CA證書。運(yùn)行映像獲(image fetch)取的組件,需要在它的KeyStore有足夠的信息來驗(yàn)證注冊表的服務(wù)器證書。對(duì)于Docker Hub和GCR,應(yīng)該都沒有問題,因?yàn)榭蛻舳讼到y(tǒng)始終安裝了公共認(rèn)可的知名根證書來驗(yàn)證它們所簽名的這些證書。但如果要部署帶有自簽名證書的私有注冊表(例如Harbor),則還有更多設(shè)置步驟。
- 訪問映像注冊表的憑證(通常是用戶名和密碼)。公共存儲(chǔ)庫在訪問(pull操作)映像的時(shí)候不需要憑據(jù),在上傳或更新(push操作)映像的時(shí)候需要。私有注冊表(例如Harbor)在將映像拉取或推送(pull和push)時(shí)始終需要憑據(jù)。
在實(shí)際部署中,對(duì)大多數(shù)映像注冊表的使用可能有多種不同的使用方案。有的在Supervior集群中直接使用內(nèi)置的harbor,有的在Tanzu集群中使用內(nèi)置的Harbor,還有的則需要使用他們企業(yè)內(nèi)部已經(jīng)存在的映像注冊表服務(wù)。本文將通過實(shí)戰(zhàn)的方式,來一步步展示如何在不同的部署情況下,正確的配置Supervisor和Tanzu集群,才能流暢的訪問映像注冊表的服務(wù)。下面的實(shí)戰(zhàn)練習(xí)需要幾個(gè)前提條件:
配置好Supervisor Kubernetes集群。請(qǐng)參考:Config a Supervisor Cluster
創(chuàng)建并配置好Supervisor Kubernetes集群的命名空間。請(qǐng)參考:Configure Supervisor Cluster Namespaces.
下載并安裝好Kubernetes客戶端根據(jù)kubectl和vSphere的插件。請(qǐng)參考:Download and Install the Kubernetes CLI Tools for vSphere
在命名空間里創(chuàng)建一個(gè)或多個(gè)Tanzu Kubernetes 集群。請(qǐng)參考:How to Create Tanzu Kubernetes Clusters.
如何設(shè)置內(nèi)置的映像注冊表。請(qǐng)參考:Enable a private image registry on a Supervisor Cluster。
Docker Client訪問內(nèi)嵌的Harbor
在實(shí)際安裝過程中,如果用戶不提供自己的證書,vSphere with Kubernetes會(huì)自己生成一個(gè)自簽名的證書,內(nèi)嵌的Harbor也使用這個(gè)根證書簽發(fā)的證書。因此,Docker客戶端需要將這個(gè)證書導(dǎo)入到系統(tǒng)中,才能使用Harbor服務(wù)。
1.通過瀏覽器登錄到Harbor界面。選擇你要訪問的Project或者(Namespace)。
2.轉(zhuǎn)到“Repositories”頁,下載注冊表證書
3.將這個(gè)證書添加到本機(jī)的系統(tǒng)里,例如,在MacOS里需要運(yùn)行下面的命令(最后的參數(shù)是剛才保存證書的文件路徑):
$ security add-trusted-cert -d -r trustRoot -k ~/Library/Keychains/login.keychain pathtofile/harbor-cert.crt
4.重啟Docker服務(wù)
5.通過下面的命令來驗(yàn)證Docker客戶端和Harbor的集成(下面的例子中10.147.18.2是我的Harbor服務(wù)的IP地址):
- docker login 10.147.18.2
- docker pull busybox:latest
- docker tag busybox:latest 10.147.18.2/wangyu/busybox:latest
- docker push 10.147.18.2/wangyu/busybox:latest
要從Supervisor集群中訪問內(nèi)置的Harbor服務(wù),例如,創(chuàng)建帶有指向Harbor存儲(chǔ)庫的URL的Pod,我們無需執(zhí)行任何操作即可實(shí)現(xiàn)此目的。這是因?yàn),一方面,Harbour Registry和Esxi Spherelet(映像獲取服務(wù)所在的地方)共享相同的根證書,因此它們自然彼此信任。另一方面,在Supervisor群集中創(chuàng)建命名空間時(shí)會(huì)自動(dòng)創(chuàng)建默認(rèn)的映像像拉取秘鑰。
從Supervisor集群中訪問內(nèi)置的Harbor
因此這一小節(jié)的目的不是需要您執(zhí)行什么步驟,而是一起來看看系統(tǒng)在創(chuàng)建命名空間的時(shí)候,都創(chuàng)建了哪些與映像拉取操作相關(guān)的資源和秘鑰。
1、通過kubectl命令,以數(shù)據(jù)中心管理員或者Namespace管理員的身份登錄Supervisor 集群。然后執(zhí)行下面的命令來獲得相關(guān)的secret(格式為NAMESPACE-default-image-pull-secret)
$ kubectl vsphere login --server=10.117.233.1 --vsphere-username administrator@vsphere.local
$ kubectl get secret wangyu-default-image-pull-secret -o json -n wangyu
{
"apiVersion": "v1",
"data": {
".dockerconfigjson": "ewoJCQkJImF……QkJfQ=="
},
"kind": "Secret",
"metadata": {
"creationTimestamp": "2020-04-11T10:41:40Z",
"name": "wangyu-default-image-pull-secret",
"namespace": "wangyu",
"ownerReferences": [
{
"apiVersion": "registryagent.vmware.com/v1alpha1",
"blockOwnerDeletion": true,
"controller": true,
"kind": "Project",
"name": "wangyu",
"uid": "1b2a528c-45b5-4262-a5cc-d0d6e1744ccf"
}
],
"resourceVersion": "76067",
"selfLink": "/api/v1/namespaces/wangyu/secrets/wangyu-default-image-pull-secret",
"uid": "2c7a7fc1-97fa-49ba-b54a-6c5225ffe487"
},
"type": "kubernetes.io/dockerconfigjson
}
2、在當(dāng)前的命名空間里,缺。╠efault)的 Service Account已經(jīng)和這個(gè)secret綁定在一起了,因此,當(dāng)你從Harbor拉取映像的時(shí)候,就算你什么都沒有指定,缺省的也會(huì)使用了這個(gè)secret
$ kubectl describe sa default -n wangyu
Name: default
Namespace: wangyu
Labels: <none>
Annotations: <none>
Image pull secrets: wangyu-default-image-pull-secret
Mountable secrets: default-token-lqfwr
Tokens: default-token-lqfwr
Events: <none>
3、下面是個(gè)在Supervisor集群中使用內(nèi)置Harbor服務(wù)來創(chuàng)建pod的例子:
$ more busybox-harbor.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
imagePullSecrets:
- name: externalimgpull
containers:
- image: 10.147.18.2/wangyu/wybusybox:latest
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
如果要使用已有的映像注冊表(Harbor或其他),那么要從Supervisor群集訪問這個(gè)注冊表需要更多的配置步驟,尤其是您的注冊表服務(wù)正在使用自簽名證書。
4、 從Supervisor集群中訪問外部自簽名的Harbor
1.通過kubectl命令,以數(shù)據(jù)中心管理員的身份登錄Supervisor 集群。
2.在命名空間里創(chuàng)建一個(gè)映像拉取的secret,例如在下面的例子中,我們創(chuàng)建了一個(gè)名為“externalimagepull”的secret(你可以任意選擇其他的名稱)。”–docker-server”指向你的Harbor地址;最后還需要提供登錄Harbor的用戶名和密碼。
$ kubectl -n wangyu create secret docker-registry externalimgpull --docker-server=10.147.18.2 \
--docker-username=YourName --docker-password=YourPasswd
secret/externalimgpull created
3.從Tanzu集群中訪問自簽名的Harbor通過瀏覽器登錄到Harbor界面。選擇你要訪問的Project或者(Namespace)。
4.轉(zhuǎn)到“Repositories”頁,下載注冊表證書。
5.在系統(tǒng)命名空間(kube-system)里去修改 image-fetcher-ca-bundle這個(gè)資源,將剛才下載的證書的內(nèi)容追加到這個(gè)資源的證書列表的后面,并且保存。
$ kubectl edit configmap image-fetcher-ca-bundle -n kube-system
…
apiVersion: v1
data:
ca-bundle: |
-----BEGIN CERTIFICATE-----
MIIENTCCAx2gAwIBAgIJAPSI+BwiQ0E/MA0GCSqGSIb3DQEBCwUAMIGlMQswCQYD
VQQDDAJDQTEXMBUGCgmSJomT8ixkARkWB3ZzcGhlcmUxFTATBgoJkiaJk/IsZAEZ
FgVsb2NhbDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExJzAlBgNV
BAoMHnN0bmV0LWNwZC12Yy0xNy5lbmcudm13YXJlLmNvbTEbMBkGA1UECwwSVk13
YXJlIEVuZ2luZWVyaW5nMB4XDTIwMDMwMTEyNTE0MVoXDTMwMDIyNzEyNTE0MVow
gaUxCzAJBgNVBAMMAkNBMRcwFQYKCZImiZPyLGQBGRYHdnNwaGVyZTEVMBMGCgmS
JomT8ixkARkWBWxvY2FsMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5p
YTEnMCUGA1UECgwec3RuZXQtY3BkLXZjLTE3LmVuZy52bXdhcmUuY29tMRswGQYD
VQQLDBJWTXdhcmUgRW5naW5lZXJpbmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQCxkC3pJGQWYQP55bN9Brb3qwDl7aoEX1r/g21/jFoX35nwh7WC/5Jf
waQ1S0DiVytIdeZNoy/3W4/bKz0tDLTb+cmm2irJtn+5potx4ntZvrFJkTbSrJpO
7yrZXefbCYFnMCW9mzwAx/G97Es+s5+fdnv6epTy18fNC+AogAlt210SGvlM0wbw
k+oEZZBdVjz7/Meszw+V7EzG4KS5o5giMYBHAABkHDHlnAAh/5/93MdK9+j/Mg2n
izlQNXO+2VVG8LoVm1MLp+RiV5r410TmjER1W4TYRgtI390otZLLHSfI6xYQYey0
W7jjatXwneg/M1x10Do6fW1xxlYYg+l5AgMBAAGjZjBkMB0GA1UdDgQWBBRbVNOq
DOikfAxH0lWdp0hgBIG1+jAfBgNVHREEGDAWgQ5lbWFpbEBhY21lLmNvbYcEfwAA
ATAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADANBgkqhkiG9w0B
AQsFAAOCAQEAKptfB8HHyXpe2t2ncLUgC13WYk9LIJZeMlKtZiCTYIP6fsavNO43
JD5TUw7tc6dbKB9EQNDghuvekmzUazkaxksD3fMVERdeNqqGPGGmApIZJ71BAHBV
XS+ayql9Hxr/vvhwVIwPWkBsBfd3bStsNeNcBLeQyYRDpLs8pI6JAqpzDj2A2dIO
2YvUDsK4/bY992S3rIKs8mi8oC93O1MewpDTLnJNEbaG95+68sTn+21Xq88blDTP
V2YdsN2f67njV7wqbRPN+W/fGSv6UD6wLdb+EB2Rxjx7WHDCmBXyCFIkKFEj9EQw
7u2eCZG38ZbubwKJLITFHV2N9nZf/Kx3Lw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIENTCCAx2gAwIBAgIJAPSI+BwiQ0E/MA0GCSqGSIb3DQEBCwUAMIGlMQswCQYD
VQQDDAJDQTEXMBUGCgmSJomT8ixkARkWB3ZzcGhlcmUxFTATBgoJkiaJk/IsZAEZ
FgVsb2NhbDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExJzAlBgNV
BAoMHnN0bmV0LWNwZC12Yy0xNy5lbmcudm13YXJlLmNvbTEbMBkGA1UECwwSVk13
YXJlIEVuZ2luZWVyaW5nMB4XDTIwMDMwMTEyNTE0MVoXDTMwMDIyNzEyNTE0MVow
gaUxCzAJBgNVBAMMAkNBMRcwFQYKCZImiZPyLGQBGRYHdnNwaGVyZTEVMBMGCgmS
JomT8ixkARkWBWxvY2FsMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5p
YTEnMCUGA1UECgwec3RuZXQtY3BkLXZjLTE3LmVuZy52bXdhcmUuY29tMRswGQYD
VQQLDBJWTXdhcmUgRW5naW5lZXJpbmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQCxkC3pJGQWYQP55bN9Brb3qwDl7aoEX1r/g21/jFoX35nwh7WC/5Jf
waQ1S0DiVytIdeZNoy/3W4/bKz0tDLTb+cmm2irJtn+5potx4ntZvrFJkTbSrJpO
7yrZXefbCYFnMCW9mzwAx/G97Es+s5+fdnv6epTy18fNC+AogAlt210SGvlM0wbw
…
configmap/image-fetcher-ca-bundle edited
6、現(xiàn)在可以在Supervisor集群上部署Pod或Deployment,將剛才創(chuàng)建的secret應(yīng)用到部署文件中去:
$ more nginx-harbor.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: nginx
image: 10.147.18.2/wangyu/nginx:latest
ports:
- containerPort: 80
imagePullSecrets:
- name: externalimgpull
7、當(dāng)然,你可以將命名空間里缺。╠efault)的Service Account和這個(gè)映像拉取的secret進(jìn)行綁定,這樣,在當(dāng)前命名空間部署Pod或Deployment的時(shí)候,就不需要每次在部署文件中指定映像拉取的secret:
$ kubectl get sa default -o json -n wangyu
{
"apiVersion": "v1",
"imagePullSecrets": [
{
"name": "wangyu-default-image-pull-secret"
}
],
"kind": "ServiceAccount",
"metadata": {
"creationTimestamp": "2020-03-06T07:19:28Z",
"name": "default",
"namespace": "wangyu",
"resourceVersion": "850464",
"selfLink": "/api/v1/namespaces/wangyu/serviceaccounts/default",
"uid": "96b9abe5-14aa-4d55-bf66-02ce4bffc5ec"
},
"secrets": [
{
"name": "default-token-kfwj8"
}
]
}
$ kubectl edit sa default
從Tanzu集群中訪問自簽名的Harbor
當(dāng)您想從Tanzu Kubernetes群集訪問私有映像存儲(chǔ)庫時(shí),內(nèi)置的Harbor 注冊表和外部其他注冊表之間沒有什么區(qū)別。因?yàn)門anzu Kubernetes群集既沒有映像拉取秘鑰的默認(rèn)設(shè)置,它們也根本不信任您的私有注冊表(例如Harbor)的自簽名證書。所以要想從Tanzu Kubernetes集群訪問自簽名的注冊表(內(nèi)置或外部),需要更多的步驟來設(shè)置證書和憑證。證書的設(shè)置相對(duì)來說要更加麻煩一些,它需要在Tanzu Kubernetes群集的每一個(gè)節(jié)點(diǎn)上(包括所有的Master節(jié)點(diǎn)和Workder節(jié)點(diǎn)),都要加入Harbor自簽名的CA的證書信息,使其信任。下面我們來看看具體的步驟:
- 通過瀏覽器登錄到Harbor界面。選擇你要訪問的Project或者(Namespace)。
- 轉(zhuǎn)到“Repositories”頁,下載注冊表證書并保存到一個(gè)文件里,例如crt.
- 通過kubectl命令,以數(shù)據(jù)中心管理員或者Namespace管理員的身份登錄Supervisor 集群
$ kubectl vsphere login --server=10.117.233.1 --vsphere-username administrator@vsphere.local
4、在Tanzu集群所在的Supervisor命名空間里查看秘鑰的信息,可以通過以下命令獲得有關(guān)Tanzu集群跟SSH登錄相關(guān)的秘鑰信息,記住這個(gè)secret的名字,在下面的例子輸出中是“my-tanzu-cluster-ssh”。
kubectl get secret -n wangyu | grep ssh-auth
my-tanzu-cluster-ssh kubernetes.io/ssh-auth 1 18d
5、查看Tanzu集群的節(jié)點(diǎn)信息和IP地址
$ kubectl get virtualmachines -n wangyu
NAME AGE
my-tanzu-cluster-control-plane-kffsj 18d
wy-tanzu-cluster-workers-c5jwz-86b575c4bb-5lbst 18d
wy-tanzu-cluster-workers-c5jwz-86b575c4bb-9hwqg 18d
wy-tanzu-cluster-workers-c5jwz-86b575c4bb-lvth9 18d
$ kubectl get virtualmachines -n wangyu -o yaml | grep vmIp
vmIp: 10.244.1.2
vmIp: 10.244.1.3
vmIp: 10.244.1.5
vmIp: 10.244.1.4
6、創(chuàng)建configmap,以便于將Harbor的證書導(dǎo)入。
$ kubectl create configmap harborca --from-file=harbor.crt -n wangyu
7、通過kubectl創(chuàng)建一個(gè)跳板機(jī),并且將訪問Tanzu集群節(jié)點(diǎn)的秘鑰和Harbor的證書也一起放在跳板機(jī)里,就可以方便的將這個(gè)證書信息導(dǎo)入到Tanzu集群中的各個(gè)節(jié)點(diǎn)里。
$ more jumpbox.yaml
apiVersion: v1
kind: Pod
metadata:
name: jumpbox
spec:
containers:
- image: "photon:3.0"
name: jumpbox
command: [ "/bin/bash", "-c", "--" ]
args: [ "yum install -y openssh-server; mkdir /root/.ssh; cp /root/ssh/ssh-privatekey /root/.ssh/id_rsa; \
chmod 600 /root/.ssh/id_rsa; while true; do sleep 30; done;" ]
volumeMounts:
- mountPath: "/root/ssh"
name: ssh-key
readOnly: true
- name: harborca
mountPath: /tmp/harborca
volumes:
- name: ssh-key
secret:
secretName: my-tanzu-cluster-ssh
- name: harborca
configMap:
name: harborca
8、在各種開發(fā)部署的環(huán)境下,一般的映像注冊表都會(huì)使用自簽名的證書。如果是在Supervisor集群中使用vSphere with Kubernetes內(nèi)置的harbor,那比較簡單,基本上不需要做任何額外的配置。但是如果想在Tanzu集群中也使用內(nèi)置或者外置的映像注冊表,就需要按照本文描述的一步步操作來完成這些任務(wù)。通過瀏覽器登錄到Harbor界面。選擇你要訪問的Project或者(Namespace)。在當(dāng)前的命名空間里部署這個(gè)跳板機(jī)。
$ kubectl apply -f jumpbox.yaml -n wangyu
pod/jumpbox created
9、JiaMing的評(píng)論:并且在每個(gè)節(jié)點(diǎn)上執(zhí)行下面的命令(注意替換節(jié)點(diǎn)的IP地址)。
$ kubectl exec -it jumpbox /usr/bin/scp /tmp/harborca/harbor.crt vmware-system-user@10.244.1.2:/tmp/harbor.crt
$ kubectl exec -it jumpbox /usr/bin/ssh vmware-system-user@10.244.1.2 'sudo bash -c \
"cat /tmp/harbor.crt >> /etc/pki/tls/certs/ca-bundle.crt"'
$ kubectl exec -it jumpbox /usr/bin/ssh vmware-system-user@10.244.1.2 'sudo systemctl restart docker.service'
10、文中第五大步第7小步需要ingress和egress連接公網(wǎng)以Tanzu集群管理員的身份登錄。(詳細(xì)步驟請(qǐng)參考vSphere with Kubernetes實(shí)戰(zhàn)之:用戶訪問控制)
11、在Tanzu的命名空間里(你想要部署應(yīng)用的命名空間)創(chuàng)建一個(gè)映像拉取的secret,例如在下面的例子中,我們在default命名空間里創(chuàng)建了一個(gè)名為“externalimagepull”的secret(你可以任意選擇其他的名稱)。”–docker-server”指向你的Harbor地址;最后還需要提供登錄Harbor的用戶名和密碼。
$ kubectl -n default create secret docker-registry externalimgpull --docker-server=10.147.18.2 \
--docker-username=YourName --docker-password=YourPasswd
secret/externalimgpull created
12、在一些客戶環(huán)境,在做vsphere with kubernetes測試時(shí),ingress個(gè)egress不能連接公網(wǎng),這樣用于ssh到tanzu集群節(jié)點(diǎn)的jumpbox無法從公網(wǎng)拉取photon鏡像。此時(shí),我們需要從公網(wǎng)拉取photon鏡像并裝上ssh工具,把鏡像打包上傳至harbor,讓jumpbox拉取harbor中的photon鏡像作為ssh到tanzu集群節(jié)點(diǎn)的跳板機(jī),F(xiàn)在可以在Tanzu集群上的命名空間(本例中為default)部署Pod或Deployment,將剛才創(chuàng)建的secret應(yīng)用到部署文件中去:
$ more nginx-harbor.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: nginx
image: 10.147.18.2/wangyu/nginx:latest
ports:
- containerPort: 80
imagePullSecrets:
- name: externalimgpull
13、從公網(wǎng)拉取photon鏡像設(shè)置完成后可以刪除跳板機(jī)。
總結(jié)
在各種開發(fā)部署的環(huán)境下,一般的映像注冊表都會(huì)使用自簽名的證書。如果是在Supervisor集群中使用vSphere with Kubernetes內(nèi)置的harbor,那比較簡單,基本上不需要做任何額外的配置。但是如果想在Tanzu集群中也使用內(nèi)置或者外置的映像注冊表,就需要按照本文描述的一步步操作來完成這些任務(wù)。