Closed dittos closed 1 year ago
현재 Keel을 사용해서 Docker 이미지가 업데이트될 때 k8s Deployment가 수정되는 방식(pull 방식)을 사용하고 있다.
GitHub Actions에서 Docker 이미지 업데이트 후에 k8s Deployment를 직접 수정한다.
일단은 백엔드 배포에만 적용
.kube/config를 GitHub Secret으로 저장하고 액션에서 사용
.kube/config
(참고: https://docs.k3s.io/cluster-access#accessing-the-cluster-from-outside-with-kubectl)
GitHub Secret에 멀티 라인 데이터를 넣기가 어렵다; 다음과 같이 base64 인코딩해서 넣는다.
sudo cat /etc/rancher/k3s/k3s.yaml
edit yaml
apiVersion: v1 clusters: - cluster: certificate-authority-data: ... server: https://aws.dittos.pe.kr:6443 tls-server-name: 127.0.0.1
base64 encode
cat edited.yaml | base64 -w 0; echo
작업 전 keel 설정을 제거한다
latest
kubectl rollout restart
Job
metadata.generateName
kubectl create
ConfigMap
Secret
kubectl get deployment animeta-backend-ts -o jsonpath='{.spec.template.spec.volumes[?(@.name=="secret")].secret.secretName}'
문제점
현재 Keel을 사용해서 Docker 이미지가 업데이트될 때 k8s Deployment가 수정되는 방식(pull 방식)을 사용하고 있다.
개선 방향
GitHub Actions에서 Docker 이미지 업데이트 후에 k8s Deployment를 직접 수정한다.
계획
일단은 백엔드 배포에만 적용
✅ GitHub Actions에서 k8s 클러스터에 접근할 수 있도록 한다
.kube/config
를 GitHub Secret으로 저장하고 액션에서 사용(참고: https://docs.k3s.io/cluster-access#accessing-the-cluster-from-outside-with-kubectl)
GitHub Secret에 멀티 라인 데이터를 넣기가 어렵다; 다음과 같이 base64 인코딩해서 넣는다.
edit yaml
base64 encode
✅ Docker 이미지 빌드 완료 후 k8s Deployment를 수정한다
작업 전 keel 설정을 제거한다
latest
태그를 계속 사용하고kubectl rollout restart
를 사용✅ 배포 전 DB 마이그레이션 작업 실행한다
Job
을 생성한다metadata.generateName
+kubectl create
Job
종료 대기: 그다지 깔끔한 방법은 없음 https://stackoverflow.com/questions/55073453/wait-for-kubernetes-job-to-complete-on-either-failure-success-using-command-lineConfigMap
,Secret
이 kustomize가 생성한 이름이 되어서, 일회성 작업에서 설정을 가져다 쓰려면 정확한 이름을 찾아야 함kubectl get deployment animeta-backend-ts -o jsonpath='{.spec.template.spec.volumes[?(@.name=="secret")].secret.secretName}'
Job
만들 때 넣어야 하는데 템플리팅 어떻게 할지: sed? envsubst? jq?