离线部署 Openshift Container Platform 4.3 - 5: 配置 registry 使用持久存储

默认安装完成时 OCP 集成的镜像仓库没有配置持久存储, registry pod 会被自动清理, 管理状态为 Removed. 本文将为 OCP 集成镜像仓库配置持久存储. 这里使用基于 minio 的对象存储

关于 registry 持久存储

OCP 官方文档建议使用对象存储作为 registry 的后端, 并且一再强调不建议在生产环境中使用 NFS. 然而在 OCP 官方文档的 vSphere 和 Baremetal 的配置样例里又一直采用 NFS 做为 registry 的持久存储, 实在是让人无语.

我的环境有 minio 集群, 通过 endpoint https://s3.svc.vopsdev.com 对外提供服务. 这里将使用 minio 提供的对象存储作为 registry 的后端.

配置 minio

创建 bucket

1
mc mb minio/ocp-registry

创建用户和策略

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
31
32
33
34
35
36
37
38
39
40
41
# IAM policy
cat > ocp-registry-policy.json <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListMultipartUploadParts",
"s3:AbortMultipartUpload"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::ocp-registry/*"
],
"Sid": ""
},
{
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::ocp-registry"
],
"Sid": ""
}
]
}
EOF

# 创建用户, 关联策略
mc admin policy add minio ocp-registry ocp-registry-policy.json
mc admin policy info minio ocp-registry
mc admin user add minio ocp-registry-id ocp-registry-secret
mc admin policy set minio ocp-registry user=ocp-registry-id
mc admin user info minio ocp-registry-id

配置 OCP registry

初始状态, 在 openshift-image-registry 下只有 registry operator pod 在运行, 并没有 registry pod

1
2
3
oc get pod -n openshift-image-registry
NAME READY STATUS RESTARTS AGE
cluster-image-registry-operator-5d7d64d769-q4tw2 2/2 Running 1 2d1h

在 openshift-image-registry 项目下创建 secret 保存访问对象存储所使用的 access_key 和 secret_key

1
oc create secret generic image-registry-private-configuration-user --from-literal=REGISTRY_STORAGE_S3_ACCESSKEY=ocp-registry-id --from-literal=REGISTRY_STORAGE_S3_SECRETKEY=ocp-registry-secret -n openshift-image-registry

通过oc edit configs.imageregistry.operator.openshift.io/cluster编辑 image registry 的配置, 将管理状态设置为 Managed, 并指定后端对象存储信息:

1
2
3
4
5
6
7
8
9
10
spec:
managementState: Managed
storage:
s3:
bucket: ocp-registry
region: local
regionEndpoint: https://s3.svc.vopsdev.com
routes:
- name: internal-registry-route
hostname: registry-int.apps.ocp.vopsdev.com

同时这里也指定了 route 将集成镜像库的服务通过 ingress 暴露出来. 然后就可以看到 image-registry pod 已经起来了

1
2
3
4
5
6
7
8
9
10
oc get pod -n openshift-image-registry
NAME READY STATUS RESTARTS AGE
cluster-image-registry-operator-5d7d64d769-q4tw2 2/2 Running 1 2d1h
image-registry-5cdb47886d-cq6l5 1/1 Running 0 115s
node-ca-2w9jf 1/1 Running 0 116s
node-ca-5mccq 1/1 Running 0 116s
node-ca-5vv95 1/1 Running 0 116s
node-ca-fqk8q 1/1 Running 0 116s
node-ca-gfhvl 1/1 Running 0 116s
node-ca-hmr4w 1/1 Running 0 116s

测试

创建本地账户

为了测试方便, 给 OCP 配置 HTPasswd 的认证源, 创建几个本地账户

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
# 创建 htpasswd 文件
htpasswd -cBb /tmp/htpasswd admin admin
htpasswd -Bb /tmp/htpasswd user1 user1
htpasswd -Bb /tmp/htpasswd user2 user2

# 创建包含此 htpsswd 的 secret
oc create secret generic htpass-secret --from-file=htpasswd=/tmp/htpasswd -n openshift-config

# 配置 HTPasswd IDP
oc apply -f - <<EOF
apiVersion: config.openshift.io/v1
kind: OAuth
metadata:
name: cluster
spec:
identityProviders:
- name: htpasswd_provider
mappingMethod: claim
type: HTPasswd
htpasswd:
fileData:
name: htpass-secret
EOF

# 给用户授予角色. 允许 user1 往 sandbox-1 名字空间下推送镜像
oc adm policy add-cluster-role-to-user cluster-admin admin
oc new-project sandbox-1
oc policy add-role-to-user registry-editor user1
oc login -u user1

测试 registry

1
2
3
4
docker login -u user1 -p $(oc whoami -t) registry-int.apps.ocp.vopsdev.com
docker pull alpine
docker tag alpine:latest registry-int.apps.ocp.vopsdev.com/sandbox-1/alpine:latest
docker push registry-int.apps.ocp.vopsdev.com/sandbox-1/alpine:latest

在 minio 的浏览器界面上也可以看到结果

使用本地帐号 admin 登录 OCP web console, 可以发现针对 image registry 被删除的状态提示已经消失. 目前还提示 Alertmanager 的 notification 没有正确设置, 这部分会在后面监控配置中解决.