CCA — 실리움 인증 어소시에이트 · 진짜 Cilium 에서 확인하기 · 실습
Cilium 이 실제로 막는 것을 본다
이 실습은 진짜 Cilium 에서 돕니다
VM 안에 k3s + Cilium 이 실제로 떠 있습니다. kube-proxy 를 끄고 Cilium 이
그 일을 대신하며(kubeProxyReplacement), L7 정책은 Envoy 가 실제로 강제하고,
Hubble 이 흐름을 모읍니다.
CCA 과정의 다른 실습은 CRD 만 적재된 가짜 클러스터에서 돕니다. 거기서는kubectl apply 가 통과할 뿐 아무것도 막지 않습니다. 여기서는 막힙니다.
처음 뜨는 데 4~5분 걸립니다. Cilium 을 설치하기 때문입니다.
목표
아이덴티티가 무엇인지 눈으로 확인하고, L3 정책과 L7 정책을 차례로 쌓은 뒤,
Hubble 로 "무엇이 왜 막혔는지" 를 읽습니다.
왜 중요한가
쿠버네티스 기본 NetworkPolicy 는 IP 로 판단합니다. 그런데 파드의 IP 는
재시작마다 바뀝니다. 그래서 규칙을 IP 로 쓰면 하루도 못 갑니다.
Cilium 은 파드의 라벨에서 아이덴티티 번호를 만들어 그것으로 판단합니다.app=tgt 라벨을 가진 파드는 몇 번을 재시작하든 같은 아이덴티티입니다. 이
한 겹 덕분에 정책이 IP 변화에 흔들리지 않고, 규모가 커져도 규칙 수가 파드 수가
아니라 아이덴티티 수를 따릅니다.
그리고 Cilium 은 HTTP 경로·메서드까지 봅니다. "이 서비스는 /api/read 만
호출할 수 있다" 를 네트워크 계층에서 강제할 수 있고, 막히면 연결이 끊기는 것이
아니라 403 이 돌아옵니다 — 애플리케이션 입장에서 훨씬 다루기 쉽습니다.
단계
1. cilium status 를 /root/cca/status.txt 에 저장하세요. KubeProxyReplacement: True 가 보여야 하고, kube-proxy 데몬셋은 없어야 합니다.
2. mesh 네임스페이스에 tgt(app=tgt, nginx)와 client(app=client, curl)를 만들고, tgt 의 아이덴티티 번호와 그 번호가 어떤 라벨에서 나왔는지를 /root/cca/identity.txt 에 저장하세요.
3. l3-allow CiliumNetworkPolicy 로 app=client 만 tgt 에 닿게 하고, 허용된 쪽과 아닌 쪽을 둘 다 시험해 /root/cca/l3.txt 에 저장하세요.
4. l7-allow 정책으로 /allowed 경로만 허용하세요. /secret 이 403 을 받는 것을 /root/cca/l7.txt 에 기록합니다.
5. 막히는 요청을 한 번 보낸 뒤 hubble observe 로 흐름을 관찰해 /root/cca/hubble.txt 에 저장하세요. FORWARDED 와 DROPPED 가 함께 보여야 합니다.
6. egress-fqdn 정책으로 tgt 가 특정 이름으로만 나갈 수 있게 하세요. 결과를 /root/cca/dnspolicy.txt 에 저장합니다.
7. hubble observe --type policy-verdict 로 왜 막혔는지 판정 로그를 뽑아 /root/cca/verdict.txt 에 저장하세요.
8. /root/cca/report.md 에 tgt_identity=, l7_denied_code=, policies= 세 줄과 설명을 쓰세요.
참고
- 아이덴티티는
kubectl get ciliumendpoint -n mesh tgt -o yaml의status.identity에 있습니다.cilium identity list로도 봅니다. - Hubble 은
hubble observe -n mesh --last 30처럼 씁니다. 먼저cilium hubble port-forward &가 필요합니다. - FQDN 정책은 Cilium 이 DNS 응답을 들여다봐야 동작합니다. 그래서
toFQDNs를 쓰려면 DNS 자체를 먼저toEndpoints+rules.dns.matchPattern으로 열어야 합니다. 이것을 빠뜨리면 이름이 아예 안 풀려서 정책이 동작하지 않습니다. - 흔한 실수 1: L7 정책에서
toPorts없이rules.http를 쓰는 것. HTTP 규칙은 포트 안에 들어갑니다. - 흔한 실수 2: L7 이 막았는데 연결 실패를 기대하는 것. Cilium 은 Envoy 로 프록시해서 403 을 돌려줍니다.
connection refused가 아닙니다.
단계 8개
- kube-proxy 없는 클러스터
- 정책은 IP 가 아니라 번호로 판단한다
- L3 — 누가 닿을 수 있는가
- L7 — 어느 경로까지 허용하는가
- 흐름을 눈으로 본다
- 이름으로 나가는 곳을 고른다
- 왜 막혔는지를 묻는다
- 무엇을 배웠나