Crossplane 云基础设施管理教程

Crossplane 是一个 CNCF 项目,它将 Kubernetes 扩展为一个通用的云基础设施管理平台。通过 Crossplane,你可以使用 Kubernetes 原生的 YAML 声明式方式来创建和管理云厂商的资源(如数据库、存储桶、VPC 等),将基础设施即代码(IaC)融入 Kubernetes 的 GitOps 工作流中。

一、Crossplane 核心概念

  • Provider:云厂商的连接器,例如 provider-aws、provider-gcp、provider-azure。
  • Managed Resource:由 Crossplane 管理的外部云资源。
  • Composite Resource (XR):将多个 Managed Resource 组合成高级抽象。
  • Composition:定义 Composite Resource 如何映射到 Managed Resource。
  • Claim (XRC):用户通过 Claim 来请求 Composite Resource。

二、安装 Crossplane

# 使用 Helm 安装
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm repo update

helm install crossplane crossplane-stable/crossplane \
  --namespace crossplane-system \
  --create-namespace

# 等待 Pod 就绪
kubectl wait --for=condition=Ready pods --all -n crossplane-system --timeout=120s

# 安装 Crossplane CLI
curl -sL https://raw.githubusercontent.com/crossplane/crossplane/master/install.sh | sh
mv crossplane /usr/local/bin/

三、配置 Provider

3.1 安装 AWS Provider

cat > provider-aws.yaml <<'EOF'
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-aws
spec:
  package: xpkg.upbound.io/upbound/provider-family-aws:v1.1.0
EOF
kubectl apply -f provider-aws.yaml

# 等待 Provider 就绪
kubectl wait --for=condition=Healthy provider/provider-aws --timeout=120s

# 配置 AWS 凭证
cat > aws-credentials.txt <<'EOF'
[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
EOF

kubectl create secret generic aws-creds -n crossplane-system --from-file=creds=./aws-credentials.txt

cat > provider-config.yaml <<'EOF'
apiVersion: aws.upbound.io/v1beta1
kind: ProviderConfig
metadata:
  name: default
spec:
  credentials:
    source: Secret
    secretRef:
      namespace: crossplane-system
      name: aws-creds
      key: creds
EOF
kubectl apply -f provider-config.yaml

四、创建云资源

# 创建 S3 存储桶
cat > s3-bucket.yaml <<'EOF'
apiVersion: s3.aws.upbound.io/v1beta1
kind: Bucket
metadata:
  name: my-crossplane-bucket
spec:
  forProvider:
    region: us-west-2
  providerConfigRef:
    name: default
EOF
kubectl apply -f s3-bucket.yaml

# 查看资源状态
kubectl get bucket
kubectl describe bucket my-crossplane-bucket

五、Composition 组合资源

# 定义 Composite Resource Definition (XRD)
cat > xrd.yaml <<'EOF'
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
  name: xdatabases.example.com
spec:
  group: example.com
  names:
    kind: XDatabase
    plural: xdatabases
  claimNames:
    kind: Database
    plural: databases
  versions:
  - name: v1alpha1
    served: true
    referenceable: true
    schema:
      openAPIV3Schema:
        type: object
        properties:
          spec:
            type: object
            properties:
              parameters:
                type: object
                properties:
                  storageGB:
                    type: integer
                  engine:
                    type: string
                    enum: ["mysql", "postgres"]
                required: ["storageGB", "engine"]
            required: ["parameters"]
EOF
kubectl apply -f xrd.yaml
# 定义 Composition
cat > composition.yaml <<'EOF'
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
  name: database-aws
spec:
  compositeTypeRef:
    apiVersion: example.com/v1alpha1
    kind: XDatabase
  resources:
  - name: rds-instance
    base:
      apiVersion: rds.aws.upbound.io/v1beta1
      kind: Instance
      spec:
        forProvider:
          region: us-west-2
          instanceClass: db.t3.micro
          allocatedStorage: 20
          engine: mysql
          publiclyAccessible: false
    patches:
    - fromFieldPath: "spec.parameters.storageGB"
      toFieldPath: "spec.forProvider.allocatedStorage"
    - fromFieldPath: "spec.parameters.engine"
      toFieldPath: "spec.forProvider.engine"
EOF
kubectl apply -f composition.yaml

六、使用 Claim 请求资源

# 开发者通过 Claim 请求数据库
cat > db-claim.yaml <<'EOF'
apiVersion: example.com/v1alpha1
kind: Database
metadata:
  name: my-app-db
  namespace: default
spec:
  parameters:
    storageGB: 50
    engine: postgres
  compositionRef:
    name: database-aws
EOF
kubectl apply -f db-claim.yaml

# 查看 Claim 状态
kubectl get database
kubectl get composite

七、与 GitOps 集成

Crossplane 资源是标准的 Kubernetes 对象,可以直接与 ArgoCDFlux 配合使用,实现基础设施的 GitOps 管理。

八、常见问题

资源创建失败

# 查看 Provider 日志
kubectl logs -n crossplane-system -l pkg.crossplane.io/revision

# 查看资源事件
kubectl describe bucket my-crossplane-bucket

总结

Crossplane 将云基础设施管理融入 Kubernetes 生态,实现了真正的统一控制平面。在搬瓦工 VPS 的 K8S 集群上部署 Crossplane 后,你可以用 kubectl 命令管理各种云资源。结合 KustomizeArgoCD 可以实现完整的 GitOps 基础设施管理。选购搬瓦工 VPS 请访问 bwh81.net,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。