CKA 자격증 획득 이후 추후 실무를 위한 개념정리를 위해 포스팅된 글입니다.
서비스: 클라이언트가 파드를 검색하고 통신을 가능하게 함
- 서비스
- Pod 집합과 같은 애플리케이션들에 접근하는 방법을 기술하는 API 객체
- 쿠버네티스의 서비스는 동일한 서비스를 제공하는 파드 그룹에 지속적인 단일 접점을 만들려고 할 때 생성하는 리소스로 각 서비스는 서비스가 존재하는 동안 절대 바뀌지 않는 IP 주소와 포트가 있습니다.
- 클라이언트는 해당 IP와 포트로 접속한 다음 해당 서비스를 지원하는 파드 중 하나로 연결됩니다.
- Service의 Cluster IP를 통해 유동적으로 생성되고 사라지는 Pod에 접근하기 위한 방법으로 사용합니다.
- ClusterIP , NodePort , LoadBalancer 타입 제공하며 기본 옵션은 클러스터 내부에서만 사용할 수 있는 Cluster IP입니다.
- 여러 Pod를 묶어 Healthy한 Pod로 Traffic 라우팅하는 로드 밸런싱 기능 제공합니다.
- 클러스터의 Service CIDR 중에서 지정된 IP로 생성 가능합니다.
-
apiVersion: v1 kind: Service metadata: name: kubia spec: ports: - port: 80 targetPort: 8080 selector: app: kubia
- 서비스 생성
- kubectl expose로 서비스 생성
- expose 명령어는 레플리케이션컨트롤러에서 사용된 것과 동일한 파드 셀렉터를 사용해 서비스 리소스를 생성하고 모든 파드를 단일 IP 주소와 포트로 노출합니다.
- 실행 중인 컨테이너에 원격으로 명령어 실행
- kubectl exec 명령어를 사용하면 기존 파드의 컨테이너 내에서 원격으로 임의의 명령어를 실행할 수 있습니다. 컨테이너의 내용, 상태, 환경을 검사할 때 유용합니다.
- kubectl exec {k get pods의 파드} -- curl -s {http://10.111.249.153 - k get svc의 클러스터 IP}
- 명령어의 더블 대시(--)는 kubectl 명령줄 옵션의 끝을 의미하며 더블 대시 뒤의 모든 것은 파드 내에서 실행돼야 하는 명령어입니다.
- kubectl expose로 서비스 생성
- 클러스터 외부에 있는 서비스 연결
-
apiVersion: v1 kind: Endpoints metadata: name: external-service subsets: - addresses: - ip: 11.11.11.11 - ip: 22.22.22.22 ports: - port: 80
- 서비스 엔드포인트
- 서비스는 파드에 직접 연결(link)되지 않습니다. 대신 엔드포인트 리소스가 그 사이에 있습니다.
- 엔드포인트 리소스는 서비스로 노출되는 파드의 IP 주소와 포트 목록입니다.
- 외부 서비스를 위한 별칭 생성
- ExternalName 서비스 생성
- 외부 서비스의 별칭으로 사용되는 서비스를 만들려면 유형(type) 필드를 ExternalName으로 설정해 서비스 리소스를 만듬
- ExternalName 서비스 생성
-
- 외부 클라이언트에 서비스 노출
- 외부에서 서비스를 액세스할 수 있는 방법
- 노드포트로 서비스 유형 설정 : 노드포트 서비스의 경우 각 클러스터 노드는 노드 자체에서 포트를 결고 해당 포트로 수신된 트래픽을 서비스로 전달합니다. 이 서비스는 내부 클러스터 IP와 포트로 액세스할 수 있을 뿐만 아니라 모든 노드의 전용 포트로도 액세스할 수 있습니다.
- 서비스 유형을 노드포트 유형의 확장인 로드밸런서로 설정 : 쿠버네티스가 실행 중인 클라우드 인프라에서 프로비저닝된 전용 로드밸런서로 서비스에 액세스할 수 있습니다. 로드밸런서는 트래픽을 모든 노도의 노드포트로 전달하며 클라이언트는 로드밸런서의 IP로 서비스에 액세스합니다.
- 단일 IP 주소로 여러 서비스를 노출하는 인그레스 리소스 만들기 : HTTP 레벨에서 작동하므로 4계층 서비스보다 더 많은 기능을 제공할 수 있습니다
- 노드포트 서비스 사용
-
apiVersion: v1 kind: Service metadata: name: kubia-nodeport spec: type: NodePort ports: - port: 80 targetPort: 8080 nodePort: 30123 selector: app: kubia
- 노드포트 서비스를 만들면 쿠버네티스는 모든 노드에 특정 포트를 할당하고(모든 노드에서 동일한 포트 번호가 사용됨) 서비스를 구성하는 파드로 들어오는 연결을 전달합니다.
- 일반 서비스(실제 유형은 ClusterIP)와 유사하지만 서비스의 내부 클러스터 IP뿐만 아니라 모든 노드의 IP와 할당된 노드포트로 서비스에 액세스할 수 있습니다.
- 노드포트 서비스 확인
-
$ kubectl get svc kubia-nodeport NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubia-nodeport 10.111.254.223 <nodes> 80:30123/TCP 2m
- EXTERNAL-IP에 라고 표시돼 있고 클러스터 노드의 IP 주소로 서비스에 액세스할 수 있음을 나타냄
-
- 외부 로드밸런서로 서비스 노출
- 클라우드 공급자에서 실행되는 쿠버네티스 클러스터는 일반적으로 클라우드 인프라에서 로드밸런서를 자동으로 프로비저닝하는 기능을 제공합니다.
- 로드밸런서는 공개적으로 액세스 가능한 고유한 IP주소를 가지며 모든 연결을 서비스로 전달합니다. 로드밸런서의 IP 주소로 서비스에 액세스할 수 있습니다.
- 외부에서 서비스를 액세스할 수 있는 방법
- 인그레스 리소스로 서비스 외부 노출
- 인그레스가 필요한 이유
- 로드밸런서 서비스는 자신의 공용 IP 주소를 가진 로드밸런서가 필요하지만, 인그레스는 한 IP 주소로 수십 개의 서비스에 접근이 가능하도록 지원해줍니다.
- 클라이언트가 HTTP 요청을 인그레스에 보낼 때, 요청한 호스트와 경로에 따라 요청을 전달할 서비스가 결정됩니다.
- 인그레스는 네트워크 스택의 애플리케이션 계층(HTTP)에서 작동하며 서비스가 할 수 없는 쿠키 기반 세션 어피니티 등과 같은 기능을 제공할 수 있습니다.
- 서비스 문제 해결
- 먼저 외부가 아닌 클러스터 내에서 서비스의 클러스터 IP에 연결되는지 확인합니다.
- 서비스에 액세스할 수 있는지 확인하려고 서비스 IP로 핑을 할 필요 없습니다.(서비스의 클러스터 IP는 가상 IP이므로 평되지 않습니다.)
- 레디니스 프로브를 정의했다면 성공했는지 확인하라. 그렇지 않으면 파드는 서비스에 포함되지 않습니다.
- 파드가 서비스의 일부인지 확인하려면 kubectl get endpoints를 사용해 해당 엔드포인트 오브젝트를 확인합니다.
- FQDN이나 그 일부(myservice.mynamespace.svc.cluster.local 또는 myservice.mynamespace)로 서비스에 액세스하려고 하는데 작동하지 않는 경우, FQDN 대신 클러스터 IP를 사용해 액세스할 수 있는지 확인합니다.
- 대상 포트가 아닌 서비스로 노출된 포트에 연결하고 있는지 확인합니다.
- 파드 IP에 직접 연결해 파드가 올바른 포트에 연결돼 있는지 확인합니다.
- 파드 IP로 애플리케이션에 액세스할 수 없는 경우 애플리케이션이 로컬호스트에만 바인딩하고 있는지 확인합니다.
Reference
'Back-End Development > Kubernetes' 카테고리의 다른 글
[kubernetes] Configmap & Secret (0) | 2023.04.20 |
---|---|
[kubernetes] Volume (0) | 2023.04.20 |
[kubernetes] ReplicationController & ReplicaSet (0) | 2023.04.08 |
[kubernetes] pod (0) | 2023.04.08 |
Kubernetes 개요 (0) | 2023.04.08 |