문제 해결
문제 해결 (Troubleshooting)
정책 규칙과 엔드포인트의 매핑, 그리고 toFQDNs 규칙 문제를 해결하는 방법을 설명하는 문서예요. cilium-dbg CLI 도구를 사용해 정책 상태를 검사하는 방법을 다뤄요.
출처: Troubleshooting
본문
정책 규칙에서 엔드포인트 매핑 (Policy Rule to Endpoint Mapping)
엔드포인트에 현재 적용 중인 정책 규칙을 확인하려면, cilium-dbg endpoint list와 cilium-dbg endpoint get의 데이터를 cilium-dbg policy get의 데이터와 짝지어 사용할 수 있어요. cilium-dbg endpoint get은 엔드포인트에 적용되는 각 규칙의 라벨을 나열해요. 그 라벨 목록을 cilium-dbg policy get에 전달해 정확한 출처 정책을 보여줄 수 있어요. 라벨이 없는 규칙은 단독으로 가져올 수 없다는 점에 유의하세요(라벨 없는 cilium-dbg policy get은 노드의 전체 정책을 반환해요). 같은 라벨을 가진 규칙은 함께 반환돼요.
위 예제에서 deathstar 파드 중 하나의 엔드포인트 ID는 568이에요. 다음으로 그것에 적용된 모든 정책을 출력할 수 있어요.
$ # Get a shell on the Cilium pod
$ kubectl exec -ti cilium-88k78 -n kube-system -- /bin/bash
$ # print out the ingress labels
$ # clean up the data
$ # fetch each policy via each set of labels
$ # (Note that while the structure is "...l4.ingress...", it reflects all L3, L4 and L7 policy.
$ cilium-dbg endpoint get 568 -o jsonpath='{range ..status.policy.realized.l4.ingress[*].derived-from-rules}{@}{"\n"}{end}'|tr -d '][' | xargs -I{} bash -c 'echo "Labels: {}"; cilium-dbg policy get {}'
Labels: k8s:io.cilium.k8s.policy.name=rule1 k8s:io.cilium.k8s.policy.namespace=default
[
{
"endpointSelector": {
"matchLabels": {
"any:class": "deathstar",
"any:org": "empire",
"k8s:io.kubernetes.pod.namespace": "default"
}
},
"ingress": [
{
"fromEndpoints": [
{
"matchLabels": {
"any:org": "empire",
"k8s:io.kubernetes.pod.namespace": "default"
}
}
],
"toPorts": [
{
"ports": [
{
"port": "80",
"protocol": "TCP"
}
],
"rules": {
"http": [
{
"path": "/v1/request-landing",
"method": "POST"
}
]
}
}
]
}
],
"labels": [
{
"key": "io.cilium.k8s.policy.name",
"value": "rule1",
"source": "k8s"
},
{
"key": "io.cilium.k8s.policy.namespace",
"value": "default",
"source": "k8s"
}
]
}
]
Revision: 217
$ # repeat for egress
$ cilium-dbg endpoint get 568 -o jsonpath='{range ..status.policy.realized.l4.egress[*].derived-from-rules}{@}{"\n"}{end}' | tr -d '][' | xargs -I{} bash -c 'echo "Labels: {}"; cilium-dbg policy get {}'
toFQDNs 규칙 문제 해결 (Troubleshooting toFQDNs rules)
toFQDNs 규칙은 엔드포인트를 다루는 L7 DNS 규칙이 없으면 아무것도 하지 않아요.
toFQDNs의 효과는 DNS 데이터가 변함에 따라 정책이 적용된 후 오랜 시간이 지난 뒤에 바뀔 수 있어요. 이로 인해 예상치 못하게 차단된 연결이나 일시적 실패를 디버깅하기 어려울 수 있어요. Cilium은 데몬의 여러 계층에서 FQDN 정책 적용 상태를 들여다보는 CLI 도구를 제공해요.
cilium-dbg policy get은 가져온 FQDN 정책을 보여줘야 해요.{ "endpointSelector" : { "matchLabels" : { "any:class" : "mediabot" , "any:org" : "empire" , "k8s:io.kubernetes.pod.namespace" : "default" } }, "egress" : [ { "toFQDNs" : [ { "matchName" : "api.github.com" } ] }, { "toEndpoints" : [ { "matchLabels" : { "k8s:io.kubernetes.pod.namespace" : "kube-system" , "k8s:k8s-app" : "kube-dns" } } ], "toPorts" : [ { "ports" : [ { "port" : "53" , "protocol" : "ANY" } ], "rules" : { "dns" : [ { "matchPattern" : "*" } ] } } ] } ], "labels" : [ { "key" : "io.cilium.k8s.policy.derived-from" , "value" : "CiliumNetworkPolicy" , "source" : "k8s" }, { "key" : "io.cilium.k8s.policy.name" , "value" : "fqdn" , "source" : "k8s" }, { "key" : "io.cilium.k8s.policy.namespace" , "value" : "default" , "source" : "k8s" }, { "key" : "io.cilium.k8s.policy.uid" , "value" : "f213c6b2-c87b-449c-a66c-e19a288062ba" , "source" : "k8s" } ] }- DNS 요청을 만든 후 FQDN에서 IP 매핑은
cilium-dbg fqdn cache list로 사용할 수 있어야 해요.# cilium-dbg fqdn cache listEndpoint Source FQDN TTL ExpirationTime IPs725 lookup api.github.com. 3600 2023-02-10T18:16:05.842Z 140.82.121.6725 lookup support.github.com. 3600 2023-02-10T18:16:09.371Z 185.199.111.133,185.199.109.133,185.199.110.133,185.199.108.133 - 트래픽이 허용되면, 이 IP들에 해당하는 로컬 신원이
cilium-dbg ip list | grep <IP>로 있어야 해요.# cilium-dbg ip list | grep -A 1 140 .82.121.6140.82.121.6/32 fqdn:api.github.com reserved:world
toFQDNs 신원 사용 모니터링 (Monitoring toFQDNs identity usage)
toFQDNs 선택자를 사용할 때, 일치하는 DNS 조회에서 관찰된 모든 IP는 그 선택자로 라벨링돼요. DNS 이름은 여러 선택자와 일치할 수 있고, IP는 여러 이름에 매핑될 수 있으므로, IP는 여러 선택자로 라벨링될 수 있어요. 일반 클러스터 신원과 마찬가지로, 고유한 라벨 조합마다 자체 숫자 보안 신원을 할당해요. 이는 Limiting Identity-Relevant Labels에 설명된 것처럼 많은 서로 다른 신원이 할당될 수 있게 해요.
toFQDNs 신원의 잠재적인 신원 고갈을 감지하려면, 할당된 FQDN 신원 수를 identity_label_sources{type="fqdn"} 메트릭으로 모니터링할 수 있어요. 비교 기준으로 fqdn_selectors 메트릭은 등록된 toFQDNs 선택자 수를 모니터링해요. 메트릭에 대한 자세한 내용은 Monitoring & Metrics를 참고하세요.