要了解有關vSphere 7的新功能的更多信息,請訪問我們的網(wǎng)站:
https://www.vmware.com/products/vsphere.html。
背景介紹
vSphere with Kubernetes 自帶了一個內(nèi)嵌的映像注冊表(image registry)–Harbor。 大多數(shù)映像注冊表(image registry)都啟用了HTTPS,Harbor也是如此。通常來說在Kubernetes中部署的應用要訪問映像注冊表(GCR,Docker Hub或Harbor),您需要準備兩種憑證:
- 映像注冊表的服務器CA證書。運行映像獲(image fetch)取的組件,需要在它的KeyStore有足夠的信息來驗證注冊表的服務器證書。對于Docker Hub和GCR,應該都沒有問題,因為客戶端系統(tǒng)始終安裝了公共認可的知名根證書來驗證它們所簽名的這些證書。但如果要部署帶有自簽名證書的私有注冊表(例如Harbor),則還有更多設置步驟。
- 訪問映像注冊表的憑證(通常是用戶名和密碼)。公共存儲庫在訪問(pull操作)映像的時候不需要憑據(jù),在上傳或更新(push操作)映像的時候需要。私有注冊表(例如Harbor)在將映像拉取或推送(pull和push)時始終需要憑據(jù)。
在實際部署中,對大多數(shù)映像注冊表的使用可能有多種不同的使用方案。有的在Supervior集群中直接使用內(nèi)置的harbor,有的在Tanzu集群中使用內(nèi)置的Harbor,還有的則需要使用他們企業(yè)內(nèi)部已經(jīng)存在的映像注冊表服務。本文將通過實戰(zhàn)的方式,來一步步展示如何在不同的部署情況下,正確的配置Supervisor和Tanzu集群,才能流暢的訪問映像注冊表的服務。下面的實戰(zhàn)練習需要幾個前提條件:
配置好Supervisor Kubernetes集群。請參考:Config a Supervisor Cluster
創(chuàng)建并配置好Supervisor Kubernetes集群的命名空間。請參考:Configure Supervisor Cluster Namespaces.
下載并安裝好Kubernetes客戶端根據(jù)kubectl和vSphere的插件。請參考:Download and Install the Kubernetes CLI Tools for vSphere
在命名空間里創(chuàng)建一個或多個Tanzu Kubernetes 集群。請參考:How to Create Tanzu Kubernetes Clusters.
如何設置內(nèi)置的映像注冊表。請參考:Enable a private image registry on a Supervisor Cluster。
Docker Client訪問內(nèi)嵌的Harbor
在實際安裝過程中,如果用戶不提供自己的證書,vSphere with Kubernetes會自己生成一個自簽名的證書,內(nèi)嵌的Harbor也使用這個根證書簽發(fā)的證書。因此,Docker客戶端需要將這個證書導入到系統(tǒng)中,才能使用Harbor服務。
1.通過瀏覽器登錄到Harbor界面。選擇你要訪問的Project或者(Namespace)。
2.轉(zhuǎn)到“Repositories”頁,下載注冊表證書
3.將這個證書添加到本機的系統(tǒng)里,例如,在MacOS里需要運行下面的命令(最后的參數(shù)是剛才保存證書的文件路徑):
$ security add-trusted-cert -d -r trustRoot -k ~/Library/Keychains/login.keychain pathtofile/harbor-cert.crt
4.重啟Docker服務
5.通過下面的命令來驗證Docker客戶端和Harbor的集成(下面的例子中10.147.18.2是我的Harbor服務的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服務,例如,創(chuàng)建帶有指向Harbor存儲庫的URL的Pod,我們無需執(zhí)行任何操作即可實現(xiàn)此目的。這是因為,一方面,Harbour Registry和Esxi Spherelet(映像獲取服務所在的地方)共享相同的根證書,因此它們自然彼此信任。另一方面,在Supervisor群集中創(chuàng)建命名空間時會自動創(chuàng)建默認的映像像拉取秘鑰。
從Supervisor集群中訪問內(nèi)置的Harbor
因此這一小節(jié)的目的不是需要您執(zhí)行什么步驟,而是一起來看看系統(tǒng)在創(chuàng)建命名空間的時候,都創(chuàng)建了哪些與映像拉取操作相關的資源和秘鑰。
1、通過kubectl命令,以數(shù)據(jù)中心管理員或者Namespace管理員的身份登錄Supervisor 集群。然后執(zhí)行下面的命令來獲得相關的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、在當前的命名空間里,缺。╠efault)的 Service Account已經(jīng)和這個secret綁定在一起了,因此,當你從Harbor拉取映像的時候,就算你什么都沒有指定,缺省的也會使用了這個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、下面是個在Supervisor集群中使用內(nèi)置Harbor服務來創(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群集訪問這個注冊表需要更多的配置步驟,尤其是您的注冊表服務正在使用自簽名證書。
4、 從Supervisor集群中訪問外部自簽名的Harbor
1.通過kubectl命令,以數(shù)據(jù)中心管理員的身份登錄Supervisor 集群。
2.在命名空間里創(chuàng)建一個映像拉取的secret,例如在下面的例子中,我們創(chuàng)建了一個名為“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這個資源,將剛才下載的證書的內(nèi)容追加到這個資源的證書列表的后面,并且保存。
$ 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應用到部署文件中去:
$ 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、當然,你可以將命名空間里缺省(default)的Service Account和這個映像拉取的secret進行綁定,這樣,在當前命名空間部署Pod或Deployment的時候,就不需要每次在部署文件中指定映像拉取的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
當您想從Tanzu Kubernetes群集訪問私有映像存儲庫時,內(nèi)置的Harbor 注冊表和外部其他注冊表之間沒有什么區(qū)別。因為Tanzu Kubernetes群集既沒有映像拉取秘鑰的默認設置,它們也根本不信任您的私有注冊表(例如Harbor)的自簽名證書。所以要想從Tanzu Kubernetes集群訪問自簽名的注冊表(內(nèi)置或外部),需要更多的步驟來設置證書和憑證。證書的設置相對來說要更加麻煩一些,它需要在Tanzu Kubernetes群集的每一個節(jié)點上(包括所有的Master節(jié)點和Workder節(jié)點),都要加入Harbor自簽名的CA的證書信息,使其信任。下面我們來看看具體的步驟:
- 通過瀏覽器登錄到Harbor界面。選擇你要訪問的Project或者(Namespace)。
- 轉(zhuǎn)到“Repositories”頁,下載注冊表證書并保存到一個文件里,例如crt.
- 通過kubectl命令,以數(shù)據(jù)中心管理員或者Namespace管理員的身份登錄Supervisor 集群
$ kubectl vsphere login --server=10.117.233.1 --vsphere-username administrator@vsphere.local
4、在Tanzu集群所在的Supervisor命名空間里查看秘鑰的信息,可以通過以下命令獲得有關Tanzu集群跟SSH登錄相關的秘鑰信息,記住這個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é)點信息和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的證書導入。
$ kubectl create configmap harborca --from-file=harbor.crt -n wangyu
7、通過kubectl創(chuàng)建一個跳板機,并且將訪問Tanzu集群節(jié)點的秘鑰和Harbor的證書也一起放在跳板機里,就可以方便的將這個證書信息導入到Tanzu集群中的各個節(jié)點里。
$ 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)境下,一般的映像注冊表都會使用自簽名的證書。如果是在Supervisor集群中使用vSphere with Kubernetes內(nèi)置的harbor,那比較簡單,基本上不需要做任何額外的配置。但是如果想在Tanzu集群中也使用內(nèi)置或者外置的映像注冊表,就需要按照本文描述的一步步操作來完成這些任務。通過瀏覽器登錄到Harbor界面。選擇你要訪問的Project或者(Namespace)。在當前的命名空間里部署這個跳板機。
$ kubectl apply -f jumpbox.yaml -n wangyu
pod/jumpbox created
9、JiaMing的評論:并且在每個節(jié)點上執(zhí)行下面的命令(注意替換節(jié)點的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集群管理員的身份登錄。(詳細步驟請參考vSphere with Kubernetes實戰(zhàn)之:用戶訪問控制)
11、在Tanzu的命名空間里(你想要部署應用的命名空間)創(chuàng)建一個映像拉取的secret,例如在下面的例子中,我們在default命名空間里創(chuàng)建了一個名為“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測試時,ingress個egress不能連接公網(wǎng),這樣用于ssh到tanzu集群節(jié)點的jumpbox無法從公網(wǎng)拉取photon鏡像。此時,我們需要從公網(wǎng)拉取photon鏡像并裝上ssh工具,把鏡像打包上傳至harbor,讓jumpbox拉取harbor中的photon鏡像作為ssh到tanzu集群節(jié)點的跳板機,F(xiàn)在可以在Tanzu集群上的命名空間(本例中為default)部署Pod或Deployment,將剛才創(chuàng)建的secret應用到部署文件中去:
$ 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鏡像設置完成后可以刪除跳板機。
總結(jié)
在各種開發(fā)部署的環(huán)境下,一般的映像注冊表都會使用自簽名的證書。如果是在Supervisor集群中使用vSphere with Kubernetes內(nèi)置的harbor,那比較簡單,基本上不需要做任何額外的配置。但是如果想在Tanzu集群中也使用內(nèi)置或者外置的映像注冊表,就需要按照本文描述的一步步操作來完成這些任務。