• 파드는 일시적이다(언제든 지워지고 새로 생성될 수 있다). 수평 스케일링 된 파드들은 동일한 서비스를 제공해야 한다. 매번 생성된 파드의 아이피를 알고 여러개의 파드들의 아이피를 매번 연결해주는 작업은 번거롭다. 이 문제를 해결하기 위해 ‘서비스’ 라는 리소스를 제공한다.
  • 서비스
    • 각 서비스는 고정된 ip와 포트를 가지고 있고 서비스로 들어온 요청은 서비스와 연결된 파드 중 하나로 연결된다.
    • 그렇기 때문에 각 파드의 아이피와 포트를 알 필요가 없어진다.
    • 서비스도 레이블 셀렉터를 이용해 파드와 연결을 한다.
    • kubectl expose 명령어로 레플리케이션 컨트롤러에 의해 생성된 파드에 바로 서비스를 달 수 있다.
    • yaml로 수동으로 생성하는 것도 가능하다.
  • 세션 어피니티
    • sessionAffinity: ClientIP
    • 특정 클라이언트의 요청을 특정 파드에만 보내도록 설정 할 수 있다.
  • 서비스는 쿠키를 안본다.
    • 서비스는 TCP와 UDP 패킷만 처리하고 페이로드는 신경쓰지 않는다.
    • 쿠키는 http 프로토콜에 포함되어 있으므로 쿠키는 보지 않는다.
    • 그렇기 때문에 세션 어피니티를 쿠키 기반으로 할 수 없다.
  • 서비스는 여러 포트를 열 수 있다.
    • 단일 포트 뿐만 아니라 80, 443 같이 멀티 포트도 지원한다.
    • 단 각 포트에 따라 다른 파드에 연결하는 것은 불가능하다.
    • 각 포트에 번호가 아닌 이름을 지정해서 사용할 수도 있다.
  • 서비스의 아이피와 포트 확인
    • 서비스가 생성되고 이제 확인을 해야한다.
    • 서비스의 아이피는 환경변수를 통해 확인 할 수 있다.
      • 서비스이름_SERVICE_HOST, 서비스이름_SERVICE_PORT 의 이름으로 저장된다.
    • DNS로 확인
      • 시스템 파드 중 kube-dns라는 파드가 있고 같은 이름의 서비스도 존재한다.
      • 얘들은 자체 dns서버를 실행하며 모든 파드는 자동으로 이를 사용하도록 구성된다.
      • 서비스들은 이 dns 항목을 가져올 수 있고 서비스의 이름을 알고 있으면 환경변수 대신 FQDN으로 접근할 수 있다.
        • FQDN(Fully Qualified Domain Name) : 서비스이름.네임스페이스.svc.cluster.local
  • 서비스는 내부 파드 뿐아니라 외부 아이피와도 연결 가능하다.
    • 서비스는 파드와 직접 연결하는 것이 아니라 레이블 셀렉터로 파드의 아이피를 가져와 엔드포인트로 구성하는 것이다.
    • 이 엔드 포인트를 수동으로 구성하면 외부 아이피와 연결이 가능하다.
    • 엔드포인트 리소스를 yaml로 새로 만들어서 수동구성한다.( 엔드포인트의 이름은 서비스의 이름과 같아야 한다.)
    • 엔드 포인트 대신 서비스 yaml파일에 ExternalName 항목으로 외부 DNS에 연결 시킬 수도 있다.
  • 외부에서 서비스에 연결할 수 있도록 하기
    • 노드포트 서비스를 만들기
    • 서비스 유형을 로드밸런서로 설정
    • 아이피 주소 하나로 서비스 여러개를 노출 시킬 수 있는 인그레스 리소스 만들기
  • 노드포트 서비스
    • 서비스를 만들때 type을 NodePort로 주어서 만든다.
    • 그러면 모든 노드에 nodePort로 설정한 포트가 열리고
    • 어떤 노드로 들어오더라도 이 포트로 들어온 요청은 이 서비스로 보내지게 된다.
    • 포트는 직접 열어주어야 한다.
    • 단, 노드의 아이피들에게 직접 요청을 해야한다.
    • 로드밸런싱을 위해 앞단에 로드밸런서를 두어야 한다.
  • 로드밸런서로 연결
    • 클라우드 공급자 ( AWS, Azure 등 )의 로드밸런서와 연결하여 사용할 수도 있다.
    • 서비스의 type을 LoadBalancer로 둔다.
    • 그러면 클라우드 공급자에서 자동으로 프로비저닝을 한다. ( 잠시만 기다리면 된다 )
    • 만약 클라우드 공급자가 없이 LoadBalancer로 두면 노드포트와 같이 동작한다.
      • LodaBalancer가 노드포트 서비스의 확장이기 때문에.
  • 외부 연결 특성
    • 불피요한 홉(경로) : 노드포트로 접속 할 때 만약 요청을 받은 노드에 보내려는 파드가 해당 노드에서 실행 중이지 않다면 추가적인 네트워크 홉이 필요하다.
    • 이런 홉을 방지 하고자 externalTrafficPolicy를 주면 만약 노드로 온 요청에 대한 파드를 가지고 있지 않으면 요청을 중지시킨다. 로드 밸런서로 요청 파드가 있는 노드에만 연결을 전달하도록 설정해야한다.
      • 단 이 방식은 노드에 균등하게 트래픽을 분산시킬 수 없다.
    • 클라이언트 IP가 보존되지 않음 : 노드포트에서 홉을 거쳐서 가게 되면 소스 네트워크 주소 변환( SNAT ) 이 일어나서 패킷의 소스 IP가 수정된다. 그렇기 때문에 파드는 클라이언트의 IP를 알 수가 없다.
    • 이 녀석들을 해결해 줄 인그레스는 다음에

+ Recent posts