1. 使用临时token登录阿里云CR

1
aliyun cr GetAuthorizationToken | jq .data.authorizationToken | tr -d '"' | docker login --username=cr_temp_user --password-stdin registry.cn-hangzhou.aliyuncs.com

2. 获取Kubernetes集群的kuberctl配置文件

1
aliyun cs DescribeClusterUserKubeconfig --ClusterId=c90bf856c68364386a07384a6a2bb176b

3. 使用use-context切换管理多个kubernetes集群

多个集群kubectl配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://192.168.132.236/k8s/clusters/c-8s9dc
name: ng-demo
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://192.168.132.236:6443
name: ng-demo-server01
contexts:
- context:
cluster: ng-demo
user: ng-demo
name: ng-demo
- context:
cluster: ng-demo-server01
user: ng-demo
name: ng-demo-server01
current-context: ng-demo
kind: Config
preferences: {}
users:
- name: ng-demo
user:
token: REDACTED

切换命令如下:

1
2
$ kubectl config use-context ng-demo
Switched to context "ng-demo".

4. 设置OSS生命周期

Terraform目前(2021-3-10)不支持对于分片文件的生命周期, 可以考虑通过阿里云CLI实现.

1
2
3
4
# get and view the bucket lifecycel
aliyun oss lifecycle --method get oss://research-ng-temp
# set the lifecycle
aliyun oss lifecycle --method put oss://research-ng-temp lifecycle.xml

上面命令中的lifecycle.xml如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<LifecycleConfiguration>
<Rule>
<ID>857e37e3-0a3e-4250-a408-88f5b35f9714</ID>
<Prefix></Prefix>
<Status>Enabled</Status>
<Expiration>
<Days>16</Days>
</Expiration>
<AbortMultipartUpload>
<Days>16</Days>
</AbortMultipartUpload>
</Rule>
</LifecycleConfiguration>

5. ICP

  • ICP接入: ICP可以同别的平台迁移到阿里云, 这个过程比在做一次ICP快很多

6. 免费DV证书

阿里云每个实名账号个人或企业主体在一年内可以有20个免费DV证书可以使用, 每个证书仅支持绑定一个具体的域名, 20个的数量可以支持常见的测试和验证需求. 这种证书可以用于:

  • CDN自定义域名
  • SLB启用HTTPS

7. 第三方账号证书导入

阿里云支持上传证书, 可以将一个已经在其他平台和账号的证书上传到阿里云, 操纵步骤:

  • 下载购买证书, 如果在阿里云购买的话, 下载的时候有很多种下载方式, 选择 nginx 下载
    cert download
  • 解压下载文件, 可以获得.pem(certificate)和.key(provide key)文件
  • 上传, 在需要证书的阿里云账号的证书管理控制台, 粘贴复制.pem和.key的内容
  • 使用, 上传完后证书即可以像其他购买的证书一样正常使用, 例如配置OSS自定义域名,代码15和16行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
resource "alicloud_cdn_domain_new" "docker_storage_domain" {
domain_name = local.ng_docker_file_domain
cdn_type = "download"
scope = "domestic"

sources {
content = local.docker_storage_bucket_domain
type = "oss"
port = 443
}

certificate_config {
server_certificate_status = "on"
force_set = 1
cert_name = local.cert_name
cert_type = "upload"
}

tags = {
Name = "${var.stack_name}-docker-storage-domain"
Stack = var.stack_name
}

depends_on = [
alicloud_oss_bucket.docker_storage
]
}

8. KMS

  • 获取Secret版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
ali kms ListSecretVersionIds --SecretName="/stack/research/db_password"                                                   
{
"PageNumber": 1,
"PageSize": 10,
"RequestId": "e9bf3ff1-d3b1-44e1-abef-96416a52cd7d",
"SecretName": "/stack/research/db_password",
"TotalCount": 2,
"VersionIds": {
"VersionId": [
{
"CreateTime": "2021-05-07T02:13:58Z",
"VersionId": "v20210507191252",
"VersionStages": {
"VersionStage": [
"ACSPrevious"
]
}
},
{
"CreateTime": "2021-05-07T02:15:45Z",
"VersionId": "v20210510191252",
"VersionStages": {
"VersionStage": [
"ACSCurrent"
]
}
}
]
}

  • 可以使用VersionStage获取最近的Secret值
    目前值发现两个VersionStage: ACSCurrent/ACSPrevious
1
2
ali kms GetSecretValue --SecretName="/stack/research/db_password" --VersionStage=ACSCurrent
ali kms GetSecretValue --SecretName="/stack/research/db_password" --VersionStage=ACSPrevious
  • 使用Key加密
    keyId可以是id也可以是alias
1
2
ali kms Encrypt --KeyId="8da42b24-f1f7-450b-8ccb-f568b1e555fe" --Plaintext=helloworld
ali kms Encrypt --KeyId=alias/NG-Common --Plaintext=helloworld
  • 解密
1
2
3
4
5
6
7
ali kms Decrypt --CiphertextBlob="ZWZiOTMxMDMtOTUyNi00OGUxLWI5MzEtOTYxZjU0OGUwMWU0T3BDf6PdXvJIHzMKCIxYKr7N3PngT2aS07Rk7TiFx4Me+u0QIMk="
{
"KeyId": "8da42b24-f1f7-450b-8ccb-f568b1e555fe",
"KeyVersionId": "efb93103-9526-48e1-b931-961f548e01e4",
"Plaintext": "helloworld",
"RequestId": "691ce8ec-f5e5-41dd-bc55-d8a06e2d99e2"
}

9. 使用digest拉取Docker镜像

image tag如分支名不能精确代表最新的镜像, 可以使用digest, digest使用时用@而不是, 如下:

1
docker pull registry.cn-hangzhou.aliyuncs.com/ngiq-cr/app_server@sha256:c4e1cbe395d87e4c9d94d831c689e7c01531d457f3d1bbbb83d6f1a698fac8e4

digest如何获取呢? 在阿里云中可以使用GetRepoTag方法:

1
2
3
4
5
6
7
8
9
10
11
aliyun cr GetRepoTag --RepoName=app_server --RepoNamespace=ngiq-cr --Tag=feature-aliyun
{
"data": {
"digest": "7de0f4b43286daef25f2c3ffadb9a78796e9aabde45feb16199528357b731791",
"imageCreate": 1620436982000,
"imageId": "de991a1a65f1eda17878cbb326e39e092d135f60bed068a983f750925ad6ce31",
"imageSize": 346647563,
"imageUpdate": 1620641463000,
"status": "NORMAL",
"tag": "feature-aliyun"
}

配合jq则可以快速获取digest值:

1
aliyun cr GetRepoTag --RepoName=app_server --RepoNamespace=ngiq-cr --Tag=feature-aliyun | jq -r '.data.digest'

需要注意的是这个值在docker pull的时候需要增加sha256:

10. 获取CLI STS TOKEN

aliyun 有些资源可以通过配置的profile自动获取STS但是有些资源不可以,例如CR、CSK

1
2
3
4
5
6
7
8
export CRED=$(curl http://100.100.100.200/latest/meta-data/Ram/security-credentials/CICDRole)
export AK=$(echo $CRED | jq -r '.AccessKeyId')
export AK_SEC=$(echo $CRED | jq -r '.AccessKeySecret')
export AK_STS=$(echo $CRED | jq -r '.SecurityToken')
export ALI_CRED="--sts-token=$AK_STS --access-key-id=$AK --mode=StsToken --access-key-secret=$AK_SEC"

aliyun cr $ALI_CRED GetAuthorizationToken | jq -r .data.authorizationToken | docker login --username=cr_temp_user --password-stdin "${PROC_BUILDER_URI}"

11. 获取account id

1
2
3
4
5
ali ram GetAccountAlias
{
"AccountAlias": "1886910356xxxxx",
"RequestId": "797603B6-F858-48B5-8D63-5DF508CF4713"
}

12. 同步文件

1
2
3
4
5
-- 同步 ng-system
mc cp --continue --recursive s3/ng-system/ oss/ng-system/
-- 比较
mc diff s3/ng-system/ oss/ng-system/

13. 命令行 ECR

个人版本的CR存在限流问题, 当个人仓库流量到达一定的限制, 触发限流, 当值镜像拉取很慢, 此时应该开启企业版CR即ECR, 当时阿里云CLI CR默认是没有对ECR做支持的, 但是可以通过force和version使用OpenAPI, 进而达到管理企业版CR的目的:

1
2
3
4
#获取实例列表
ali cr ListInstance --force --version 2018-12-01
#获取仓库列表
ali cr ListRepository --InstanceId=cri-xxxx--RepoStatus=NORMAL --version 2018-12-01 --force | jq -r '.Repositories[]|select(.RepoNamespaceName=="ngiq-prod-cr")|{RepoId,RepoNamespaceName,RepoName}'