• 외부에서 내부 Pod로의 연결 가능 (targetPort)
  • Pod의 Label과 Service의 Selector 맵핑으로 연결
  • 내부 DNS 에 자동 등록

  • Pod는 2.x.x.x 대역
  • Service는 1.x.x.x.x 의 고정아이피
  • Client -> Service -> [Load Balancer(L4 스위치 기능수행)] -> pod
  • 하위 객체에 Lable을 달아서 상위객체(service)에서 Selector로 연결
  • DNS 또한 Pod 형태로 띄워져 있음
  • Service 객체를 만들면 DNS쪽에 객체가 생성

service의 yaml 명세서 확인

apiVersion: v1 
kind: Service 
metadata: 
name: test-svc 
spec: 
ports: 
-port: 80 (서비스 포트 80) 
targetPort: 8080 (pod 안에 expose가 8080 포트 : Service 객체는 80으로 요청오면 8080으로 전달해 줌) 
selector: 
run:test

Endpoint Controller

  • 서비스 객체를 만들면 LB 기능을 한다.
  • 그러려면 pod 안에 컨테이너 포트/타겟 포트의 조합을 알아야 한다.
  • 즉 엔드포인트 라는 하위 리소스가 자동으로 만들어 짐

Service Types

- 4가지의 서비스타입이 존재
1.ClusterIP

  • 사설IP 내부통신만 가능
  • 하나의 노드에 부하될 수 있는 문제점이 있음 

2.NodePort

  • ClusterIP + HostPort  서비스 객체를 생성하면 내부적인 iptables 룰셋, DNS 룰셋 등등 [내부 - 외부]간 통신 가능하도록 설정. 누가? Kube-proxy가 한다.
  • 외부에서 내부 pod를 접근하려면 HostPort가 필요
  • 1,2는 온프레미스 환경에서 k8s 구축시 사용
  • 서비스의 iptables를 바탕으로 End Point 를 갖고 노드에 분산시킴
  • 인바운드 리퀘스트를 분산시킴 

3.LoadBalancer

  • NodePort + LB 연동 추가
  • 클라우드 환경에서 k8s 구축시 사용 

4.ExternalName

  • CNAME 레코드
  • 1, 2, 3은 외부 -> 내부pod 접근하기 위한 방법
  • 4은 내부pod -> 외부 서비스를 접근하기 위한 방법

서비스 객체 생성하기

- kubectl expose deployment nginx --port=80 --target-port=8000 : deployment 의 service 객체 생성 

1) --port=80 : 서비스 객체 포트 명시
2) --target-port=8000 : pod안의 Container 포트 명시

 

- 1번째로 ClustIP 타입의 svc 생성 후 확인

root@ip-172-31-4-27:~# kubectl get svc 
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE 
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   5h2m 
root@ip-172-31-4-27:~# kubectl get ep 
NAME         ENDPOINTS          AGE 
kubernetes   172.31.4.27:6443   5h3m 

1) pod IP : 172.31.4.27
2) api-server port :  6443

 

- 2번째로 NodePort 타입으로 Service 실행

root@ip-172-31-4-27:~# kubectl expose deployment hwk --port 80 --name web-hwk --type NodePort 
service/web-hwk exposed 
root@ip-172-31-4-27:~# kubectl get svc 
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE 
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        5h16m 
web-hwk      NodePort    10.107.229.55   <none>        80:32472/TCP   4s 해당 IP:PORT로 로 접근한다는 것은 SVC로 접근 한다는 뜻 
root@ip-172-31-4-27:~# kubectl get ep 
NAME         ENDPOINTS          AGE 
kubernetes   172.31.4.27:6443   5h16m 
web-hwk      192.168.82.6:80    13s 해당 IP:PORT로 접근하는것은 pod로 직접 접근한다는 뜻 
root@ip-172-31-4-27:~# kubectl get po hwk-66fdbfb65d-smrz5 -o wide 
NAME                   READY   STATUS    RESTARTS   AGE    IP             NODE               NOMINATED NODE   READINESS GATES 
hwk-66fdbfb65d-smrz5   1/1     Running   0          103m   192.168.82.6   ip-172-31-13-180   <none>           <none> 

- 실제 AWS EC2 public IP : 32472 로 접근이 가능하다.
- 순서 : 
1) 10.107.229.55:32472 요청
2) SVC는 -> 192.168.82.6:80 의 pod로 접근

'클라우드 컴퓨팅 & NoSQL > k8s' 카테고리의 다른 글

pod 에 내부 명령 실행과 connect  (0) 2020.12.01
pod 확장 (scale out)  (0) 2020.12.01
Object Template (--dry run 사용하기)  (0) 2020.12.01
Deployment  (0) 2020.12.01
ReplicaSet  (0) 2020.12.01

+ Recent posts