docker 镜像管理之 overlay2 最佳实践 中介绍了 image 的底层逻辑联合文件系统和分层结构。
image 存储在 registry 中,对于不同平台使用 registry 的策略有所区别。本文基于 RedHat 的 OpenShift 平台,对 registry 做概述。大致介绍 openshift registry 的框架,详细了解可以参考:OpenShift Container Platform 4.9 Documentation。
在 OpenShfit(OCP,Openshift Container Platform) 集群外执行 kubectl get route
以获取 openshift-image-registry namespace 下的 route:
[root@chunqiu ~]# kubectl get route -n openshift-image-registry --kubeconfig config NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD default-route default-route-openshift-image-registry.apps image-registry <all> reencrypt None
其中,kubeconfig 选项的参数指定要访问的 OCP 集群,通过该配置完成集群的认证,鉴权。这里是在远端执行的访问操作,所以 kubeconfig 是需要的。
为什么查看 image registry 需要先看路由呢?接着往下看:
[root@chunqiu ~]# kubectl describe route default-route -n openshift-image-registry --kubeconfig config Name: default-route Namespace: openshift-image-registry Kind: Route Spec: Host: default-route-openshift-image-registry.apps Tls: Termination: reencrypt To: Kind: Service Name: image-registry Weight: 100 Wildcard Policy: None Status: Ingress: Conditions: Last Transition Time: 2021-09-18T02:16:01Z Status: True Type: Admitted Host: default-route-openshift-image-registry.apps Router Canonical Hostname: router-default.apps Router Name: default ...
route 路由定义了在集群外访问 Host default-route-openshift-image-registry.apps
的流量会转到 image-registry service。
OpenShift 为什么需要 Router 和 Route 详细介绍了 route, 关于 route 的理解可看这里
继续查看 service 绑定的 endpoint 是哪个 pod 的:
[root@chunqiu ~]# kubectl get service -n openshift-image-registry --kubeconfig config NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE image-registry ClusterIP 172.30.0.1 <none> 5000/TCP 91d image-registry-operator ClusterIP None <none> 60000/TCP 95d [root@chunqiu ~]# kubectl describe service image-registry -n openshift-image-registry --kubeconfig config Name: image-registry Namespace: openshift-image-registry Type: ClusterIP IP: 172.30.0.1 Port: 5000-tcp 5000/TCP TargetPort: 5000/TCP Endpoints: 10.128.2.1:5000 [root@chunqiu ~]# kubectl get pods -n openshift-image-registry --kubeconfig config -o wide | grep image-registry cluster-image-registry-operator-6d456994f-djnnl 1/1 Running 12 17d 10.128.0.25 hzngdc-rm17-e1-02-master-00 image-registry-6849cd4476-47kq4 1/1 Running 0 16d 10.128.2.1 hzngdc-rm17-e1-02-worker-13
可以看出,service 绑定的 Endpoint 是 pod image-registry-6849cd4476-47kq4
的 ip 地址,提供 registry 服务的实际上是该 pod。那么 push 的 image 又被存在哪里呢?查看该 pod 的描述:
[root@chunqiu ~]# kubectl describe pods image-registry-6849cd4476-47kq4 -n openshift-image-registry --kubeconfig config Name: image-registry-6849cd4476-47kq4 Namespace: openshift-image-registry Volumes: registry-storage: Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) ClaimName: registry-storage ReadOnly: false [root@chunqiu ~]# kubectl get pvc -n openshift-image-registry --kubeconfig config NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE registry-storage Bound pvc-03631962-4b9e-4913-a505-d732b9378157 120Gi RWO ocs-storagecluster-ceph-rbd 91d
从描述可以看出,提供 image registry 的服务绑定到 pvc registry-storage 上,该 pvc 的容量为 120Gi,push 的 image 将存储在这个 pvc。
至此,基本上这个框架已经清楚了,给出简易流程图如下: