
여러 플러그인이 사용 가능하며 다음과 같은 것들이 있습니다.
설치하려면:
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
네트워크 플러그인에 대한 자세한 내용은 다음 문서에서 확인할 수 있습니다:
https://kubernetes.io/docs/concepts/cluster-administration/addons/#networking-and-network-policy
설치하려면:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
참고: 현재 Flannel은 Kubernetes 네트워크 정책을 지원하지 않습니다.
설치하려면:
curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml -O
다음 명령어를 사용하여 매니페스트를 적용합니다:
kubectl apply -f calico.yaml
Calico는 가장 고급 CNI 네트워크 플러그인으로 알려져 있습니다.
CKA 및 CKAD 시험에서는 CNI 플러그인 설치를 요구하지 않습니다. 하지만 요구된다면 설치할 정확한 URL이 제공됩니다.
참고: 디렉토리에 여러 CNI 구성 파일이 있는 경우, kubelet은 사전식 순서로 이름이 가장 앞서는 구성 파일을 사용합니다.
Kubernetes는 CoreDNS를 사용합니다. CoreDNS는 Kubernetes 클러스터 DNS 역할을 할 수 있는 유연하고 확장 가능한 DNS 서버입니다.
대규모 Kubernetes 클러스터에서 CoreDNS의 메모리 사용량은 주로 클러스터의 파드와 서비스 수에 영향을 받습니다. 다른 요인으로는 채워진 DNS 응답 캐시의 크기와 CoreDNS 인스턴스당 수신되는 쿼리 비율(QPS)이 있습니다.
CoreDNS를 위한 Kubernetes 리소스는 다음과 같습니다:
CoreDNS 배포를 분석할 때 Corefile 플러그인이 컨피그맵으로 정의된 중요한 구성을 포함하고 있음을 확인할 수 있습니다.
DNS 해석을 위해 포트 53이 사용됩니다.
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
이것은 cluster.local과 역방향 도메인을 위한 k8s의 백엔드입니다.
proxy . /etc/resolv.conf
클러스터 외부 도메인을 올바른 권한 있는 DNS 서버로 직접 전달합니다.
CoreDNS 파드가 대기 상태에 있는 경우 먼저 네트워크 플러그인이 설치되어 있는지 확인하세요.
CoreDNS 파드가 CrashLoopBackOff 또는 Error 상태인 경우
구버전 Docker를 사용하는 SELinux가 실행 중인 노드가 있다면 CoreDNS 파드가 시작되지 않는 상황이 발생할 수 있습니다. 이를 해결하기 위해 다음 옵션 중 하나를 시도할 수 있습니다:
a) 새 버전의 Docker로 업그레이드
b) SELinux 비활성화
c) CoreDNS 배포를 수정하여 allowPrivilegeEscalation을 true로 설정:
kubectl -n kube-system get deployment coredns -o yaml | \
sed 's/allowPrivilegeEscalation: false/allowPrivilegeEscalation: true/g' | \
kubectl apply -f -
d) CoreDNS가 CrashLoopBackOff 상태가 되는 또 다른 원인은 Kubernetes에 배포된 CoreDNS 파드가 루프를 감지할 때입니다.
이 문제를 해결하는 여러 방법이 있으며, 그 중 일부는 다음과 같습니다:
resolvConf: <실제-resolv-conf-파일-경로> 이 플래그는 kubelet에게 파드에 대체 resolv.conf를 전달하도록 지시합니다. systemd-resolved를 사용하는 시스템의 경우 /run/systemd/resolve/resolv.conf가 일반적으로 “실제” resolv.conf의 위치이지만 배포판에 따라 다를 수 있습니다.forward . /etc/resolv.conf를 업스트림 DNS의 IP 주소(예: forward . 8.8.8.8)로 교체하는 것입니다. 하지만 이는 CoreDNS에 대해서만 문제를 해결하고, kubelet은 계속해서 잘못된 resolv.conf를 모든 기본 dnsPolicy 파드에 전달하여 DNS 해석을 할 수 없게 만듭니다.CoreDNS 파드와 kube-dns 서비스가 정상 작동하는 경우 kube-dns 서비스가 유효한 엔드포인트를 가지고 있는지 확인하세요.
kubectl -n kube-system get ep kube-dns
서비스에 엔드포인트가 없다면 서비스를 검사하고 올바른 셀렉터와 포트를 사용하는지 확인하세요.
kube-proxy는 클러스터의 각 노드에서 실행되는 네트워크 프록시입니다. kube-proxy는 노드에서 네트워크 규칙을 유지합니다. 이러한 네트워크 규칙은 클러스터 내부 또는 외부의 네트워크 세션에서 파드로의 네트워크 통신을 허용합니다.
kubeadm으로 구성된 클러스터에서는 kube-proxy를 데몬셋으로 찾을 수 있습니다.
kubeproxy는 서비스와 각 서비스와 연관된 엔드포인트를 감시하는 역할을 합니다. 클라이언트가 가상 IP를 사용하여 서비스에 연결하려고 할 때 kubeproxy가 실제 파드로 트래픽을 전송하는 역할을 합니다.
kubectl describe ds kube-proxy -n kube-system을 실행하면 kube-proxy 바이너리가 kube-proxy 컨테이너 내에서 다음 명령어로 실행되는 것을 볼 수 있습니다:
Command:
/usr/local/bin/kube-proxy
--config=/var/lib/kube-proxy/config.conf
--hostname-override=$(NODE_NAME)
구성 파일 /var/lib/kube-proxy/config.conf에서 구성을 가져오며 파드가 실행되는 노드 이름으로 호스트명을 재정의할 수 있습니다.
구성 파일에서는 clusterCIDR, kubeproxy 모드, ipvs, iptables, bindaddress, kube-config 등을 정의합니다.
# netstat -plan | grep kube-proxy
tcp 0 0 0.0.0.0:30081 0.0.0.0:* LISTEN 1/kube-proxy
tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 1/kube-proxy
tcp 0 0 172.17.0.12:33706 172.17.0.12:6443 ESTABLISHED 1/kube-proxy
tcp6 0 0 :::10256 :::* LISTEN 1/kube-proxy
서비스 문제 디버깅:
https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service/
DNS 문제 해결:
https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/