LAIN Registry 组件在 LAIN 中主要用于镜像存储,集群中所有的镜像都由 LAIN Registry 组件提供及存储。关于 Registry 的官方具体描述可以参见这里。
LAIN Registry 组件在 Docker Registry 版本的基础上进行了 LAIN 化。SA 可以在 etcd 中进行一些配置,以更新 Registry 相应的设置,包括后端存储、Auth设置等。LAIN Registry 组件默认使用本地磁盘作为存储后端,默认不使用 Auth。
LAIN Registry 的组件架构图如下所示:
在启动 LAIN Registry Container 时,会从 etcd 中读取一些配置,然后以这些配置为基础结合提供的 config.yml 文件运行 Registry。
默认情况下组件会将镜像存放在本地磁盘的 /var/lib/registry
目录下(LAIN bootstrap 时设置),也可以通过配置 moosfs 等来实现集群分布式存储;
默认情况下组件不开启 Auth,但是 LAIN 中也提供了 Registry 的 auth server,即 LAIN Console,可以在 etcd 中设置相应的 Auth 信息,LAIN 中使用的 Registry Auth 方式遵照官方实现,具体可以参见这里
集群中由 LAIN Console 作为 LAIN Registry 的 auth server,API为api/v1/authorize/registry/
-
首先在 etcd 中设置:
etcdctl set /lain/config/auth/registry '{"realm":"http://console.<domain>/api/v1/authorize/registry/", "issuer":"auth server", "service":"<domain>"}'
其中的参数对应如下,详细介绍可以参考这里:
realm: 提供 registry auth 的地址
issuer: auth server 与 registry 之间约定的 issuer
service: 在 LAIN 中设置为当前集群域名
-
重启 registry 容器
-
etcdctl rm /lain/config/auth/registry
-
重启 registry 容器
对于storage配置的修改需要进行如下操作:
-
docker-enter registry container; 修改对应的config.yaml;
-
重启registry
#Example:
version: 0.1
log:
level: debug
fields:
service: registry
environment: development
storage:
cache:
layerinfo: inmemory
s3:
accesskey: ABCDEFGHIJ0123456789
secretkey: AB12C3dE4fGhIvmMB4TZrpypR0rOJ2G5WhGUPn9L
region: us-west-1 #important if use amazon filesystem
regionendpoint: http://s3.domain.svc #optional endpoints
bucket: test
secure: true
v4auth: true
chunksize: 5242880
rootdirectory: /registry
maintenance:
uploadpurging:
enabled: false
http:
addr: :5000
secret: asecretforlocaldevelopment
auth:
token:
realm: https://console.domain/api/v1/authorize/registry/
issuer: "auth server"
service: "lain.local"
rootcertbundle: /lain/app/auth/server.pem
storage:
oss:
accesskeyid: ABCDEFGHIJ0123456789 #accesskeyid
accesskeysecret: AB12C3dE4fGhIvmMB4TZrpypR0rOJ2G5WhGUPn9L #accesskeysecret
region: oss-cn-beijing #OSS region name
endpoint: http://s3.domain.svc #optional endpoints
internal: optional internal endpoint
bucket: test #OSS bucket
encrypt: false #optional data encryption setting
secure: false #optional ssl setting
chunksize: 5242880 #optional size valye
rootdirectory: /registry #optional root directory
当config.yaml有问题时,重启时registry无法正常启动,需要进行如下操作:
-
docker rm registry;
-
等待deploy重新拉起registry再进行修改
在修改config.yaml时,最好先测试然后再重启registry。
storage:
delete:
enabled: true
compatibility: # see issue https://github.com/docker/distribution/issues/1661
schema1:
disablesignaturestore: true
- curl -X DELETE /v2/{repo}/manifests/{digest} # 调用registry api 删除指定digest的image
- registry garbage-collect config.yaml # 在registry节点清理被标记删除的layer及manifest
registry 清理最好是在 read-only 状态下进行清理工作,也就是在 gc 的时候不要 push image
registry 在 LAIN 集群中有特殊作用,不能按照普通 LAIN 应用的流程升级。在升级之前, 请先手动运行一个容器,并手动更改 webrouter 里 registry 的配置:
docker run -it -v /var/lib/registry:/var/lib/registry registry.lain.local/registry:release-1472106576-30f4071d4bdc3ed6d0cb3c34ea9047ec6c098e57 bash
[root@09dd3a17b25f app]# /lain/app/entry.sh
# 进入 webrouter 容器,手动将 /etc/nginx/upstream/registry.upstreams 的 server IP 改为上面容器的 IP
这是因为升级 registry 时,console 先把老版本的杀死,再起新版本的 registry;启动新版 registry 时需要 先拉取镜像,而这时已经没有可用的 registry 了。所以需要手动起一个 registry。
然后升级:
cd ${registry-project}
lain build
lain tag ${lain-cluster}
lain push ${lain-cluster}
lain deploy ${lain-cluster}
确定 LAIN 集群拉起的 registry 可用后,就可以删除手动启动的 registry 容器了。