- 외부에서 내부 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 |