서비스(Service)

쿠버네티스 클러스터 안에서 pod의 집합에 대한 경로나 서비스 디스커버리를 제공하는 리소스

타입

서비스 타입에 따라 파드에 접근하는 방법이 다르다.

  • ClusterIP 타입 : 쿠버네티스 내부에서만 pod에 접근할 때 사용. 외부로 파드를 노출하지 않기 때문에 쿠버네티스 클러스터 내부에서만 사용되는 파드에 적합
  • NodePort 타입 : 파드에 접근할 수 있는 포트를 클러스터의 모드 노드에 동일하게 개방
    외부에서 파드에 접근할 수 있는 서비스 타입, 접근할 수 있는 포트는 랜덤으로 정해지지만, 특정 포트로 접근하도록 설정할 수 있음
  • LoadBalancer 타입 : 클라우드 플랫폼에서 제공하는 로드 밸러서를 동적으로 프로비저닝해서 파드에 연결, 외부에서 파드에 접근할 수 있는 서비스 타입, 일반적으로 AWS, GCP, … 등과 같은 클라우드 플랫폼 환경에서 사용

디플로이먼트 생성

  1. 매니페스트 파일 정의(yml)
vagrant@ubuntu:~/kub01$ vi deployment-hostname.yml
`YAML
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hostname-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webserver
  template:
    metadata:
      name: my-webserver
      labels:
        app: webserver
    spec:
      containers:
      - name: my-webserver
        image: alicek106/rr-test:echo-hostname
        ports:
        - containerPort: 80
`

# alicek106/rr-test:echo-hostname 이미지로 컨테이너를 실행
# host name을 보여주는 web이 뜬다.
vagrant@ubuntu:~$ docker run -itd --name test -p 80:80  alicek106/rr-test:echo-hostname
346c0be44baebdd8be42a281fc4bd7fa56b157ffaf6ee62c6726857825df71e0

vagrant@ubuntu:~$ docker container ls
CONTAINER ID        IMAGE                               COMMAND                   CREATED             STATUS              PORTS                                                                                                      NAMES
346c0be44bae        alicek106/rr-test:echo-hostname     "/bin/sh -c /entrypo…"   6 seconds ago       Up 4 seconds        0.0.0.0:80->80/tcp                                                                                         test

vagrant@ubuntu:~$ docker container exec -it test /bin/bash
root@346c0be44bae:/# exit

vagrant@ubuntu:~$ curl http://localhost:80

`html
<!DOCTYPE html>
<meta charset="utf-8" />
<link rel="stylesheet" type="text/css" href="./css/layout.css" />
3.3.2/css/bootstrap.min.css">

<div class="form-layout">
        <blockquote>
        <p>Hello,  346c0be44bae</p>     </blockquote>        ⇐ 컨테이너 ID = 호스트 이름
</div>
`
  1. 디플로이먼트 생성

kubectl apply -f deployment-hostname.yml

  1. 디플로이먼트를 통해서 생성된 pod 조회

kubectl get pods

  1. -o wide 옵션을 이용해서 각 pod 에 할당된 IP 확인

kubectl get pods -o wide o, --output='' : 출력 포맷을 지정

  1. 임시 pod 를 생성하여 hostname-deployment 디플로이먼트로 생성된 파드로 HTTP 요청

ClusterIP 타입의 서비스 _ 쿠버네티스 내부에서만 pod 접근 가능

  1. 매니페스트 파일 작성
vagrant@ubuntu:~/kub01$ vi hostname-svc-clusterip.yml
`YAML
apiVersion: v1
kind: Service
metadata:
  name: hostname-svc-clusterip
spec:
  ports:
    - name: web-port
      port: 8080   
      targetPort: 80
  selector:
    app: webserver
  type: ClusterIP
`

port : 서비스의 IP에 접근할 때 사용할 포트

targetPort : selector 항목에서 정의한 라벨에 의해 접근 대상이 된 pod 내부에서 사용하고 있는 포트

selector : 어떤 라벨을 가지는 pod에 접근할 수 있게 만들지 결정

type : 서비스 타입

  1. 서비스 생성 및 확인
vagrant@ubuntu:~/kub01$ kubectl apply -f hostname-svc-clusterip.yml
service/hostname-svc-clusterip created

vagrant@ubuntu:~/kub01$ kubectl get services
NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
hostname-svc-clusterip   ClusterIP   10.110.56.159   <none>        8080/TCP   8s
kubernetes               ClusterIP   10.96.0.1       <none>        443/TCP    3d
# NAME : kubernetes 쿠버네티스 API에 접근하기 위한 서비스
  1. 임시 pod 생성해서 요청 전송
kubectl run -it --rm debug --image=alicek106/ubuntu:curl --restart=Never -- bash

vagrant@ubuntu:~/kub01$ kubectl run -it --rm debug --image=alicek106/ubuntu:curl --restart=Never -- bash
If you don't see a command prompt, try pressing enter.

root@debug:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
82: eth0@if83: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:12:00:06 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.6/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever

root@debug:/# curl http://10.110.56.159:8080 --silent | grep Hello
        <p>Hello,  hostname-deployment-7dfd748479-pp8x4</p>     </blockquote>
root@debug:/# curl http://10.110.56.159:8080 --silent | grep Hello
        <p>Hello,  hostname-deployment-7dfd748479-pp8x4</p>     </blockquote>

서비스 확인

kubectl get services : 서비스 목록 보여줌

서비스의 IP와 PORT를 통해 pod에 접근, 서비스와 연결된 pod에 로드밸런싱 수행

서비스 삭제

kubectl delete service hostname-svc-clusterip
반응형

+ Recent posts