1. service란
pod은 자체 ip를 가지고있으며 같은 클러스터 내부라면 해당 ip를 통해 통신을 할 수 있습니다.
그러나 pod의 ip는 고정 되어 있지 않습니다.(pod에 문제가 생겨 replicaset이 다시 생성해주면 ip가 변경되게 됩니다)
ip를 이용해 통신하면 pod에 문제가 생겨 죽고 다시 살아났을때 더이상 통신이 안됩니다.
이를 방지하기 위해 service(cluster ip)를 사용합니다.
2. deployment를 생성하여 pod을 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: mydeploy
spec:
replicas: 2
selector:
matchLabels:
app: myHelloWorld
template:
metadata:
labels:
app: myHelloWorld
spec:
containers:
- name: myapp
image: jaeho310/helloworld:1
ports:
- containerPort: 8080
protocol: TCP
deployment 게시글에서 사용한 deployment를 재활용합니다.
3. service(clusterip) 생성
kubectl expose deployment mydeployment라는 명령어만 쳐도 편하게 servcie를 생성할 수 있지만
보통 yaml파일로 정의하여 생성합니다.
apiVersion: v1
kind: Service
metadata:
name: mySvc
spec:
type: ClusterIP # 적지 않아도 service의 spec의 type은 default가 clusterip입니다.
clusterIP: 10.102.217.210 # 적지 않아도 10으로 시작되는 ip를 할당해줍니다.
ports:
- port: 80 # 서비스가 사용할 포트
targetPort: 8080 #서비스가 포워드할 컨테이너포트
selector:
app: myHelloWorld # app=MyHelloworld인 모든 pod는 이 서비스에 속한다.
clusterip의 80번포트를 app: myHelloWorld라는 라벨이 있는 팟에 8080포트로 포워딩 시켜주겠다는 의미입니다.
컨테이너내부의 애플리케이션의 포트와 targetPort를 동일하게 해줘야 합니다.
4. service 생성 확인
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15m
myclusterip ClusterIP 10.102.217.210 <none> 80/TCP 11m
myclusterip가 생성된걸 확인할 수 있습니다.
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mydeploy-599887685-hc9tn 1/1 Running 0 2m14s 172.17.0.3 minikube <none> <none>
mydeploy-599887685-kqk4n 1/1 Running 0 2m14s 172.17.0.2 minikube <none> <none>
kubectl get pod -o wide 명령어를 통해 pod의 ip를 확인할수 있지만 해당 ip는 pod이 죽고 다시 생성되면 변하므로 단순히 테스트하는경우에만 사용합니다. pod ip(172.17.0.2 or 172.17.0.3)의 8080은
service(clusterip)의 ip(10.102.217.210)의 80번으로 연결되게 됩니다.
$ kubectl get ep
NAME ENDPOINTS AGE
kubernetes 192.168.49.2:8443 3d
myclusterip 172.17.0.2:8080,172.17.0.4:8080 3d
endpoint를 확인할 수도 있습니다.
내 쿠버네티스의 endpoint를 확인해보니 팟들이 노출된것도 확인할 수 있습니다.
5. 동작확인
$ kubectl run test --image=busybox -it --rm -- sh
/ # wget 10.102.217.210:80
Connecting to 10.102.217.210:80 (10.102.217.210:80)
saving to 'index.html'
index.html 100% |**************************************| 11 0:00:00 ETA
'index.html' saved
/ # cat index.html
hello world
/ # exit
busybox 이미지를 이용하여 pod을 하나 만든후
생성했던 클러스터ip의 80번 포트에 wget 요청을 합니다.
hello world가 정상적으로 출력되는것을 확인할 수 있습니다.
6. clusterip만 있으면 누구든 pod에 접근할수 있을까?
이제 pod과 pod은 어떤 노드(서버)에 있든지간에 통신이 가능해졌습니다.
이제 프론트엔드와 백엔드와 디비를 세대의 서버에 띄워놓고 통신 시킬 수 있게 됐습니다.
그러나 clusterip는 클러스터 내부에서만 통신 할 수 있습니다.
외부에 통신을 하려면 nodeport나 loadbalencer를 만들어 줘야합니다.
다음게시글에서 nodeport에 대해 알아보겠습니다.
'kubernetes' 카테고리의 다른 글
[kubernetes] 쿠버네티스(kubernetes) cronjob 이란 (0) | 2021.07.14 |
---|---|
[kubernetes] 쿠버네티스(kubernetes) service(NodePort)란 (0) | 2021.07.14 |
[kubernetes] 쿠버네티스(kubernetes) 디플로이먼트(deployment)란 (0) | 2021.06.21 |
[kubernetes] 쿠버네티스(kubernetes) 레플리카셋(replicaset)이란 (0) | 2021.06.21 |
[kubernetes] 쿠버네티스(kubernetes) 팟(pod)이란? (0) | 2021.06.13 |
댓글