天天看點

使用Rest api管理Ceph網關

背景

  開發基于Ceph RadosGW的微服務,需要實作調用方可以通過rest api就能建立使用者,擷取使用者資訊等功能。

實作

  Ceph的RadosGW自身就有該功能,這些建立使用者、擷取使用者資訊、擷取使用情況等的功能被稱為Admin Operation(管理操作)。我們直接通過RadosGW的URL再加上/admin就可以通路執行管理操作了,比如RadosGW的URL為http://192.168.1.2:8080,那麼管理操作的URL就是http://192.168.1.2:8080/admin。

  管理操作的授權和S3的授權機制一樣,隻是建立S3使用者之後,需要再給響應的使用者附上管理權限。如下,我們會建立一個有管理權限的使用者。

  在Ceph叢集中執行以下語句(當然,你可以換上你需要的使用者名和key):

$ sudo radosgw-admin user create --uid="my_s3_user" --display-name="my_user_display_name" --access-key="my_admin_access_key" --secret-key="my_admin_secret_key"
$ sudo radosgw-admin --id admin caps add --caps="buckets=*;users=*;usage=*;metadata=*" --uid="my_s3_user"
           

  如上,便建立了一個擁有管理權限的使用者,接下來就可以使用官網提供的api(點選浏覽)來使用了。

  另外,如果不想直接使用Rest api,也可以使用一些封裝好的第三方庫。這裡,介紹一個Java的第三方庫(點選浏覽),也正是我現在正使用的一個庫。

  以下的示例代碼,建立了一個S3使用者,擷取了S3證書,并設定了配額。

private static void testRadosAdmin() {
        String accessKey = "my_admin_access_key";
        String secretKey = "my_admin_secret_key";
        String adminEndpoint = "http://109.105.115.102:7480/admin";
        RgwAdmin rgwAdmin = new RgwAdminBuilder().accessKey(accessKey).secretKey(secretKey).endpoint(adminEndpoint)
                .build();

        String userId = "8eeb3bb0-eda0-48f9-a18f-c04daecb5e69";
        User user = null;
        // create a user
        user = rgwAdmin.createUser(userId);
        if (user != null) {
            // get user S3Credential
            for (S3Credential credential : user.getS3Credentials()) {
                System.out.println("userid: " + credential.getUserId() + ",getAccessKey: " + credential.getAccessKey()
                        + ", getSecretKey: " + credential.getSecretKey());
            }

            // set user quota, such as maxObjects and maxSize(KB)
            rgwAdmin.setUserQuota(userId, ,  *  * );

            Optional<Quota> quota = rgwAdmin.getUserQuota(userId);
            if (quota.isPresent()) {
                System.out.println("quota KB: " + quota.get().getMaxSizeKb());
            }
        } else {
            System.out.println("create user failed");
        }
    }