Второй день изучения 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 и поиграться с ним.
Комментариев нет:
Отправить комментарий