문제 해결

문제 해결 (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 list Endpoint Source FQDN TTL ExpirationTime IPs 725 lookup api.github.com. 3600 2023-02-10T18:16:05.842Z 140.82.121.6 725 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.6 140.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를 참고하세요.

더 알아보기 (Learn more)