LAIN Registry
组件描述
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 方式遵照官方实现,具体可以参见这里
使用方法
Auth 设置
集群中由 LAIN Console 作为 LAIN Registry 的 auth server,API为api/v1/authorize/registry/
Open Auth
-
首先在 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 容器
Close Auth
-
etcdctl rm /lain/config/auth/registry -
重启 registry 容器
储存后端设置
对于storage配置的修改需要进行如下操作:
-
docker-enter registry container; 修改对应的config.yaml;
-
重启registry
对于S3支持:
#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
对于OSS支持:
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 容器了。
