파드의 특징
쿠버네티스 서비스: 동일한 서비스를 제공하는 파드 그룹에 지속적인 단일 접점을 만들려고할 때 생성하는 리소스
ex) 백엔드와 프론트별 서비스 ip 생성 (서비스를 지원하는 파드가 여러개일 수 있음)
서비스 연결은 서비스 뒷단의 모든 파드로 로드밸런싱 된다.
→ 어떤 파드가 서비스의 일부분인지를 어떻게 구분하나?
그건 바로 ! 레이블 셀!렉!터!
kubectl expose로 서비스 생성
expose
명령어는 파드 셀렉터를 사용해 서비스 리소스를 생성하고 모든 파드를 단이 IP 주소와 포트로 노출한다.
YAML 디스크립터를 통한 서비스 생성
kubia-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: kubia
spec:
ports:
- port: 80 서비스가 사용할 포트
targetPort: 8080 서비스가 포워드할 컨테이너 포트
selector:
app: kubia 해당 레이블이 있는 파드가 이 서비스에 포함된다.
kubectl create 명령어 써서 서비스 생성
새 서비스 검사하기
하단이 생성된 서비스
클러스터 IP 이므로 클러스터 내부에서만 액세스할 수 있다.
(외부는 후에 함)
클러스터 내에서 서비스 테스트
클러스터 내에서 서비스로 요청 보낼 수 있음
이중 3번째 방법 해보자.
실행중인 컨테이너에 원격으로 명령어 실행
kubectl exec 명령어를 사용하면 기존 파드의 컨테이너 내에서 원격으로 임의의 명령어를 실행할 수 있음
→ 컨테이너의 내용, 상태, 환경 검사할 때 유용함
k exec 파드번호 -- curl -s <http://10.104.156.28>
<aside> 💡 더블 대시 사용하는 이유 : kubectl 명령줄 옵션의 끝을 의미한다.-s 옵션이 k exec 옵션으로 해석되지 않도록 한다.
</aside>
컨테이너의 주 프로세스가 서비스와 통신하는 것과 별반 다르지 않음
서비스의 세션 어피니티 구성
요청할때마다 다른 파드가 선택된다.
만약 매번 같은 파드로 리디렉션하려면 서비스의 sessionAffinity 속성을 기본값 None 대신 Client IP로 설정한다.
서비스 프록시는 동일한 클라이언트 IP의 요청을 동일한 파드로 전달한다.
서비스는 TCP,UDP 패킷을 처리하고 그들이 가지고 있는 페이로드는 신경쓰지 않는다. (HTTP 수준에서 작동하지 않기때문에 쿠키기반 세션 어피티니 옵션없음)
동일한 서비스에서 여러개의 포트 노출
여러 포트도 지원 가능하다. (멀티포트 서비스)
단일 클러스터 IP로 모든 서비스 포트가 노출된다.
(이때 각 포트의 이름 지정해야함)
apiVersion: v1
kind: Service
metadata:
name: kubia
spec:
ports:
- name: http 포트 80은 파드의 포트 8080에 매핑된다.
port: 80
targetPort: 8080
- name: https
port: 443 포트 443은 파드 포트 8443 에 매핑
targetPort: 8443
selector:
app: kubia 모든 서비스에 적용되는 레이블 셀렉터
지금 띄운 kubia 파드는 여러 포트로 서비스 하지 않기 때문에
멀티포트 서비스와 멀티포트 파드를 만드는 것은 독자의 몫…
이름이 지정된 포트 사용
apiVersion: v1
kind: Service
metadata:
name: kubia
spec:
ports:
- name: http
port: 80
targetPort: 8080
- name: https
port: 443
targetPort: 8443
selector:
app: kubia
포트별로 name 설정되어있다.
환경변수를 통한 서비스 검색
파드 시작시 쿠버네티스는 해당 시점에 존재하는 각 서비스를 가리키는 환경변수 세트를 초기화함.
클라이언트 파드 생성 전에 서비스를 생성하면 해당 파드의 프로세스는 환경변수를 검사해 서비스의 IP 주소와 포트를 얻을 수 있음
파드 먼저 생성 → 서비스 생성 하면 서비스에대한 환경변수 설정 불가능함.
k exec 파드번호 env