# Подключение crossplane к yandex

# Установка провайдера
## Создаем ключ для доступа в yandex и помещаем его в кубер
```bash
yc iam service-account create --name crossplane
yc resource-manager folder add-access-binding <folder_id> --service-account-name crossplane --role editor
yc iam service-account get crossplane
yc iam key create --service-account-id service_account_id --output key.json
kubectl create secret generic yc-creds -n "crossplane-system" --from-file=credentials=./key.json
```

## Создаем конфигурацию

### controllerconfig.yml(используется не всегда)
```yaml
apiVersion: pkg.crossplane.io/v1alpha1
kind: ControllerConfig
metadata:
  name: controllerconfig-k8s
  namespace: crossplane-system
spec:
  tolerations:
  - effect: NoSchedule
    key: worker-for-systemapps
    operator: Equal
    value: "1"
```

### provider.yml
```yml
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-ycloud
  namespace: crossplane-system
spec:
  package: cr.yandex/crp0kch415f0lke009ft/crossplane/provider-jet-yc:v0.1.37
  packagePullPolicy: Always
  # используется вместе с controllerconfig 
  controllerConfigRef:
    name: "controllerconfig-k8s"
```

### providerconfig.yml
```yml
apiVersion: yandex-cloud.jet.crossplane.io/v1alpha1
kind: ProviderConfig
metadata:
  name: providerconfig-ycloud
  namespace: crossplane-system
spec:
  credentials:
    cloudId: <cloud-resource-id>   
    folderId: <cloud-resource-id>   
    source: Secret
    secretRef:
      name: yc-creds
      namespace: crossplane-system
      key: credentials
```


## Применяем crossplane ресурсы
Задержка необходима для providerconfig, так как CRD устанавливается не crossplane а ycloud провайдером. 
Сразу всё применить не получится.
```bash
# первую команду можно опустить если для запуска проекта не требуется специальных настроек. 
kubectl apply -f controllerconfig.yml
kubectl apply -f provider.yml 
sleep 10 && kubeclt apply -f providerconfig.yml
```


# Разное
## В качестве эксперимента можно создать тестовую s3 корзину:

> Внимание! Необходимо использовать директиву: `deletionPolicy: Orphan` в противном случае ресурс будет удален вместе с xrd. 

```yml
apiVersion: iam.yandex-cloud.jet.crossplane.io/v1alpha1
kind: ServiceAccountStaticAccessKey
metadata:
  name: sa-static-key
  namespace: crossplane-system
spec:
    forProvider:
        description: "static access key for object storage"
        serviceAccountId: <cloud-resource-id>
    providerConfigRef:
        name: providerconfig-ycloud
    writeConnectionSecretToRef:
        name: sa-key-conn
        namespace: crossplane-system

---
apiVersion: storage.yandex-cloud.jet.crossplane.io/v1alpha1
kind: Bucket
metadata:
    name: bucket
    namespace: crossplane-system
spec:
	deletionPolicy: Orphan
    forProvider:
        accessKeyRef:
          name: sa-static-key
        secretKeySecretRef:
          name: sa-key-conn
          namespace: crossplane-system
          key: attribute.secret_key
        bucket: "bucket"
        acl: "public-read"
    providerConfigRef:
        name: providerconfig-ycloud
```


```bash
kubectl apply -f example-s3-bucket.yml
```

После применения идем в веб-интерфейс yandex и проверяем созданный ресурс.

> Если ресурс не появился откройте описание созданного ресурса в k8s, в yml будет отдельное поле с ошибкой.  

## Импортирование существующего ресурса

Импортировании существующего ресурса производится следующим образом: 
```  
    metadata:
      annotations:
        crossplane.io/external-name: <cloud-resource-id>    
```



## Удаление

Для переустановки необходимо удалить пространство crossplane-system. А так же удалить все CRD которые принадлежат crossplane.