23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
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 이다.
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기본이 될 인증서를 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이제 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 --overwritenamespace 를 조회하고 적절한 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=enabledtaco-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 41dsecret 에 대한 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 를 설명하고자 한다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.