在使用公有云镜像仓库的时候,我们总有一种需要,即把命名空间或者仓库分配给不同的子账号,让子账号能够管理。那么在阿里云上是如何做到的呢?本文就先实践一下。

一、首先通过ram控制台创建一个子账号

阿里镜像仓库 python 阿里镜像仓库 授权RAM_java

二、创建好子账号以后我们用子账号登录控制台

阿里镜像仓库 python 阿里镜像仓库 授权RAM_运维_02


第一次会要求我们创建仓库密码,这个密码就是我们登录仓库拉取镜像的凭证

阿里镜像仓库 python 阿里镜像仓库 授权RAM_运维_03


但是我们会发现用子账号登录之后完全看不到我们的主账号的命名空间,那么要怎么做才能看到呢?

三、首先我们说说镜像服务的构成

1.代码源

阿里镜像仓库 python 阿里镜像仓库 授权RAM_阿里镜像仓库 python_04


在这里主要是绑定代码仓库,代码仓库对镜像仓库授权之后,镜像仓库能拉取到代码,这里的代码主要是dockerfile

用于构建镜像

2.命名空间

阿里镜像仓库 python 阿里镜像仓库 授权RAM_命名空间_05


这里我们理解成项目,比如我可以创建product pre-product dev 作为线上、预发布、开发环境的命名空间

命名空间没有地域区分

3.镜像仓库

阿里镜像仓库 python 阿里镜像仓库 授权RAM_php_06


镜像仓库就是存放我们镜像的地方了,比如我们可以在product线上环境的命名空间下创建

nginx apache tomcat php nodejs java 等镜像用于构建服务,如果有版本的区别,比如我线上的nodejs镜像有需要node8和node6,怎么办呢? 这个时候我们可以通过tag来加以区别,通过修改dockerfile,保存两个版本的nodejs的镜像在仓库里面,在k8s部署时候根据tag取不同版本的基础环境作为无状态服务。

注意:仓库是有地域区分的,在香港创建的仓库在北京是地域下是看不到的哈,如果有人说仓库被阿里云删了,请一定要看看自己是不是选错地域了???

四、授权

1.假如我要子账号登录 Registry后 pull所有该命名空间下的镜像,可以通过OpenAPI 查看到该命名空间的信息及该命名空间下所有镜像仓库的相关信息

{
  "Statement": [
    {
      "Action": [
        "cr:Get*",
        "cr:List*",
        "cr:PullRepository"
      ],
      "Effect": "Allow",
      "Resource": [
        "acs:cr:*:*:repository/alitest1/*"
      ]
    }
  ],
  "Version": "1"
}

权限分配

阿里镜像仓库 python 阿里镜像仓库 授权RAM_阿里镜像仓库 python_07

2.但是这个时候还是看不到的哈,如果我们想看到命名空间,要加对alitest1命名空间加以下规则才能看到

{
  "Statement": [
    {
      "Action": [
        "cr:Get*",
        "cr:List*",
        "cr:PullRepository"
      ],
      "Effect": "Allow",
      "Resource": [
        "acs:cr:*:*:repository/alitest1/*"  #这个表示对alitest1命名空间给权限,如果要具体到某个仓库 * 换成仓库名
      ]
    },
    {
      "Action": [
        "cr:ListNamespace",
        "cr:ListRepository"
      ],
      "Effect": "Allow",
      "Resource": [
        "*"
      ]
    }
  ],
  "Version": "1"
}

授权之后我能看到所有命名空间,但是只能对被授权的命名空间进行管理

子账号登录控制台后就能和主站号一样看到所有的命名空间了

阿里镜像仓库 python 阿里镜像仓库 授权RAM_阿里镜像仓库 python_08

但是请注意 我们只能对alitest1进行操作 因为只有alitest1的授权

五、使用子账号进行pull和push

1.下面进行测试,先推送到镜像仓库
请参考此文档:
https://help.aliyun.com/document_detail/67992.html?spm=5176.8351553.0.0.4b2519911tzA7e鉴权action:
cr:PushRepository
我现在要把一个busybox推送到阿里云镜像仓库下去
鉴权对象:
命名空间:alitest1
镜像仓库:test
完整鉴权规则:

{
  "Statement": [
    {
      "Action": [
        "cr:*"
      ],
      "Effect": "Allow",
      "Resource": [
        "acs:cr:cn-hongkong:*:repository/alitest1/test"
      ]
    },
    {
      "Action": [
        "cr:Get*",
        "cr:List*",
        "cr:PushRepository"  
      ],
      "Effect": "Allow",
      "Resource": [
        "acs:cr:*:*:repository/alitest1"
      ]
    }
  ],
  "Version": "1"
}

阿里镜像仓库 python 阿里镜像仓库 授权RAM_命名空间_09

推送测试:

先在节点上登录仓库,很多人access denied的原因就是没登录成功

阿里镜像仓库 python 阿里镜像仓库 授权RAM_命名空间_10

阿里镜像仓库 python 阿里镜像仓库 授权RAM_java_11


完整过程:

阿里镜像仓库 python 阿里镜像仓库 授权RAM_命名空间_12


如果大家不晓得怎么推送,控制台已经给出了命令

阿里镜像仓库 python 阿里镜像仓库 授权RAM_java_13

最后一步,控制台验证:

阿里镜像仓库 python 阿里镜像仓库 授权RAM_阿里镜像仓库 python_14