서비스(Service)
쿠버네티스 클러스터 안에서 pod의 집합에 대한 경로나 서비스 디스커버리를 제공하는 리소스
타입
서비스 타입에 따라 파드에 접근하는 방법이 다르다.
- ClusterIP 타입 : 쿠버네티스 내부에서만 pod에 접근할 때 사용. 외부로 파드를 노출하지 않기 때문에 쿠버네티스 클러스터 내부에서만 사용되는 파드에 적합
- NodePort 타입 : 파드에 접근할 수 있는 포트를 클러스터의 모드 노드에 동일하게 개방
외부에서 파드에 접근할 수 있는 서비스 타입, 접근할 수 있는 포트는 랜덤으로 정해지지만, 특정 포트로 접근하도록 설정할 수 있음 - LoadBalancer 타입 : 클라우드 플랫폼에서 제공하는 로드 밸러서를 동적으로 프로비저닝해서 파드에 연결, 외부에서 파드에 접근할 수 있는 서비스 타입, 일반적으로 AWS, GCP, … 등과 같은 클라우드 플랫폼 환경에서 사용
디플로이먼트 생성
- 매니페스트 파일 정의(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>
`
- 디플로이먼트 생성
kubectl apply -f deployment-hostname.yml
- 디플로이먼트를 통해서 생성된 pod 조회
kubectl get pods
- -o wide 옵션을 이용해서 각 pod 에 할당된 IP 확인
kubectl get pods -o wide o, --output='' : 출력 포맷을 지정
- 임시 pod 를 생성하여 hostname-deployment 디플로이먼트로 생성된 파드로 HTTP 요청
ClusterIP 타입의 서비스 _ 쿠버네티스 내부에서만 pod 접근 가능
- 매니페스트 파일 작성
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 : 서비스 타입
- 서비스 생성 및 확인
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에 접근하기 위한 서비스
- 임시 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
반응형