데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      Kubernetes Namespace 간 Secret 을 자동 복사하기 (feat. Kubed)

      seungkyua 21.11.09
      5,460 5 1

      Kubernetes 에서 Secret 과 ConfiMap 은 Namespace 가 다르면 Mount 해서 사용할 수 없다. 이는 보안 적인 측면에서의 제약사항이지만 이 경계를 무시해서 활용해야할 상황이 가끔 놓이곤 한다.

      TACO 에서 제공하는 웹 서비스는 grafana, kibana, kiali, jaeger 등으로 다양한 접속 url 을 가지고 있다. 각 url 은 TACO 서비스 도메인의 하위 도메인으로 상위 도메인 인증서를 가지고 있다면 하위 도메인에서도 모두 사용할 수 있다.

      즉, '*.taco-cat.xyz' 라는 상위 도메인 인증서로 grafana.taco-cat.xyz, kiali.taco-cat.xyz 등과 같은 각 서비스 url 에 tls 를 적용할 수 있다. 이 때 grafana 와 kibana 는 lma (logging monitoring alarm) namespace 에 설치되어 있고, kiali, jaeger 는 service-mesh namespace 에 설치되어 있다면, tls 적용을 위해서 lma 와 service-mesh namespace 모두 *.taco-cat.xyz 인증서가 secret 으로 저장되어 있어야 한다.

      이렇게 매번 namespace 마다 secret 을 설치한다는 것은 귀찮기도 하지만 관리하기가 어렵다. 이를 쉽게 해결할 수 있는 s/w 가 바로 AppsCode 에서 만든 Kubed 이다.

      1. Kubed 설치하기

      Kubed (''큐브디'' 라고 읽는다)는 Kubernetes Operator 로 ConfigMap 과 Secret 을 namespace 간에 동기화해주는 역할을 한다. 위의 상황에서는 lma namespace 에 있는 secret 을 자동으로 service-mesh namespace 로 자동 복사하는 역할을 한다. 이 기능은 하나의 Cluster 내에서 서로 다른 namespace 간의 동기화도 가능하지만, 서로 다른 Cluster 간에 서로 다른 namespace 간 동기화도 가능하다. 여기서는 간단하게 동일 Cluster 에서 서로 다른 namespace 간 동기화만 설명한다.

       

      Kubed 는 helm chart 를 활용하여 쉽게 설치할 수 있다.

      $ helm repo add appscode https://charts.appscode.com/stable/
      $ helm repo update
      ​
      $ helm upgrade -i kubed appscode/kubed --version v0.12.0 -n kube-system

      아래와 같이 kubed 가 설치되어 있는 것을 확인할 수 있다. (개발 환경으로 오래전에 설치했기 때문에 기간이 좀 지나있다)

      $ kubectl get deployments -n kube-system
      NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
      calico-kube-controllers   1/1     1            1           74d
      coredns                   2/2     2            2           74d
      kubed                     1/1     1            1           43d
      metrics-server            1/1     1            1           41d


      2. 인증서 secret 생성

      기본이 될 인증서를 secret 으로 생성해 보자. 여기서는 secret 으로 테스트 하지만 ConfigMap 으로 테스트 해도 똑같이 적용된다.

      먼저 taco 인증서 cert 파일과 key 파일을 준비해서 secret 으로 만든다.

      $ kubectl create secret tls taco-cat-tls --key taco-cat.key --cert taco-cat.crt -n kube-system

      아래와 같이 생성되었음을 확인할 수 있다.

      $ kubectl get secret taco-cat-tls -n kube-system
      NAME           TYPE                DATA   AGE
      taco-cat-tls   kubernetes.io/tls   2      43d


      3. 인증서 secret 복사 확인

      이제 Kubed Operator 에게 secret 을 복사하기 위한 방법을 알려줘야 하는데 그것은 바로 annotation 이다.

      annotation 은 key=value 로 지정할 수 있는데, kubed.appscode.com/sync="" 와 같이 key 는 kubed.appscode.com/sync 로 고정 값이고 value 는 "" (empty string) 이나 "taco-tls=enabled" 로 (key=value string) 지정할 수 있다.

       

      kube-system 에 있는 taco-cat-tls secret 에 kubed.appscode.com/sync="" 으로 지정하면 전체 namespace 에 secret 을 복사해서 생성한다.

      $ kubectl annotate secret taco-cat-tls kubed.appscode.com/sync="" -n kube-system --overwrite
      secret/taco-cat-tls annotated

      조회해 보면 모든 namespace 에 taco-cat-tls secret 이 복사되어 있음을 할 수 있다.

      $ kubectl get ns
      NAME                STATUS   AGE
      argo                Active   59d
      crossplane-system   Active   66d
      decapod-db          Active   59d
      default             Active   74d
      elastic-system      Active   41d
      ingress-nginx       Active   66d
      istio-operator      Active   41d
      istio-system        Active   41d
      keycloak            Active   43d
      kube-node-lease     Active   74d
      kube-public         Active   74d
      kube-system         Active   74d
      lma                 Active   59d
      ​
      ​
      $ kubectl get secret -A | grep taco-cat-tls
      argo                taco-cat-tls            kubernetes.io/tls         2      43d
      crossplane-system   taco-cat-tls            kubernetes.io/tls         2      74s
      decapod-db          taco-cat-tls            kubernetes.io/tls         2      74s
      default             taco-cat-tls            kubernetes.io/tls         2      74s
      elastic-system      taco-cat-tls            kubernetes.io/tls         2      74s
      ingress-nginx       taco-cat-tls            kubernetes.io/tls         2      43d
      istio-operator      taco-cat-tls            kubernetes.io/tls         2      74s
      istio-system        taco-cat-tls            kubernetes.io/tls         2      41d
      keycloak            taco-cat-tls            kubernetes.io/tls         2      43d
      kube-node-lease     taco-cat-tls            kubernetes.io/tls         2      74s
      kube-public         taco-cat-tls            kubernetes.io/tls         2      3d17h
      kube-system         taco-cat-tls            kubernetes.io/tls         2      43d
      lma                 taco-cat-tls            kubernetes.io/tls         2      41d

      위와 같이 모든 namespace 복사하는 것은 낭비일 수 있다. 지정된 namespace 에만 secret 을 저장하고 싶으면 annotation 에 kubed.appscode.com/sync="taco-tls=enabled" 값을 주고, 이 값을 namespace 의 label 로 지정하면 된다.

      $ kubectl annotate secret taco-cat-tls kubed.appscode.com/sync="taco-tls=enabled" -n kube-system --overwrite

      namespace 를 조회하고 적절한 namespace 에 복사되었는지 확인하자.

      'taco-tls=enabled' label 을 갖는 namespace 는 argo, ingress-nginx, istio-system, keycloak, kube-public, lma 임을 알 수 있다.

      $ kubectl get ns --show-labels | grep taco-tls=enabled
      argo                Active   59d   name=argo,taco-tls=enabled
      ingress-nginx       Active   66d   name=ingress-nginx,taco-tls=enabled
      istio-system        Active   41d   name=lma,taco-tls=enabled
      keycloak            Active   43d   taco-tls=enabled
      kube-public         Active   74d   taco-tls=enabled
      lma                 Active   59d   name=lma,taco-tls=enabled

      taco-cat-tls secret 이 존재하는 namespace 를 조회하면 일치하는 것을 알 수 있다. (kube-system 은 secret 을 직접 설치한 namespace 임을 기억하자.)

      $ kubectl get secret -A | grep taco-cat-tls
      argo                taco-cat-tls            kubernetes.io/tls         2      43d
      ingress-nginx       taco-cat-tls            kubernetes.io/tls         2      43d
      istio-system        taco-cat-tls            kubernetes.io/tls         2      41d
      keycloak            taco-cat-tls            kubernetes.io/tls         2      43d
      kube-public         taco-cat-tls            kubernetes.io/tls         2      3d17h
      kube-system         taco-cat-tls            kubernetes.io/tls         2      43d
      lma                 taco-cat-tls            kubernetes.io/tls         2      41d


      4. 마치며

      secret 에 대한 namespace 간 복사는 인증서 말고도 중요 key 값도 있다. 예를 들면 elasticsearch 에 접근하기 위한 id/password 는 secret 형태로 lma namespace 에 존재한다. istio-system namespace 에 설치된 jaeger 에서도 call tracing 을 elasticsearch 에 저장하기 위해서 이 id/password 가 필요한데 이를 위해 secret 를 복사해 올 필요가 있다. 이 때 Kubed 를 사용하여 간단히 namespace 를 생성하면서 label 을 지정하여 secret 을 복사할 수 있다.

      다음에 기회가 된다면 cluster 간 secret 을 복사하는 Kubed 를 설명하고자 한다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      seungkyua 님의 최신 블로그

      더보기
      동영상 기고하기