20210830 (월) service의 종류
9:33 review
Controller
Pod의 정상 동작을 위하여 특정 상태를 보장하는 오브젝트
ReplicationController
일정갯수만큼 pod가 복제되어 동작하는 것을 보장하는 컨트롤러
kubectl get replicationcontrollers
kubectl describe replicationcontrollers RC
kubectl scale replicationcontrollers RC --replicas N
ReplicaSet
ReplicationController와 유사한 Controller
ReplicationController가 일치성 기반의 Label Selector만 지원했던 것과 달이 집합성 기반으로 Label Selector도 지원
ReplicaSet의 Label Selector
- matchLabels
ReplicationController의 Label Selector와 동일한 동작을 수행(Label이 완전히 일치하는 경우)
key: value
- matchExpressions
집합성 기반의 Label Selector
key
value
operator (In, NotIn, Exists, DoesNotExis)
DaemonSet
노드 레이블 미지정시 Cluster의 모든 노드에 pod를 한개씩 실행함
노드 레이블 지정시 해당 노드레이블이 있는 노드에 pod를 한개씩 실행함
Job
pod의 애플리케이션이 실행되고 정상 종료되는 것에 초점을 맞춘 컨트롤러
앞서 살펴본 컨트롤러와 달리 애플리케이션 실행을 마치면 정상종료하도록 함
CronJob : 작업예약
===============
네트워크
※ 전통적인 네트워크와 Kubernetes 네트워크의 차이점
pod는 일회성으로 동작하며 언제든지 제거될 수 있음
특정 노드에 pod가 스케쥴 되고 IP주소가 동적으로 할당되어 클라이언트가 IP주소를 예측할 수 없음
분산 아키텍쳐 및 수평적 스케일링의 경우 같은 애플리케이션을 복수의 pod가 제공함
Cluster 내부 네트워크
Service
애플리케이션을 실행하고 있는 컨트롤러의 pod 그룹에 대한 단일 네트워크 진입점을 제공하는 오브젝트
별도의 종료 전까지는 부여된 IP주소가 변경되지 않음
Label Selector를 이용하여 서비스 대상 pod를 관리하며 서비스에 선택된 파드의 목록을 엔드포인트가 관리
- 서비스 생성(명령어)
kubectl expose CONTROLLER_TYPE CONTROLLER_NAME --name SERVICE_NAME
- 서비스 생성 (Manifest 파일 작성) 후 kubectl create -f FILE
apiVersion: v1
kind: Service
metadata:
name: SERVICE_NAME
LABEL_KEY: LABEL_VALUE
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: myapp-rs
1) 서비스(기본 형태)
※ SessionAffinity
Client의 요청을 매번 동일한 pod에서 처리하고자 할 때 사용
2) 서비스(다중 포트)
3) 서비스(named port)
: Controller/Pod의 manifest작성시, ports항목에서 포트에 이름을 지정하여 이름으로 포트 번호(targetPort)를 참조
서비스 탐색(Service Discovery)
1) 환경 변수를 이용한 서비스 탐색 (Service Discovery)
{SERVICE_NAME}_SERVICE_HOST={SERVICE_IP}
{SERVICE_NAME}_SERVICE_PORT={SERVICE_PORT}
{SERVICE_NAME}_PORT={PROTOCOL}://{SERVICE_IP}:{SERVICE_PORT}
{SERVICE_NAME}_PORT_{PORT_NUMBER}_{PROTOCOL}_ADDR={PROTOCOL}://{SERVICE_IP}:{SERVICE_PORT}
{SERVICE_NAME}_PORT_{PORT_NUMBER}_{PROTOCOL}_PORT={SERVICE_PORT}
{SERVICE_NAME}_PORT_{PORT_NUMBER}_{PROTOCOL}_PORT={PROTOCOL}
2) Kubernetes Cluster의 내부 DNS를 이용한 서비스 탐색 (Service Discovery)
vagrant@kube-control1:~/work/20210830$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE myapp-svc ClusterIP 10.99.154.209 <none> 80/TCP 3h23m $ kubectl run nettool -it --image devops2341/network-multitool:v1 --rm bash bash-5.1# cat /etc/resolv.conf nameserver 10.96.0.10 search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5 bash-5.1# curl http://myapp-svc Hello World! bash-5.1# curl http://myapp-svc.default Hello World! bash-5.1# curl http://myapp-svc.default.svc Hello World! bash-5.1# curl http://myapp-svc.default.svc.cluster.local Hello World! ▶ Kubernetes cluster FQDN 형태 SERVICE_NAME.NAMESPACE.svc.clsuter.local (myapp.default~) SERVICE_NAME.NAMESPACE.K8S_OBJECT_TYPE.CLUSTER_DOMAIN |
Service 종류
- Cluster IP
Kubernetes Cluster 내부 서비스
- NodePort
NodePort + Cluster IP
Kubernetes Cluster의 모든 노드에 외부 접근용 포트를 할당하는 서비스
노드의 Port를 사용하여 Kubernetes Cluster 외부에서 접근이 가능함
노드의 Port로 접근하면 Service를 통해 Pod로 리다이렉션 됨
Pod를 실행하고 있지 않은 노드에도 포트가 할당되며 접근이 가능함.
- LoadBalancer
LoadBalancer + NodePort + ClusterIP
NodePort의 확장된 개념으로 Kubernetes 외부의 Loadbalancer를 이용하여 외부에서 접근하게 해주는 서비스
외부의 LoadBalancer로 접근시 서비스를 통해 Pod로 리다이렉션함
CSP(AWS, GCP, Azure) 등에서 지원.
On-premise 환경에서는 metallb를 사용하여 LoadBalancer 타입의 서비스 오브젝트를 사용할 수 있음.