Kubenetes Secret 설정하기

·2022년 6월 15일
0

Trouble shooting

목록 보기
1/2
post-thumbnail

CI/CD를 설정하고 난 다음날, 프론트엔드에서 작업을 하는데 에러가 발생했다고 알려줬다.

gcp.json 파일이 존재하지 않습니다.

이미지 업로드를 위하여 계정 정보가 들어가있던 json 파일이 존재하지 않는단다(....)

왜 그런지 고민을 해봤더니 CICD 설정하기 전 날 이런 일이 있었다.

원래는 시크릿 설정을 해서 사용하던 것문제가 생겨서
그냥 로컬에서 바로 빌드 푸시를 해서 배포를 했던 적이 있었는데
정상작동을 해서 아 이렇게 써도 상관 없겠구나 하고 넘겼던 것이었다.

하지만 CI/CD를 사용하는 GCP의 Cloud build는 깃허브 저장소기준으로 자동배포가 이루어진다.

그러나 계정에 대한 정보가 들어가있는 json 파일을 깃허브에 올리면 해킹을 하여
코인 채굴에 쓰는 해커들 덕분에 프로젝트가 잠기게 되는데
이 때문에 json 파일은 .gitignore에 적어서 업로드가 되지 않도록 방지를 하는 것이 필수다.

그렇기에 CI/CD가 걸려있는 상태에서는 정상적으로 작동하지 않았던 것이다.
왜냐하면 로컬에서 올라간 것이 아니기에, 파일이 존재하지 않아서

쿠버네티스에서 시크릿이란?

솔직히 자세한 것은 모르지만 어느정도 감은 존재한다.

쿠버네티스 클러스터 내부에 파일을 생성하고, 그것을 암호화시켜서 사용하는 클러스터에 연결하는 것으로 알고 있다.

깃허브에는 올라가면 안되지만 없으면 안되는 파일들을 이런식으로 사용한다.
그리고 계정 정보가 들어있는 json 파일 정보를 시크릿으로 생성하여 연결을 시켜줄 것이다.

조금 다른 사용처긴 한데 환경 변수같은 것들은 Config Map 이란 이름으로 정의되어있다. (키랑 값으로 저장되어있음)

쿠버네티스 보안 및 ConfigMap에 있는 정보들

시크릿 생성 및 조회하기

일단 해당하는 파일을 만든 후, 저장을 해야한다.

  1. touch gcp-secret.json (파일명은 사람마다 필요한 방식으로)
  2. vi gcp-secret.json (파일을 수정하기 위하여 vi 에디터를 사용한다.
  3. i를 눌러서 insert 모드로 바꾼다.
  4. 복사해놓은 것을 붙여넣기한다.
  5. Esc => :WQ (저장 후 나가기 커맨드)

이렇게 생성되어있는 파일을 시크릿으로 조인하여 생성해주면 된다.

그럼 이제 시크릿을 생성해보자.

제네릭을 선언하는 이유가 있다고 하는데 이 부분은 확인을 해봐야할 것 같다.

  1. kubectl create secret generic 시크릿을 옆에 정의되어있는 것으로 생성한다
  2. gcp-account-secrets 원하는 시크릿의 이름을 적어준다.
  3. --from-file=gcp-secret.json=./gcp-secret.json 앞에가 보여지는 이름, 뒤에가 연결되는 파일명이다.

kubectl create secret generic gcp-account-secrets --from-file=gcp-secret.json=./gcp-secret.json

이렇게하면 gcp-account-secrets라는 이름의 시크릿에 gcp-secret.json 파일을 넣어서 gcp-secret.json 이란 이름으로 정의가 되어있는 것을 확인할 수 있다.

생성을 했다면 제대로 생성이 되었는지 조회를 해보자

kubectl get secrets

이 명령어를 사용할 경우 생성되어있는 모든 시크릿을 확인할 수 있다.

생성한 시크릿을 노드에 연결시키기

생성을 했으니 연결을 해줘야만 적용이 가능하다.

gcp의 경우에는 작업 부하에서 워크로드로 들어와서 YAML 파일을 수정하자.

YAML 파일 특성상 들여쓰기가 너무 중요해서(....) termination을 찾아서 아래 깔아주는 편이 좋다고 생각한다.

        volumeMounts:
        - mountPath: /my-secret
          name: my-account
          readOnly: true
      volumes:
      - name: my-account
        secret:
          defaultMode: 420
          secretName: gcp-account-secrets

volumes를 생성해서
Mounting을 하는 작업이라고 생각하면 된다.

여기서 중요한 것은 defaultMode로 생각이 드는데
파일 권한 부여옵션이 설정되어있다.

수정하는 것이 아니기에 읽기전용으로 420번으로 들어가있는데, 필요할 경우에는 바꿔서 작업을 해주면 되는 것 같다.
그리고 secretName은 아까 생성을 했던 시크릿 이름을 넣어주면 된다.


트러블을 해결한 흐름

Q1. 프론트가 갑자기 게시글 생성이 안된다고한다.
A1. 확인해보니 이미지업로드에서 사용하는 gcp json파일이 없다고 한다.

Q2. 최근에 무슨 일이 있었는지 확인해봤다.
A2. CI/CD를 건 이후 발생한 것으로 확인됐다.

Q3. 그러면서 달라진 점이 무엇인가?
A3. 원래는 로컬파일에서 빌드푸시로 배포를 하다보니 gcp.json이 올라갈 수 있었지만
깃허브의 CICD를 사용하므로써 json파일이 보안규정에 따라 깃허브이그노어에 적어놔서 존재하지 않게 되었다.

Q4. 해결을 하기 위해서는 무엇을 해야하는가?
A4. k8클러스터 내부에 gcp.json 를 생성하고 그것을 시크릿으로 생성을 한 다음 엮어줘서 해결했다.


참고한 문서 : https://kubernetes.io/ko/docs/tasks/configmap-secret/managing-secret-using-kubectl/

profile
물류 서비스 Backend Software Developer

0개의 댓글