- Service 는 수시로 바뀌는 pod ip 에 대한 문제를 해결하기 위한 기능이다.
- Deployment 를 기반으로 service 를 생성하면 kubernetes 내에서 사용가능한 변하지 않는 ip 가 생성된다.
- 해당 ip 로 접속할 경우 준비된 pod 의 ip 와 상관없이 접속시킬 수 있다.
✏️ Cluster
- get all 로 deployment 를 확인 후 service 를 생성하면 편리하다.
📍 Cluster 생성
--type
: 생략하면 “ClusterIP” 로 생성된다.
--port
: 생성할 클러스터 ip 의 포트
--target-port
: 연결할 pod 의 포트
--name
: 생성할 클러스터의 이름 (생략하면 deployment 와 동일한 이름이 생성됨)
kubectl expose 디플로이명 --type="ClusterIP" --port 8080 --target-port=80 --name==서비스명
📍 확인하기
kubectl get all
로 생성된 serveice 를 확인할 수 있다.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5h8m
service/webserver ClusterIP 10.98.217.225 <none> 8080/TCP 115s
- 생성한 cluster ip 와 포트를 같이 입력하면 생성된 노드중 원활한 쪽으로 자동으로 로드 벨런징해 접속시켜준다.
- 클러스터 ip 에서는 디테일한 로드벨런싱이 아닌 단순히 랜덤으로 나눠주는 정도의 수준이다.
curl 클러스터아이피:포트
✏️ Node Port
- Cluster 와 기능은 같고, 추가로 포트 외부 연동기능이 추가되었다.
📍 생성하기
- Cluster ip 생성과 동일하지만
--type
을 NodePort 로 명시해줘야 한다.
- Cluster 와 다르게 외부에서도 접속이 가능한 Service 이다.
kubectl expose 디플로이명 --type="NodePort" --port 8080 --target-port=80 --name=서비스명
- 새로운 service 가
NodePort
로 생성된것을 확인할 수 있다.
- public IP + 발급받은 포트로 외부 브라우저에서 접속이 가능하다.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6h17m
service/node NodePort 10.98.227.48 <none> 8080:32072/TCP 14s
service/webserver ClusterIP 10.98.217.225 <none> 8080/TCP 70m
http://공인IP:32072
⚠️ 접속이 안되는경우
- Node Port 를 생성해도 접속이 안된다면 보안 규칙에 막혀있을 경우가 크다.
- 랜덤으로 생성된 port 의 대역은 30000 ~ 32767 로 해당 포트에 대한 접속을 먼저 허용시켜줘야 한다.
✏️ LoadBalancer
- Node Port 와 기능은 같고, 추가로 외부 IP 까지 지정할 수 있다.
- 참고로 일반적으로 사용되는 로드벨런서와는 다른 개념이다.
- 일반적으로 생각되는 로드벨런싱 기능을 사용하려면 로드벨런싱 툴과 연동을 시켜줘야 한다.
📍 생성하기
kubectl expose deployment 디플로이명 --type="LoadBalancer" --port 8080 --target-port=80 --name=서비스명
- 지금까지와는 다르게
EXTERNAL-IP
가 pending 으로 설정되어있다.
- external ip 는 외부에서 접근할 수 있는 공인 ip 를 뜻한다.
- 따로 설정해주지 않으면 지금처럼 pending 으로 표시된다.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6h54m
service/loadbalancer LoadBalancer 10.99.215.227 <pending> 8080:30544/TCP 6s
--external-ip=공인아이피
속성을 추가해 온전한 service 를 생성시켜줄 수 있다.
kubectl expose deployment 디플로이명 --type="LoadBalancer" --port 8080 --target-port=80 --name=서비스명 --external-ip=공인아이피
- external ip 가 제대로 설정된것을 확인할 수 있다.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7h3m
service/loadbalancer LoadBalancer 10.105.33.46 49.50.172.48 8080:31813/TCP 6s
✏️ Service 삭제하기
- 이렇게 생성된 service 들은 아래 명령어로 삭제할 수 있다.
- 기본적으로 설치되어있는 kubernetes 는 삭제하더라도 몇초후 다시 생성되기 때문에 실수로 삭제해도 신경쓰지 않아도 된다.
kubectl delete service 서비스명