Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

20.2. 配置安全组

在 AWS 上安装 OpenShift Container Platform 时,请确保设置适当的安全组。

这些是在安全组中必须具有的一些端口,而安装会失败。根据您要安装的集群配置,您可能需要更多。如需更多信息,并相应地调整您的安全组,请参阅所需端口以了解更多信息。

所有 OpenShift Container Platform 主机

  • 来自运行安装程序/Ansible 的主机的 TCP/22

etcd 安全组

  • 来自 master 的 TCP/2379
  • 来自 etcd 主机的 TCP/2380

Master 安全组

  • 来自 0.0.0.0/0 的 tcp/8443
  • 从所有安装的环境到 3.2 的 OpenShift Container Platform 主机中的 TCP/53
  • 来自安装环境的所有 OpenShift Container Platform 主机到 3.2 的 UDP/53
  • 对于使用 3.2 安装的新环境,来自所有 OpenShift Container Platform 主机中的 TCP/8053
  • 对于使用 3.2 安装的新环境,所有 OpenShift Container Platform 主机中的 UDP/8053

节点安全组

  • 来自 master 的 TCP/10250
  • 来自节点的 UDP/4789

基础架构节点(一个可以托管 OpenShift Container Platform 路由器)

  • 来自 0.0.0.0/0 的 tcp/443
  • 来自 0.0.0.0/0 的 tcp/80

CRI-O

如果使用 CRIO,则必须打开 tcp/10010 以允许 oc execoc rsh 操作。

如果为 master 和/或路由器配置外部负载均衡器(ELB),您还需要为 ELB 相应地配置入口和 Egress 安全组。

20.2.1. 覆盖检测到的 IP 地址和主机名

在 AWS 中,需要覆盖变量的情况包括:

变量使用方法

hostname

用户安装在 VPC 中,它没有为 DNS 主机名DNS 解析进行配置。

ip

您已经配置了多个网络接口,并希望使用除默认接口以外的其他网络接口。

public_hostname

  • 一个 master 实例,其中没有为 Auto-assign Public IP 配置 VPC 子网。对于此 master 的外部访问权限,您需要配置一个 ELB 或其他负载均衡器来提供所需的外部访问,或者您需要通过 VPN 连接主机的内部名称进行连接。
  • 禁用元数据的 master 实例。
  • 这个值实际上没有被节点使用。

public_ip

  • 一个 master 实例,其中没有为 Auto-assign Public IP 配置 VPC 子网。
  • 禁用元数据的 master 实例。
  • 这个值实际上没有被节点使用。

对于 EC2 主机,必须部署到启用了 DNS 主机名和 DNS 解析的 VPC 中。

20.2.1.1. 为 Amazon Web Services(AWS)配置 OpenShift Container Platform registry

Amazon Web Services (AWS) 提供对象存储,OpenShift Container Platform 可以使用它们使用 OpenShift Container Platform 容器 registry 存储容器镜像。

如需更多信息,请参阅 Amazon S3

先决条件

OpenShift Container Platform 使用 S3 作为镜像存储。应创建 S3 存储桶、IAM 策略和带有 Programmatic Access 的 IAM 用户,以允许安装程序配置 registry。

以下示例使用 awscli 在 us-east-1 区域中创建一个名为 openshift-registry-storage 的存储桶。

# aws s3api create-bucket \
     --bucket openshift-registry-storage \
     --region us-east-1

默认策略

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation",
        "s3:ListBucketMultipartUploads"
      ],
      "Resource": "arn:aws:s3:::S3_BUCKET_NAME"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject",
        "s3:ListMultipartUploadParts",
        "s3:AbortMultipartUpload"
      ],
      "Resource": "arn:aws:s3:::S3_BUCKET_NAME/*"
    }
  ]
}
20.2.1.1.1. 将 OpenShift Container Platform 清单配置为使用 S3

流程

将 registry 的 Ansible 清单配置为使用 S3 存储桶和 IAM 用户:

[OSEv3:vars]
# AWS Registry Configuration
openshift_hosted_manage_registry=true
openshift_hosted_registry_storage_kind=object
openshift_hosted_registry_storage_provider=s3
openshift_hosted_registry_storage_s3_accesskey=AKIAJ6VLREDHATSPBUA 1
openshift_hosted_registry_storage_s3_secretkey=g/8PmTYDQVGssFWWFvfawHpDbZyGkjGNZhbWQpjH 2
openshift_hosted_registry_storage_s3_bucket=openshift-registry-storage 3
openshift_hosted_registry_storage_s3_region=us-east-1 4
openshift_hosted_registry_storage_s3_chunksize=26214400
openshift_hosted_registry_storage_s3_rootdirectory=/registry
openshift_hosted_registry_storage_s3_encrypt=false
openshift_hosted_registry_storage_s3_kmskeyid=aws_kms_key_id 5
openshift_hosted_registry_pullthrough=true
openshift_hosted_registry_acceptschema2=true
openshift_hosted_registry_enforcequota=true
openshift_hosted_registry_replicas=3
1 1
IAM 用户的访问密钥。(当前不需要 IAM 角色)
2
IAM 用户的 secret 密钥。(当前不需要 IAM 角色)
3
S3 存储桶名称。
4
bucket 所在的区域。
5
用于加密集群中数据的加密密钥的 AWS Key Management Service(AWS KMS)密钥 ID。
20.2.1.1.2. 手动将 OpenShift Container Platform registry 配置为使用 S3

要使用 Amazon Web Services(AWS)S3 对象存储,请编辑 registry 的配置文件并挂载到 registry pod。

流程

  1. 导出当前的 config.yml

    $ oc get secret registry-config \
        -o jsonpath='{.data.config\.yml}' -n default | base64 -d \
      >> config.yml.old
  2. 从旧 config.yml 创建新配置文件:

    $ cp config.yml.old config.yml
  3. 编辑该文件,使其包含 S3 参数。在 registry 配置文件的 storage 部分指定 accountname、accountkey、container 和 realm。

    storage:
      delete:
        enabled: true
      cache:
        blobdescriptor: inmemory
      s3:
        accesskey: AKIAJ6VLREDHATSPBUA 1
        secretkey: g/8PmTYDQVGssFWWFvfawHpDbZyGkjGNZhbWQpjH 2
        region: us-east-1 3
        bucket: openshift-registry-storage 4
        encrypt: False
        secure: true
        v4auth: true
        rootdirectory: /registry 5
        chunksize: "26214400"
    1
    使用有权访问 S3 存储桶的 AWS 访问密钥替换。
    2
    与定义的 AWS 访问密钥对应的 secret 键。
    3
    用作 registry 的 S3 存储桶的名称。
    4
    registry 将存储镜像和元数据的位置。(默认为 /registry)
  4. 删除 registry-config secret:

    $ oc delete secret registry-config -n default
  5. 重新创建 secret 来引用更新的配置文件:

    $ oc create secret generic registry-config \
        --from-file=config.yml -n default
  6. 重新部署 registry 以读取更新的配置:

    $ oc rollout latest docker-registry -n default
20.2.1.1.3. 验证 registry 是否使用 S3 存储

验证 registry 是否使用 Amazon S3 存储:

流程

  1. 在成功部署 registry 后,registry deploymentconfig 会将 registry-storage 描述为 emptydir 而不是 AWS S3,但 AWS S3 存储桶的配置位于 secret docker-config 中。docker-config 机密挂载到 REGISTRY_CONFIGURATION_PATH,后者在将 AWS S3 用于注册表对象存储时提供所有 paramaters。

    $ oc describe dc docker-registry -n default
    ...
        Environment:
          REGISTRY_HTTP_ADDR:					:5000
          REGISTRY_HTTP_NET:					tcp
          REGISTRY_HTTP_SECRET:					SPLR83SDsPaGbGuwSMDfnDwrDRvGf6YXl4h9JQrToQU=
          REGISTRY_MIDDLEWARE_REPOSITORY_OPENSHIFT_ENFORCEQUOTA:	false
          REGISTRY_HTTP_TLS_KEY:					/etc/secrets/registry.key
          OPENSHIFT_DEFAULT_REGISTRY:				docker-registry.default.svc:5000
          REGISTRY_CONFIGURATION_PATH:				/etc/registry/config.yml
          REGISTRY_OPENSHIFT_SERVER_ADDR:				docker-registry.default.svc:5000
          REGISTRY_HTTP_TLS_CERTIFICATE:				/etc/secrets/registry.crt
        Mounts:
          /etc/registry from docker-config (rw)
          /etc/secrets from registry-certificates (rw)
          /registry from registry-storage (rw)
      Volumes:
       registry-storage:
        Type:	EmptyDir (a temporary directory that shares a pod's lifetime) 1
        Medium:
       registry-certificates:
        Type:	Secret (a volume populated by a Secret)
        SecretName:	registry-certificates
        Optional:	false
       docker-config:
        Type:	Secret (a volume populated by a Secret)
        SecretName:	registry-config
        Optional:	false
    ....
    1
    共享 pod 生命周期的临时目录。
  2. 确定 /registry 挂载点为空:

    $ oc exec \
        $(oc get pod -l deploymentconfig=docker-registry \
        -o=jsonpath='{.items[0].metadata.name}')  -i -t -- ls -l /registry
    total 0

    如果为空,则代表 S3 配置在 registry-config secret 中定义:

    $ oc describe secret registry-config
    Name:         registry-config
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    config.yml:  398 bytes
  3. 安装程序会使用扩展的 registry 功能创建带有所需配置的 config.yml 文件,如安装文档所述。要查看配置文件,包括存储存储桶配置的 storage 部分:

    $ oc exec \
        $(oc get pod -l deploymentconfig=docker-registry \
          -o=jsonpath='{.items[0].metadata.name}') \
      cat /etc/registry/config.yml
    
      version: 0.1
      log:
        level: debug
      http:
        addr: :5000
      storage:
        delete:
          enabled: true
        cache:
          blobdescriptor: inmemory
        s3:
          accesskey: AKIAJ6VLREDHATSPBUA
          secretkey: g/8PmTYDQVGssFWWFvfawHpDbZyGkjGNZhbWQpjH
          region: us-east-1
          bucket: openshift-registry-storage
          encrypt: False
          secure: true
          v4auth: true
          rootdirectory: /registry
          chunksize: "26214400"
      auth:
        openshift:
          realm: openshift
      middleware:
        registry:
        - name: openshift
        repository:
        - name: openshift
          options:
            pullthrough: true
            acceptschema2: true
            enforcequota: true
        storage:
        - name: openshift

    另外,您可以查看 secret:

    $ oc get secret registry-config -o jsonpath='{.data.config\.yml}' | base64 -d
    version: 0.1
    log:
      level: debug
    http:
      addr: :5000
      storage:
        delete:
          enabled: true
        cache:
          blobdescriptor: inmemory
        s3:
          accesskey: AKIAJ6VLREDHATSPBUA
          secretkey: g/8PmTYDQVGssFWWFvfawHpDbZyGkjGNZhbWQpjH
          region: us-east-1
          bucket: openshift-registry-storage
          encrypt: False
          secure: true
          v4auth: true
          rootdirectory: /registry
          chunksize: "26214400"
    auth:
      openshift:
        realm: openshift
    middleware:
      registry:
      - name: openshift
      repository:
      - name: openshift
      options:
        pullthrough: true
        acceptschema2: true
        enforcequota: true
      storage:
      - name: openshift

如果使用 emptyDir 卷,/registry 挂载点类似如下:

$ oc exec \
    $(oc get pod -l deploymentconfig=docker-registry \
    -o=jsonpath='{.items[0].metadata.name}')  -i -t -- df -h /registry
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdc         100G  226M   30G   1% /registry


$ oc exec \
    $(oc get pod -l deploymentconfig=docker-registry \
    -o=jsonpath='{.items[0].metadata.name}')  -i -t -- ls -l /registry
total 0
drwxr-sr-x. 3 1000000000 1000000000 22 Jun 19 12:24 docker