神龙摆尾:远程Push镜像到OCP内部仓库并部署
一. 概述
在很多场景中,镜像需要在不同的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)在集群中完成上传镜像的部署
下面将按上述步骤完成配置。
默认情况下,集群安装完成之后,已经为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 registryOCP集群内部通过docker registry的svc名称发布镜像,而svs名称的仓库通过HTTP访问,这里需要添加insecure
修改集群中所有节点docker配置文件,确保OPTIONS参数中包含–insecure-registry 172.30.0.0/16
# vi /etc/sysconfig/docker3. 创建sa并赋予适当的权限
......
OPTIONS=' --insecure-registry 172.30.0.0/16 '
......
# systemctl restart docker
为了从远端访问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=pull5. 准备本地测试镜像,配置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:latest6. 在集群中完成上传镜像的部署
# docker push docker-registry-default.apps.coding.com/registry-test/busybox:latest
在镜像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内部镜像仓库中,并完成镜像发布。主要用与生产环境中使用内部仓库发布应用。
- git实现自动化部署,同时push到多个远程仓库
- eclipse整合maven、git。eclipse创建maven项目然后创建本地git仓库并push到git远程仓库(github、gitlab、腾讯git、阿里git、公司内部git)
- 使用Jib构建镜像push到阿里云镜像仓库并部署
- 创建局域网内远程git仓库,并将本地仓库push推到远程仓库中
- 教你如何在中国区加速部署k8s,且实现自定义设置拥有k8s镜像的仓库与其命名空间
- 容器镜像仓库Harbor安装部署及简单使用
- 使用Dockerfile构建镜像并push到私有仓库
- Maven部署构件至远程仓库
- 微服务与Docker的整合与测试 Eclipse与GitHub的整合——本地Git仓库中的代码push至GitHub 微服务的手动与自动部署(Jenkins自动部署)
- MacOS使用git push命令无法上传到远程仓库解决方法
- docker 镜像仓库 Harbor 部署、 跨数据复制、升级
- git部署远程仓库
- 巧用Docker镜像仓库Harbor部署私有Mirror服务
- CentOS7 Docker 开启远程端口及Maven 打包Push镜像
- IDEA/Git 设置多个push远程仓库或者同时提交多个push仓库
- 【Git学习笔记】将标签push到远程仓库
- git push :推送本地更改到远程仓库的三种模式
- maven详解-坐标-本地仓库-远程仓库-镜像仓库
- git push github 远程仓库 要求每次输入账号密码问题
- MyEclipse使用Egit插件实现PUSH本地代码库到远程仓库