您的位置:首页 > 其它

神龙摆尾:远程Push镜像到OCP内部仓库并部署

2020-12-21 21:24 841 查看

一. 概述

  在很多场景中,镜像需要在不同的OpenShift环境之间流转。如下为两个常用场景:
示例一:在SDLC间流转镜像
OpenShift部署会分为非生产环境和生产环境,实现将非生产的镜像同步到生产镜像仓库中,如下图所示。

示例二:在多个Geos Cluster之间流转镜像
OpenShift可能部署在任何地方,如跨越不同地区的私有云,公有云。用户想要在任何地方都能够低延迟的获取应用镜像,需要在Geo集群之间传递镜像,如下图所示。

在这两个场景中都会将镜像push到内部镜像仓库,并使用内部仓库在集群中发布应用。

二. 实践过程

本示例中使用OCP 3.7版本。通过内部镜像仓库的外部域名推送镜像,并使用内部仓库部署应用。
在配置过程分为如下步骤:
1)暴露内部仓库对外可访问
2)配置Docker daemon允许访问internal registry
3)创建sa并赋予适当的权限
4)创建测试project和docker pull secret
5)准备本地测试镜像,配置push端,推送镜像
6)在集群中完成上传镜像的部署
下面将按上述步骤完成配置。

1. 暴露内部仓库对外可访问

默认情况下,集群安装完成之后,已经为docker-registry创建了route对象,在早期版本中,未暴露docker-registry的对外访问,可参考链接https://docs.openshift.com/container-platform/3.7/install_config/registry/securing_and_exposing_registry.html完成配置。
获取docker-registry的域名

# oc get route/docker-registry -n default
NAME              HOST/PORT                                 PATH      SERVICES          PORT      TERMINATION   WILDCARD
docker-registry   docker-registry-default.apps.coding.com             docker-registry   <all>     passthrough   None

我们的docker registry域名为docker-registry-default.apps.coding.com,在推送镜像和配置docker daemon时会用到该域名。

2. 配置Docker daemon允许访问internal registry

OCP集群内部通过docker registry的svc名称发布镜像,而svs名称的仓库通过HTTP访问,这里需要添加insecure
修改集群中所有节点docker配置文件,确保OPTIONS参数中包含–insecure-registry 172.30.0.0/16

# vi /etc/sysconfig/docker
......
OPTIONS=' --insecure-registry 172.30.0.0/16 '
......
# systemctl restart docker
3. 创建sa并赋予适当的权限

为了从远端访问OCP内部镜像仓库,我们需要提供访问的证书,证书可以是普通用户的token或者是serviceaccount的token,因为普通用户的token会过期,对于自动化的方式建议使用serviceaccount的token完成。
你可以使用每个project下的serviceaccount:builder或者自己建立serviceaccount,我们使用集群management-infra project下的serviceaccount:management-admin来实现镜像的push和pull。
对management-admin赋予全局的image-builder角色

# oc adm policy add-cluster-role-to-user system:image-builder system:serviceaccount:management-infra:management-admin

获取token

# oc sa get-token management-admin -n management-infra    
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNj
b3VudC9uYW1lc3BhY2UiOiJtYW5hZ2VtZW50LWluZnJhIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6Im1hbmFnZW1lb
nQtYWRtaW4tdG9rZW4tZng1NTkiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoibWFuYWdlbWVudC1hZG
1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjAyMWRlZmU1LWU3OWUtMTFlNy1hMjg1LTAwMGMyOWR
lZmM5NSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDptYW5hZ2VtZW50LWluZnJhOm1hbmFnZW1lbnQtYWRtaW4ifQ.Cslz12gy87xgtxv4up3mv
NCczVDjhZkqB9kaRB5s668r3m-RO-h0BMbrE4XZjfZa4Qe8UpeYQ22k1SBqhSkKaeazU2eHRbPsXf-hiUjfo5JiIqeh7eUmLjZy30gt_zR-pF1SdxnQdw
3N3B023mYf8jSICi2AERMfWY3t6T2G9hAHI-JWwc1ozIhqsyQFbPC-DMFbHioVNOUeW5EC-RlvrKrQS7ynxSj8fZtVlKnrukk3vsY4QTzsNwT-guay7SX
PgrD768bMhNM-83F31bW0-Al9_lWUtRZuz417W6ezL5XN_KlAUAlcP5xUEWhO6dWEnSJQmvkzD_stlz1zMlmTxg
我们将token赋予变量<registry-token>,方便在后面引用。

token将会在后面push镜像和生成docker pull secret时使用。

4. 创建测试project和docker pull secret

在ocp创建测试项目或者直接将镜像push到openshift项目。

# oc new-project registry-test

创建docker pull secret并添加到serviceaccount default中

# oc secrets new-dockercfg private-registry --docker-server=docker-registry-default.apps.coding.com --docker-username=management-admin --docker-password=${registry-token} --docker-email=abc@example.com

将docker pull secret添加到serviceaccount:default

# oc secrets link sa/default secret/private-registry --for=pull
5. 准备本地测试镜像,配置push端,推送镜像

我们使用busybox:latest作为测试镜像,下面配置push的机器可以远程推送镜像到内部仓库。或者配置jenkins机器完成push镜像。
默认内部镜像仓库使用HTTPS协议访问,我们需要同步ocp证书到push镜像的机器

# mkdir /etc/docker/certs.d/docker-registry-default.apps.coding.com
# scp root@<master_ip>:/etc/origin/master/ca.crt /etc/docker/certs.d/docker-registry-default.apps.coding.com/ca.crt

配置镜像仓库的域名解析,如果有DNS解析则不要配置本地解析

# vi /etc/hosts
<router_ip或router_lb_ip> docker-registry-default.apps.coding.com

push服务器登录内部镜像仓库

# docker login -u management-admin  -p ${registry-token} docker-registry-default.apps.coding.com

重新tag镜像并推送

# docker tag docker.io/busybox:latest docker-registry-default.apps.coding.com/registry-test/busybox:latest
# docker push docker-registry-default.apps.coding.com/registry-test/busybox:latest
6. 在集群中完成上传镜像的部署

在镜像push成功之后会在project下自动创建is

# oc get is 
NAME      DOCKER REPO                                              TAGS      UPDATED
busybox   docker-registry.default.svc:5000/registry-test/busybox   latest    5 hours ago

使用如下文件发布镜像

# cat busybox-pod.yaml
apiVersion: v1
kind: Pod
metadata:
 name: busybox
spec:
 containers:
 - image: docker-registry.default.svc:5000/registry-test/busybox:latest
   command:
     - sleep
     - "3600"
   imagePullPolicy: IfNotPresent
   name: busybox
 restartPolicy: Always

查看镜像状态

# oc get pods
NAME      READY     STATUS    RESTARTS   AGE
busybox   1/1       Running   0          45m

通过本文实现了远程推动镜像到ocp内部镜像仓库中,并完成镜像发布。主要用与生产环境中使用内部仓库发布应用。




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: