воскресенье, 13 ноября 2022 г.

Spinnaker - день второй

Второй день изучения Spinnaker (почитать про первый день можно тут). На сегодня в планах построить минимальную инфраструктуру вокруг Spinnaker и задеплоить приложение в отдельный GKE кластер.

Spinnaker у меня крутится в VirtualBox, поэтому нужно создать ключ для IAM сервис аккаунта, который будет использоваться для доступа в GCS, GCR и Pub/Sub. Для подключения к GKE я сгенерировал отдельный kubeconfig.

При составлении пайплайна для Spinnaker я пользовался репозитарием spinnaker-for-gcp. Сам туториал у меня не завелся из-за недоступности управления IAM в Cloud Playground.

Вначале у меня пайплайн падал из-за невозможности замапить все требуемые артифакты (Docker образ и манифесты Kubernetes). Подключил к Pub/Sub логирование событий от Cloud Build и увидел что нет информации о Docker образе. Решилась проблема добавлением раздела images в cloudbuild.yaml. Сейчас cloudbuild.yaml выглядит следующим образом

---
steps:
  - id: Build image
    name: 'gcr.io/cloud-builders/docker'
    args: ['build', '-t', 'gcr.io/$PROJECT_ID/sampleapp:$SHORT_SHA', '.']
  
  - id: Update manifests
    name: 'dibi/envsubst'
    entrypoint: 'sh'
    env: [ 'PROJECT_ID=$PROJECT_ID' ]
    args:
    - '-c'
    - |
      envsubst < manifests/replicaset_yaml.template > manifests/replicaset.yaml
      rm manifests/replicaset_yaml.template

images:
  - 'gcr.io/$PROJECT_ID/sampleapp:$SHORT_SHA'

artifacts:
  objects:
    location: gs://$PROJECT_ID-artifacts/sampleapp-manifests/$SHORT_SHA
    paths: [ 'manifests/*' ]    

Создание kubeconfig для Spinnaker выглядит следующим образом

GKE_OPTS='<clustername> --project <project> --zone <zone>' # Example: GKE_OPTS='cluster --project playground-s-11-a9ad0138 --zone us-central1-c'

gcloud container clusters get-credentials $GKE_OPTS
kubectl create ns spinnaker
kubectl -n spinnaker create serviceaccount spinnaker
kubectl create clusterrolebinding spinnaker --clusterrole=cluster-admin --serviceaccount=spinnaker:spinnaker

TOKENNAME=$(kubectl -n spinnaker get serviceaccount/spinnaker -o jsonpath='{.secrets[0].name}')
TOKEN=$(kubectl -n spinnaker get secret $TOKENNAME -o jsonpath='{.data.token}'| base64 --decode)
CACRT=$(gcloud container clusters describe ${GKE_OPTS} --format='value(masterAuth.clusterCaCertificate)' | base64 -d)
ENDPOINT=$(gcloud container clusters describe ${GKE_OPTS} --format='value(privateClusterConfig.publicEndpoint)')
GKE_CONTEXT="gke_${GCP_PROJECT}_${GKE_CLUSTER_LOCATION}_${GKE_CLUSTER_NAME}"

export KUBECONFIG=(mktemp /tmp/kubeconfig.XXXX)
kubectl config set-cluster ${GKE_CLUSTER_NAME} --server=https://${ENDPOINT}
kubectl config set-credentials spinnaker --token=${TOKEN}
kubectl config set-context ${GKE_CONTEXT} --user=spinnaker --cluster=${GKE_CLUSTER_NAME}
kubectl config set-cluster ${GKE_CLUSTER_NAME} --embed-certs --certificate-authority <(echo "$CACRT")
kubectl config use-context ${GKE_CONTEXT}
unset KUBECONFIG    

Конфигурация GCS

    spinnakerConfig:
      config:
        artifacts:
          gcs:
            accounts:
            - jsonPath: encryptedFile:k8s!n:spin-secrets!k:gcp-json
              name: cloudguru-gcs
            enabled: true    

Отдельной конфигурации для GCR не требуется, т.к. мы получаем информацию о Docker образе в сообщении Cloud Build.

Конфигурация Cloud Build

    spinnakerConfig:
      config:
        ci:
          gcb:
            accounts:
            - jsonKey: encryptedFile:k8s!n:spin-secrets!k:gcp-json
              name: cloudguru-gcb
              project: playground-s-11-a9ad0138
              subscriptionName: spinnaker-gcb
            enabled: true    

Конфигурация GKE кластера

    spinnakerConfig:
      config:
        kubernetes:
          accounts:
          - context: gke_playground-s-11-a9ad0138_us-central1-a_cluster
            kubeconfigFile: encryptedFile:k8s!n:spin-secrets!k:kubeconfig
            name: gke-cluster
            providerVersion: V2
            serviceAccount: false
          enabled: true
          primaryAccount: gke-cluster    

Пайплайн, который я использовал для отладки, максимально упрощенный. В сравнении с оригинальным много фич было выброшено, т.к. сам пайплайн привязан к конфигурации Spinnaker из туториала, а времени его адаптировать не было.

На следующую итерацию планирую полностью импортировать пайплайн из spinnaker-for-gcp и поиграться с ним.

Комментариев нет:

Отправить комментарий