• <strike id="fdgpu"><input id="fdgpu"></input></strike>
    <label id="fdgpu"></label>
    <s id="fdgpu"><code id="fdgpu"></code></s>

  • <label id="fdgpu"></label>
  • <span id="fdgpu"><u id="fdgpu"></u></span>

    <s id="fdgpu"><sub id="fdgpu"></sub></s>
    您當(dāng)前的位置是:  首頁 > 資訊 > 文章精選 >
     首頁 > 資訊 > 文章精選 >

    vSphere with Kubernetes實(shí)戰(zhàn)之:訪問映像注冊表

    2020-08-06 11:03:06   作者:   來源:CTI論壇   評論:0  點(diǎn)擊:


      VMware 在2020年4月2日發(fā)布了vSphere 7.0的正式版。這個版本的vSphere最顯著的特性之一是它在hypervisor層內(nèi)部創(chuàng)建了Kubernetes控制平面。該功能使vSphere大大擴(kuò)展了它所能運(yùn)行的工作負(fù)載范圍,涵蓋了更多當(dāng)前流行的應(yīng)用程序。我們將此功能之前稱為“ Project Pacific”或WCP(工作負(fù)載控制平面),現(xiàn)在的正式名稱是“vSphere with Kubernetes”。
      要了解有關(guān)vSphere 7的新功能的更多信息,請?jiān)L問我們的網(wǎng)站:
      https://www.vmware.com/products/vsphere.html。
      背景介紹
      vSphere with Kubernetes 自帶了一個內(nèi)嵌的映像注冊表(image registry)–Harbor。 大多數(shù)映像注冊表(image registry)都啟用了HTTPS,Harbor也是如此。通常來說在Kubernetes中部署的應(yīng)用要訪問映像注冊表(GCR,Docker Hub或Harbor),您需要準(zhǔn)備兩種憑證:
    1. 映像注冊表的服務(wù)器CA證書。運(yùn)行映像獲(image fetch)取的組件,需要在它的KeyStore有足夠的信息來驗(yàn)證注冊表的服務(wù)器證書。對于Docker Hub和GCR,應(yīng)該都沒有問題,因?yàn)榭蛻舳讼到y(tǒng)始終安裝了公共認(rèn)可的知名根證書來驗(yàn)證它們所簽名的這些證書。但如果要部署帶有自簽名證書的私有注冊表(例如Harbor),則還有更多設(shè)置步驟。
    2. 訪問映像注冊表的憑證(通常是用戶名和密碼)。公共存儲庫在訪問(pull操作)映像的時(shí)候不需要憑據(jù),在上傳或更新(push操作)映像的時(shí)候需要。私有注冊表(例如Harbor)在將映像拉取或推送(pull和push)時(shí)始終需要憑據(jù)。
      在實(shí)際部署中,對大多數(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í)需要幾個前提條件:
      配置好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.
      如何設(shè)置內(nèi)置的映像注冊表。請參考:Enable a private image registry on a Supervisor Cluster。
      Docker Client訪問內(nèi)嵌的Harbor
      在實(shí)際安裝過程中,如果用戶不提供自己的證書,vSphere with Kubernetes會自己生成一個自簽名的證書,內(nèi)嵌的Harbor也使用這個根證書簽發(fā)的證書。因此,Docker客戶端需要將這個證書導(dǎo)入到系統(tǒng)中,才能使用Harbor服務(wù)。
      1.通過瀏覽器登錄到Harbor界面。選擇你要訪問的Project或者(Namespace)。
      2.轉(zhuǎn)到“Repositories”頁,下載注冊表證書
      3.將這個證書添加到本機(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存儲庫的URL的Pod,我們無需執(zhí)行任何操作即可實(shí)現(xiàn)此目的。這是因?yàn)椋环矫妫琀arbour Registry和Esxi Spherelet(映像獲取服務(wù)所在的地方)共享相同的根證書,因此它們自然彼此信任。另一方面,在Supervisor群集中創(chuàng)建命名空間時(shí)會自動創(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)前的命名空間里,缺省(default)的 Service Account已經(jīng)和這個secret綁定在一起了,因此,當(dāng)你從Harbor拉取映像的時(shí)候,就算你什么都沒有指定,缺省的也會使用了這個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服務(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群集訪問這個注冊表需要更多的配置步驟,尤其是您的注冊表服務(wù)正在使用自簽名證書。
      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應(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)然,你可以將命名空間里缺省(default)的Service Account和這個映像拉取的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群集訪問私有映像存儲庫時(shí),內(nèi)置的Harbor 注冊表和外部其他注冊表之間沒有什么區(qū)別。因?yàn)門anzu Kubernetes群集既沒有映像拉取秘鑰的默認(rèn)設(shè)置,它們也根本不信任您的私有注冊表(例如Harbor)的自簽名證書。所以要想從Tanzu Kubernetes集群訪問自簽名的注冊表(內(nèi)置或外部),需要更多的步驟來設(shè)置證書和憑證。證書的設(shè)置相對來說要更加麻煩一些,它需要在Tanzu Kubernetes群集的每一個節(jié)點(diǎn)上(包括所有的Master節(jié)點(diǎn)和Workder節(jié)點(diǎn)),都要加入Harbor自簽名的CA的證書信息,使其信任。下面我們來看看具體的步驟:
    1. 通過瀏覽器登錄到Harbor界面。選擇你要訪問的Project或者(Namespace)。
    2. 轉(zhuǎn)到“Repositories”頁,下載注冊表證書并保存到一個文件里,例如crt.
    3. 通過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)的秘鑰信息,記住這個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)建一個跳板機(jī),并且將訪問Tanzu集群節(jié)點(diǎn)的秘鑰和Harbor的證書也一起放在跳板機(jī)里,就可以方便的將這個證書信息導(dǎo)入到Tanzu集群中的各個節(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)境下,一般的映像注冊表都會使用自簽名的證書。如果是在Supervisor集群中使用vSphere with Kubernetes內(nèi)置的harbor,那比較簡單,基本上不需要做任何額外的配置。但是如果想在Tanzu集群中也使用內(nèi)置或者外置的映像注冊表,就需要按照本文描述的一步步操作來完成這些任務(wù)。通過瀏覽器登錄到Harbor界面。選擇你要訪問的Project或者(Namespace)。在當(dāng)前的命名空間里部署這個跳板機(jī)。
      $ kubectl apply -f jumpbox.yaml -n wangyu
      pod/jumpbox created
      9、JiaMing的評論:并且在每個節(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ì)步驟請參考vSphere with Kubernetes實(shí)戰(zhàn)之:用戶訪問控制)
      11、在Tanzu的命名空間里(你想要部署應(yīng)用的命名空間)創(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測試時(shí),ingress個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ī)。現(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)境下,一般的映像注冊表都會使用自簽名的證書。如果是在Supervisor集群中使用vSphere with Kubernetes內(nèi)置的harbor,那比較簡單,基本上不需要做任何額外的配置。但是如果想在Tanzu集群中也使用內(nèi)置或者外置的映像注冊表,就需要按照本文描述的一步步操作來完成這些任務(wù)。
    【免責(zé)聲明】本文僅代表作者本人觀點(diǎn),與CTI論壇無關(guān)。CTI論壇對文中陳述、觀點(diǎn)判斷保持中立,不對所包含內(nèi)容的準(zhǔn)確性、可靠性或完整性提供任何明示或暗示的保證。請讀者僅作參考,并請自行承擔(dān)全部責(zé)任。

    相關(guān)熱詞搜索: VMware

    上一篇:為大流行后的靈活性做好準(zhǔn)備

    下一篇:最后一頁

    專題

    CTI論壇會員企業(yè)

    亚洲精品网站在线观看不卡无广告,国产a不卡片精品免费观看,欧美亚洲一区二区三区在线,国产一区二区三区日韩 泰兴市| 肇州县| 宣城市| 陆河县| 衡南县| 崇礼县| 麻江县| 哈尔滨市| 乌鲁木齐市| 九寨沟县| 法库县| 蒙山县| 环江| 保德县| 台山市| 平武县| 和田县| 丰台区| 额济纳旗| 诏安县| 海城市| 瑞丽市| 三亚市| 桦南县| 柏乡县| 裕民县| 双桥区| 威海市| 裕民县| 德化县| 安远县| 叶城县| 成武县| 黄平县| 仲巴县| 乳源| 朝阳市| 天峨县| 延长县| 颍上县| 荔浦县| http://444 http://444 http://444 http://444 http://444 http://444