• 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

# Ex)
http://공인IP:32072

⚠️ 접속이 안되는경우

  • Node Port 를 생성해도 접속이 안된다면 보안 규칙에 막혀있을 경우가 크다.
    • 랜덤으로 생성된 port 의 대역은 30000 ~ 32767 로 해당 포트에 대한 접속을 먼저 허용시켜줘야 한다.

✏️ LoadBalancer

  • Node Port 와 기능은 같고, 추가로 외부 IP 까지 지정할 수 있다.
    • 참고로 일반적으로 사용되는 로드벨런서와는 다른 개념이다.
    • 일반적으로 생각되는 로드벨런싱 기능을 사용하려면 로드벨런싱 툴과 연동을 시켜줘야 한다.

📍 생성하기

  • external ip 생성 X
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 서비스명
profile
잘못된 내용 PR 환영

0개의 댓글