LabHub
시작하기
배우기 러닝패스 코스

Istio 실측 실험실

컨테이너가 아닌 머신에 같은 신원을

LabHub 에서 이어서 보기

한 줄 요약

쿠버네티스 밖의 머신도 사이드카를 깔면 메시에 들어온다. WorkloadGroup 은 그런 머신들의 템플릿(라벨·서비스어카운트·포트), WorkloadEntry 는 머신 한 대(주소)이고, 쿠버네티스 서비스의 셀렉터가 WorkloadEntry 도 고르므로 VM 을 기존 서비스 이름 뒤에 둘 수 있다. 머신의 사이드카는 파드와 같은 방식으로 istiod 에서 인증서와 설정을 받는다.

왜 이게 필요했나

모든 것이 컨테이너로 옮겨 오지는 않는다. 오래된 결제 시스템, 라이선스가 묶인 데이터베이스 앞단, 특수 하드웨어가 붙은 서버가 남는다. 그 머신들이 메시 밖에 있으면 두 가지가 무너진다 — 메시 안 서비스가 그 머신을 부를 때 mTLS·인가가 끊기고, 그 머신이 메시 안을 부를 때 신원이 없어 STRICT 정책에 막힌다. 결국 예외 규칙(PERMISSIVE, 넓은 허용)이 생기고, 예외가 보안의 구멍이 된다.

VM 편입은 그 머신에 같은 사이드카를 깔아 같은 신원 체계에 넣는 방법이다.

어떻게 동작하나

1. 틀 — WorkloadGroup. 파드 템플릿처럼 '이런 머신은 이 라벨·서비스어카운트·포트를 갖는다' 를 적는다. istioctl x workload entry configure 가 이것을 읽어 머신에 건넬 파일 다섯을 만든다.

파일 머신에서의 자리 쓰임
cluster.env /var/lib/istio/envoy/ 네임스페이스·서비스어카운트·라벨·가로챌 포트
istio-token /var/run/secrets/tokens/ 처음 인증서를 받을 때 내미는 서비스어카운트 토큰
mesh.yaml /etc/istio/config/mesh 메시 설정(istiod 주소 등)
root-cert.pem /etc/certs/ 믿을 루트
hosts /etc/hosts 에 덧붙임 istiod 이름을 찾을 주소

2. 사이드카 — istio-sidecar 꾸러미. 공식 deb 가 pilot-agent·envoy·istio-start.sh 를 깐다. istio-start.sh 는 iptables 로 들고 나는 트래픽을 사이드카로 돌리는 규칙을 심고, istio-proxy 사용자로 pilot-agent 를 띄운다. pilot-agent 는 토큰으로 istiod 에 인증서를 요청하고, 그 뒤로는 파드의 사이드카와 똑같이 xDS 를 받는다.

3. 머신 한 대 — WorkloadEntry. 주소·라벨·서비스어카운트를 적는다. 라벨이 서비스 셀렉터와 맞으면 istiod 가 이 주소를 그 서비스의 엔드포인트로 모든 사이드카에 내려보낸다. istiod 에 자동 등록이 켜져 있으면 사이드카가 붙을 때 WorkloadEntry 가 저절로 생기지만, 이 기능은 설치 때 켜야 한다.

istiod 에 닿는 길. 여러 네트워크에 걸친 설치에서는 머신이 동서 게이트웨이를 거쳐 istiod 에 닿는다. 머신이 클러스터 서비스 주소에 바로 닿는 네트워크라면 istiod 의 주소를 직접 줄 수 있다.

이 실험실의 '메시 밖 머신'

세션마다 VM 이 한 대뿐이고 VM 끼리는 통신할 수 없다. 그래서 같은 VM 안의 네트워크 네임스페이스를 두 번째 머신으로 삼았다. 네트워크 네임스페이스는 주소·라우팅 표·iptables 를 통째로 따로 갖는 커널의 격리 단위라서, 사이드카의 가로채기 규칙은 그 안에만 들어간다. 실제로 재 보면 규칙은 네임스페이스 안의 iptables-legacy 쪽에 들어가고, 호스트(k3s 의 kube-proxy 규칙이 있는 쪽)에는 ISTIO 규칙이 하나도 생기지 않는다 — 둘은 부딪히지 않는다. 진짜 VM 과 다른 점은 파일시스템을 호스트와 나눠 쓴다는 것뿐이다.

현장에서 만나는 모습

"VM 의 사이드카가 뜨는데 istiod 에 붙지 않습니다." 대개 이름 풀이다. hosts 줄이 빠졌거나, DNS 가 클러스터 이름을 모른다. /var/log/istio/istio.log 에 연결 오류가 남는다.

"한 시간 뒤 새 VM 이 붙지 못합니다." istio-token 은 기본 한 시간짜리다. 처음 인증서를 받은 뒤에는 인증서로 갱신하지만, 처음 붙기 전에 토큰이 만료되면 새로 만들어야 한다.

"VM 을 서비스 뒤에 넣었는데 가끔 연결이 끊깁니다." 엔드포인트는 WorkloadEntry 가 있는 한 남는다. 머신이 죽어도 빠지지 않으므로, WorkloadGroup 의 probe 를 쓰는 자동 등록이나 이상치 감지를 함께 둔다.

공식 문서: Virtual Machine Installation · Virtual Machine Architecture · WorkloadEntry · WorkloadGroup

다음 실습에서 할 것

같은 VM 안의 네트워크 네임스페이스에서 도는 '메시 밖 머신' 을 먼저 밖에서 부르고, WorkloadGroup 과 서비스를 만들어 머신에 건넬 파일을 뽑는다. 파일을 제자리에 놓고 네임스페이스 안에서 사이드카를 띄워 istiod 에 붙인 뒤, iptables 규칙이 호스트와 부딪히지 않는 것을 세고, WorkloadEntry 로 서비스 뒤에 넣는다. 양쪽 방향으로 mTLS 가 맺어지는 것을 로그로 확인하고 STRICT 와 인가 정책까지 건다.