Networking

Networking 카테고리의 모든 포스트 - 한국어

1개의 포스트

기본네트워킹 다루기

📌 Kubernetes 네트워킹 실전 매뉴얼

목표: Kubernetes 네트워킹 개념을 중요도/빈도순으로 정리하고, 명령어 + 장애 사례 + 해결 방법 + 실전 예제를 함께 제공


1. Service 타입 & 동작원리

📖 개념

  • Pod는 재시작 시 IP가 변경됨 → 고정 IP 대신 Service로 접근
  • Service 종류:
    • ClusterIP: 클러스터 내부 전용
    • NodePort: 각 노드의 특정 포트를 외부에 개방
    • LoadBalancer: 외부 LB IP를 할당
    • Headless Service: DNS로 개별 Pod IP 반환

🔧 필수 명령어

kubectl get svc -A -o wide
kubectl describe svc my-service
kubectl get endpoints my-service -o wide

💡 실전 예제

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP

⚠️ 자주 겪는 문제 & 해결

  • 문제: Service는 있는데 Pod 연결 안 됨
    원인: Selector 라벨 불일치
    해결: kubectl get pod --show-labels로 라벨 확인 후 Service 수정

2. Pod-to-Pod 통신 (CNI)

📖 개념

  • CNI 플러그인(Calico, Flannel 등)이 Pod 간 네트워크를 연결
  • Pod CIDR은 노드별로 분리

🔧 필수 명령어

kubectl get pods -o wide
kubectl exec -it pod-a -- ping <pod-b-ip>
kubectl exec -it pod-a -- curl http://<pod-b-ip>:<port>

💡 실전 예제

  • Calico 설치
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

⚠️ 문제 & 해결

  • 문제: 다른 노드 Pod 간 ping 불가
    해결: CNI 포트(예: 4789/UDP, 179/TCP) 방화벽 허용

3. DNS & CoreDNS

📖 개념

  • 내부 DNS 서버로 CoreDNS 사용
  • svc-name.namespace.svc.cluster.local 형식

🔧 필수 명령어

kubectl exec -it pod-a -- nslookup my-service
kubectl exec -it pod-a -- dig my-service +short

💡 실전 예제

  • ExternalName 서비스
apiVersion: v1
kind: Service
metadata:
  name: external-service
spec:
  type: ExternalName
  externalName: example.com

⚠️ 문제 & 해결

  • 문제: 특정 네임스페이스에서만 DNS 실패
    해결: FQDN(my-service.namespace)로 호출

4. Ingress & Ingress Controller

📖 개념

  • HTTP/HTTPS 트래픽 라우팅
  • Ingress Controller(NGINX, Traefik)가 실제 처리

🔧 필수 명령어

kubectl get ingress -A
kubectl describe ingress my-ingress
kubectl logs -n ingress-nginx <controller-pod>

💡 실전 예제

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
    - host: myapp.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-service
                port:
                  number: 80

5. MetalLB / LoadBalancer

📖 개념

  • 온프레미스 환경에서 LoadBalancer 타입 구현
  • L2/L3 모드

🔧 필수 명령어

kubectl get ipaddresspool -n metallb-system
kubectl get l2advertisement -n metallb-system

💡 실전 예제

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
    - 192.168.0.240-192.168.0.250

6. NetworkPolicy

📖 개념

  • Pod 간 트래픽 제어

🔧 필수 명령어

kubectl get netpol -A
kubectl describe netpol my-policy

💡 실전 예제

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-nginx
spec:
  podSelector:
    matchLabels:
      app: nginx
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: allowed-app
      ports:
        - protocol: TCP
          port: 80

7. Node-to-Pod & 외부 통신

📖 개념

  • ExternalTrafficPolicy=Local → 클라이언트 IP 유지
  • ExternalTrafficPolicy=Cluster → 로드밸런싱

💡 실전 팁

kubectl edit svc my-service
# spec.externalTrafficPolicy: Local

8. Port Forwarding

kubectl port-forward svc/my-service 8080:80

9. kube-proxy & iptables/IPVS

📖 개념

  • Service IP → Pod IP 변환 처리
  • iptables vs ipvs 모드

💡 상태 확인

kubectl get configmap kube-proxy -n kube-system -o yaml

10. 네트워크 트러블슈팅 명령어 모음

kubectl get pod -o wide
kubectl get svc -o wide
kubectl exec -it <pod> -- traceroute <ip>
kubectl exec -it <pod> -- tcpdump -i eth0 port 80

📌 Best Practice 모음

  1. 서비스 라벨 규칙 표준화 → Selector 오류 방지
  2. CNI 선택 시 성능/보안 고려 → Calico(CNI+NetworkPolicy), Cilium(eBPF)
  3. Ingress는 TLS 필수 → cert-manager로 자동 발급
  4. MetalLB IP Pool은 DHCP 범위와 겹치지 않게
  5. NetworkPolicy는 점진적 적용
  6. 모든 네트워크 구성은 IaC(GitOps)로 관리
  7. 테스트용 PortForward 적극 활용