Crossplane을 사용하여 사용자 정의 제어 평면 구성

약 1년 전, 우리wrote about Crossplane.이전 글은 크로스플랜트가 Kubernetes API를 사용하여 인프라를 설정하고 관리하는 데 도움을 주는 방법을 설명합니다.그때부터 크로스플랜은 v1로 진화했다.0! 평면 횡단 커뮤니티를 축하합니다!
클라우드 공급자로서의 인터페이스를 제외하고 크로스플랜은 현재 코드를 작성하지 않고 자신의 맞춤형 자원을 만들고 발표하는 메커니즘을 가지고 있다.이것은 클라우드 공급자 API 위에 CRD 형식으로 정의된 인프라 자원을 성명하는 방법을 제공한다.이 문서에서 Crossplane을 사용하여 클라우드 공급자 위에 자신의 제어 평면을 만드는 방법을 볼 수 있습니다.

인프라 시설 공급


Crossplane에서 클라우드 리소스를 제공하는 방법을 살펴보겠습니다.
장치
다음 명령은 Helm 3을 사용하여 Kubernetes 클러스터에 Crossplane 설치
$ kubectl create namespace crossplane-system

$ helm repo add crossplane-stable https://charts.crossplane.io/stable
$ helm repo update

$ helm install crossplane --namespace crossplane-system crossplane-stable/crossplane
크로스플레인 CLI는 크로스플레인 패키지를 관리하는 데 사용되는 kubectl 플러그인입니다.설치하려면 다음을 실행하십시오.curl -sL https://raw.githubusercontent.com/crossplane/crossplane/release-1.0/install.sh | sh클라우드 공급업체와 협력
Crossplane의 '공급자' 는 클라우드 공급자 API (실제로는 모든 API) 에 대한 인터페이스를 만드는 CRD와 컨트롤러입니다.여기서 AWS를 사용하여 프레젠테이션을 진행합니다.
공급자 설치kubectl crossplane install provider crossplane/provider-aws:v0.16.0다음 명령을 실행하여 AWS 자격 증명에서 프로그램 기밀을 작성합니다.그러면 AWS CLI 자격 증명의 기본 구성 파일이 사용됩니다.
$ AWS_PROFILE=default && echo -e "[default]\naws_access_key_id = $(aws configure get aws_access_key_id --profile $AWS_PROFILE)\naws_secret_access_key = $(aws configure get aws_secret_access_key --profile $AWS_PROFILE)" > creds.conf

$ kubectl create secret generic aws-creds -n crossplane-system --from-file=key=./creds.conf
AWS ProviderConfig 및 자격 증명을 구성하는 데 사용되는 ProviderConfig
$ cat > providerconfig.yaml <<EOF
apiVersion: aws.crossplane.io/v1beta1
kind: ProviderConfig
metadata:
  name: default
spec:
  credentials:
    source: Secret
    secretRef:
      namespace: crossplane-system
      name: aws-creds
      key: key
EOF

$ kubectl apply -f providerconfig.yaml
다음은 AWS RDS 인스턴스의 평면을 "관리형 리소스"라고 표현한 것입니다.크로스 플레인 관리 리소스는 클라우드 공급자 리소스를 나타내며 실제로는 모든 API를 나타냅니다.
$ cat > rds.yaml <<EOF
apiVersion: database.aws.crossplane.io/v1beta1
kind: RDSInstance
metadata:
  name: rdspostgresql
spec:
  forProvider:
    region: us-east-1
    dbInstanceClass: db.t2.small
    masterUsername: masteruser
    allocatedStorage: 20
    engine: postgres
    engineVersion: "9.6"
    skipFinalSnapshotBeforeDeletion: true
  writeConnectionSecretToRef:
    namespace: crossplane-system
    name: aws-rdspostgresql-conn
EOF

$ kubectl apply -f rds.yaml
RDS 인스턴스와 Kubernetes 기밀 및 자격 증명을 만듭니다.

인프라 구성


위탁 관리 자원은 클라우드 자원 관리에 매우 유용하지만 매번 대량의 자원을 관리할 때마다 감당하기 어려울 수도 있다.예를 들어 응용 프로그램 개발자는 방화벽 규칙, 데이터베이스 설정 등 RDS 실례를 어떻게 만들고 관리하는지에 대해 세부 사항에 흥미를 느끼지 않을 수 있습니다. 유일하게 흥미를 느끼는 것은 데이터베이스와 그 증거에 접근하는 것입니다.반면 인프라 시설 운영자는 개발자에게 모든 RDS 설정을 공개하지 않고 필요한 파라미터만 공개할 수 있다.
Crossplane은 사용자가 선언하는 방식으로 자신의 추상을 만들 수 있는 관리 리소스를 결합하는 메커니즘을 제공합니다.
복합 자원: 복합 자원(XR)은 위탁 관리 자원으로 구성된 사용자 정의 자원으로 추상적인 기초 구조의 세부 사항을 허용합니다.
Composite Resource Definition(XRD)은 새로운 복합 자원을 정의했다.XRD는 클러스터 범위입니다.명칭 공간의 XR을 만들기 위해 상응하는 XRD는 복합 자원 성명(XRC)을 선택적으로 제공할 수 있다.
작성: 작성은 XR을 작성할 때 발생할 수 있는 리소스를 지정합니다.하나의 XR에는 여러 개의 합성이 있을 수 있다.예를 들어 CompositeDatabase XR에 대해 조합이 있을 수 있습니다. 이것은 AWS RDS 실례, 보안 그룹, MySQL 데이터베이스를 만들 것입니다.또 다른 조합은 GCP 클라우드 SQL 실례와 PostgreSQL 데이터베이스를 정의할 수 있다.
구성: 구성은 XRD와 결합된 패키지이며, 선언적 구성 리소스를 생성하여 Crossplane CLI를 사용하여 Crossplane에 게시할 수 있습니다.
다음 그림은 Kubernetes 클러스터의 평면 간 리소스의 모양을 보여줍니다.XRD는 이러한 요구 사항을 충족하는 클러스터 범위입니다.이러한 XRD는 각각의 XRD가 네임스페이스 범위인 XRC를 제공합니다.XRC를 제공하는 것은 선택할 수 있으며 사용자가 자신의 명명 공간에서 XR을 만들 수 있도록 합니다.
XRD는 또한 XRC에서 사용할 수 있도록 클러스터 범위 내의 관리 리소스를 참조합니다.

이 개념들을 더 잘 이해하기 위해 빠른 예를 살펴보자.PostgreSQL 데이터베이스에 CompositePostgreSQLInstance XRD를 만들 것입니다. 이것은 이 XRD를 만족시키는 조합입니다. 그리고 만들어진 XRC를 어떻게 사용하는지 보십시오.
Crossplane CLI를 사용하여 구성 패키지를 설치할 수 있습니다.kubectl crossplane install configuration registry.upbound.io/xp/getting-started-with-aws:v1.0.0그렇지 않으면 다음과 같이 XRD 및 구성 요소를 직접 정의할 수 있습니다.
(예제 발췌문official Crossplane docs)
XRD의 정의는 다음과 같습니다.claimNames항에서 어떻게 클레임을 제기하는지 주의하십시오.사양에서 구성 가능한 유일한 필드는 storageGB입니다.
// xrd.yaml
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
  name: compositepostgresqlinstances.database.example.org
spec:
  group: database.example.org
  names:
    kind: CompositePostgreSQLInstance
    plural: compositepostgresqlinstances
  claimNames:
    kind: PostgreSQLInstance
    plural: postgresqlinstances
  connectionSecretKeys:
    - username
    - password
    - endpoint
    - port
  versions:
  - name: v1alpha1
    served: true
    referenceable: true
    schema:
      openAPIV3Schema:
        type: object
        properties:
          spec:
            type: object
            properties:
              parameters:
                type: object
                properties:
                  storageGB:
                    type: integer
                required:
                  - storageGB
            required:
              - parameters
아래 정의된 조합은 AWS RDS 인스턴스의 생성을 정의합니다.XRD를 참조하는 필드compositeTypeRef를 사용하는 방법에 주의하십시오.resources는 이 합성을 사용할 때 만들어진 자원 그룹base을 정의했다.이 경우 patches 필드는 XRD에서 속성 값을 가져오는 데 사용됩니다.

// composition.yaml
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
  name: compositepostgresqlinstances.aws.database.example.org
  labels:
    provider: aws
    guide: quickstart
    vpc: default
spec:
  writeConnectionSecretsToNamespace: crossplane-system
  compositeTypeRef:
    apiVersion: database.example.org/v1alpha1
    kind: CompositePostgreSQLInstance
  resources:
    - base:
        apiVersion: database.aws.crossplane.io/v1beta1
        kind: RDSInstance
        spec:
          forProvider:
            region: us-east-1
            dbInstanceClass: db.t2.small
            masterUsername: masteruser
            engine: postgres
            engineVersion: "9.6"
            skipFinalSnapshotBeforeDeletion: true
            publiclyAccessible: true
          writeConnectionSecretToRef:
            namespace: crossplane-system
      patches:
        - fromFieldPath: "metadata.uid"
          toFieldPath: "spec.writeConnectionSecretToRef.name"
          transforms:
            - type: string
              string:
                fmt: "%s-postgresql"
        - fromFieldPath: "spec.parameters.storageGB"
          toFieldPath: "spec.forProvider.allocatedStorage"
      connectionDetails:
        - fromConnectionSecretKey: username
        - fromConnectionSecretKey: password
        - fromConnectionSecretKey: endpoint
        - fromConnectionSecretKey: port
이 두 개의 명세서를 설치하다$ kubectl apply -f xrd.yaml && kubectl apply -f composition.yaml새로운 XRC 생성 postgresqlinstances.database.example.org을 볼 수 있습니다.이 XRC를 사용하여 AWS RDS 인스턴스를 만듭니다.
// xr.yaml
apiVersion: database.example.org/v1alpha1
kind: PostgreSQLInstance
metadata:
  name: my-db
  namespace: default
spec:
  parameters:
    storageGB: 20
  compositionSelector:
    matchLabels:
      provider: aws
      vpc: default
  writeConnectionSecretToRef:
    name: db-conn
$ kubectl apply -f xr.yaml이렇게 하면 RDS PostgreSQL 인스턴스가 생성됩니다.이와 같이 GCP CloudSQL에 대한 다른 조합을 만들 수 있으며, 상기 목록의 compositionSelector 필드를 수정하여 XR을 만들 수 있습니다.

제어 평면 생성하기


보시다시피 크로스플랜은 클라우드 리소스와 모든 API 위에 맞춤형 리소스를 구축하는 데 도움이 됩니다.XRD, composition, XRC를 사용하여 필요한 추상적이고 제한된 제어 평면을 구축하는 것이 매우 좋다.
아래의 설명은 인프라 시설 운영자가 다른 사람들이 제어할 수 없는 전용 네트워크에 연결된 데이터베이스 실례를 만드는 것을 어떻게 허용하는지 예시를 보여 준다.

그림은 집단 범위 내의 전유 네트워크를 보여 준다.클러스터 수준에는 각 XRD에 대한 설명을 제공하는 두 개의 데이터베이스 XRD가 있습니다.그런 다음 다른 사용자는 네임스페이스 범위의 XRC를 사용하여 자체 데이터베이스 XR을 만들고 VPC를 참조할 수 있습니다.클러스터 내에서 여러 XRD 구성이 가능하므로 사용자가 선택할 수 있습니다.또한 서로 다른 클라우드 공급자는 서로 다른 조합을 사용하여 이러한 XRD를 만족시킬 수 있다.
그리고 정의된 자원 정의를 패키지로 포장하여 설정으로 나누어 줄 수 있습니다.Crossplane CLI 가 이를 어떻게 지원하는지 read more 확인할 수 있습니다.

결론


크로스플랜트는 Kubernetes API를 사용하여 인프라를 제공하는 데 도움이 된다.또한 모든 API에서 사용자 정의 추상 및 제한을 구축하는 데 도움이 됩니다.이것은 여러 개의 클라우드 공급자를 관리하는 컨트롤 평면을 구축하는 데 아주 좋은 도구가 되었다.
우리는 이 문장이 너에게 크로스플랜을 사용하는 좋은 시작을 줄 수 있기를 바란다.우리는 항상 클라우드 컴퓨팅 원생 기술을 사용하는 사람들과 연락을 맺을 수 있어서 매우 기쁘다.너는 우리를 통해 연락할 수 있다.

좋은 웹페이지 즐겨찾기