728x90

service ↔ external 네트워크

  • 외부 트래픽이 LoadBalancer, NodePort, Ingress 등을 통해 쿠버네티스 클러스터에 진입함
  • 각 노드(Node A, Node B)는 호스트 네트워크 네임스페이스를 가지며, 여기에는 호스트 네트워크 인터페이스 카드(NIC)인 eth0가 있음
  • kube-proxy는 iptables/IPVS를 이용하여 네트워크 트래픽을 관리함
  • cni0 브릿지를 통해 veth0, veth1 등의 가상 이더넷 인터페이스가 연결됨
  • 각 파드(Pod)는 자신만의 네트워크 네임스페이스를 가지며, pause 컨테이너를 통해 다른 컨테이너들과 연결됨

쿠버네티스 애플리케이션을 외부 네트워크에 노출하는 방법

Service

쿠버네티스의 서비스(Service)는 NodePort를 설정하거나, 여러 파드(Pod)에 트래픽을 분산하기 위해 여러 기술을 활용함

가장 중요한 기술은 kube-proxy를 중심으로 동작하며, iptables 또는 IPVS를 사용하여 트래픽을 적절히 분산시킴

  • NodePort : 클러스터의 각 노드에서 지정된 포트를 열어 외부 트래픽을 수신
  • LoadBalancer : 클라우드 제공업체의 로드 밸런서를 사용하여 외부 트래픽을 분산
  • ExternalName : 클러스터 외부의 서비스에 대해 DNS 이름을 매핑할 수 있음

Ingress

  • Ingress controller 설치
    • Ingress를 사용하려면 클러스터에 Ingress Controller가 필요함
    • Ingress Controller는 클러스터 내에서 Ingress 리소스를 처리하고, 외부 트래픽을 내부 서비스로 라우팅함
  • 서비스 배포
    • Ingress를 통해 접근할 서비스를 먼저 배포해야 함
    • apiVersion: v1 kind: Service metadata: name: example-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: ClusterIP
  • ingress 리소스 생성
    • Ingress 리소스를 생성하여 특정도메인 example.com으로 오는 외부 트래픽을 요청을 특정 서비스 example-service로 라우팅하는 Ingress 리소스를 생성
    • apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: example-service port: number: 80
  • dns 설정
    • 도메인 이름과 ingress controller의 외부IP 주소를 매핑해야 함
728x90

+ Recent posts