본문 바로가기
프로그래밍

[kubernetes] 쿠버네티스 기본 용어 정리

by choihyuunmin 2024. 6. 19.
728x90

안녕하세요. 이번 포스팅에서는 쿠버네티스의 기본 용어와 명령어들을 한번 알아보겠습니다.

저는 3대의 가상 이미지를 띄워서 클러스터를 구성했습니다.

실습은 "한 권으로 배우는 도커&쿠버네티스" 책을 참고해서 진행했습니다.

 

1. 쿠버네티스 구성

쿠버네티스는 마스터노드와 워커노드로 구성되어 있습니다. 마스터노드는 클라이언트의 API 요청을 받고 워커 노드에 명령을 내리는 역할을 합니다. 명령을 받은 워커노드는 실제 컨테이너를 실행하는 역할을 하게 됩니다.

우선 설치된 쿠버네티스 클러스터의 정보부터 확인해보겠습니다.

> kubectl get nodes
NAME        STATUS     ROLES                  AGE    VERSION
ubun20-01   Ready      control-plane          154d   v1.28.5
ubun20-02   Ready      control-plane          154d   v1.28.5
ubun20-03   Ready      control-plane          154d   v1.28.5

 

node들의 정보는 위와 같습니다. ansible로 설치한 클러스터로, 설치되면 3개의 노드가 control-plane인 것을 확인할 수 있습니다.

kubectl cluster-info라는 명령어를 통해 클러스터의 정보도 가져올 수 있습니다.

> kubectl cluster-info
Kubernetes control plane is running at https://192.168.64.11:6443

 

저는 마스터노드를 11번 서버에 설정했기 때문에 cluster-info 명령어를 통해 11번 서버에서 control plane이 running 중이라는 상태를 확인할 수 있습니다.

 

참고로 마스터노드를 설정하는 방법은 로컬호스트에 저장된 kube config의 내용을 설정해주면 됩니다. 

vi ~/.kube/config

 

해당 파일의 clusters요소에 마스터노드의 같은 경로에 있는 파일의 내용을 넣어주면 됩니다. 서버의 ip는 마스터노드로 설정할 노드의 ip를 적어줍니다.

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: 생략
  name: control-cluster

 

 

쿠버네티스 클러스터에서 실행중인 pod의 목록을 확인하려면, kubectl get pod 명령어를 실행합니다.

보다 자세한 결과를 확인하고 싶으면, -o wide 옵션을 사용합니다.

위에서 실행했던 get nodes 명령어에서도 -o wide 옵션을 사용하면 자세한 결과를 확인할 수 있습니다.

> kubectl get pod
NAME                                  READY   STATUS        RESTARTS       AGE
metallb-controller-665d96757f-dnnlz   1/1     Running       0              15s
metallb-speaker-l8spq                 4/4     Running       54 (12m ago)   60d
metallb-speaker-p5gxk                 4/4     Running       42 (12m ago)   60d
metallb-speaker-p5rgm                 4/4     Running       40 (12m ago)   60d
nginx-hello-846f4bdb6d-2wl86          1/1     Running       1 (12m ago)    2d18h
nginx-hello-846f4bdb6d-b8x6l          1/1     Running       0              15s
nginx-hello-846f4bdb6d-fz5kg          1/1     Running       1 (12m ago)    2d18h
nginx-hello-846f4bdb6d-hl7wc          1/1     Running       1 (12m ago)    2d18h
nginx-hello-846f4bdb6d-jb6jq          1/1     Running       0              15s
nginx-hello-846f4bdb6d-tg44q          1/1     Terminating   2 (12m ago)    2d18h
nginx-hello-846f4bdb6d-wqjfp          1/1     Terminating   2 (12m ago)    2d18h

> kubectl get pod -o wide
NAME                                  READY   STATUS        RESTARTS       AGE     IP               NODE        NOMINATED NODE   READINESS GATES
metallb-controller-665d96757f-dnnlz   1/1     Running       0              74s     10.233.109.152   ubun20-02   <none>           <none>
metallb-speaker-l8spq                 4/4     Running       54 (13m ago)   60d     192.168.64.12    ubun20-02   <none>           <none>
metallb-speaker-p5gxk                 4/4     Running       42 (13m ago)   60d     192.168.64.13    ubun20-03   <none>           <none>
metallb-speaker-p5rgm                 4/4     Running       40 (13m ago)   60d     192.168.64.11    ubun20-01   <none>           <none>
nginx-hello-846f4bdb6d-2wl86          1/1     Running       1 (13m ago)    2d18h   10.233.104.210   ubun20-01   <none>           <none>
nginx-hello-846f4bdb6d-b8x6l          1/1     Running       0              74s     10.233.109.153   ubun20-02   <none>           <none>
nginx-hello-846f4bdb6d-fz5kg          1/1     Running       1 (13m ago)    2d18h   10.233.104.209   ubun20-01   <none>           <none>
nginx-hello-846f4bdb6d-hl7wc          1/1     Running       1 (13m ago)    2d18h   10.233.104.213   ubun20-01   <none>           <none>
nginx-hello-846f4bdb6d-jb6jq          1/1     Running       0              74s     10.233.109.157   ubun20-02   <none>           <none>
nginx-hello-846f4bdb6d-tg44q          1/1     Terminating   2 (13m ago)    2d18h   10.233.70.34     ubun20-03   <none>           <none>
nginx-hello-846f4bdb6d-wqjfp          1/1     Terminating   2 (13m ago)    2d18h   10.233.70.31     ubun20-03   <none>           <none>

 

실행중인 pod를 삭제할때는 delete 명령을 실행합니다. kubectl delete {pod 이름}

 

pod를 실행하는 방법에는 명령어에는 run이 있습니다. run 명령어를 통해 hello-world라는 pod를 실행해보겠습니다.

> kubectl run hello-world --image=hello-world --restart=Always pod/hello-world created
pod/hello-world created
> kubectl get pod
NAME                    READY   STATUS             RESTARTS       AGE
hello-world             0/1     CrashLoopBackOff   1 (4s ago)     11s

 

이렇게 run 명령어로 pod를 실행할 수 있습니다. 생성된 pod는 delete 명령어로 삭제합니다. 다음으로는 manifest(매니페스트)를 통한 pod를 생성하는 방법이 있습니다. manifest는 yaml 확장자 파일을 이용해 pod를 생성하는 방법입니다. 일반 run 명령어보다 설정할 수있는 옵션이 많고, 한눈에 직관적으로 알아볼 수 있다는 장점이 있습니다.

nginx application을 생성하는 pod를 yaml형식의 manifest파일을 통해 생성해보겠습니다.

 

참고로 vi로 터미널에서 직접 수정할 수 있지만, 저는 vscode의 익스텐션을 통해 조금 더 간단하게 매니페스트를 작성합니다.

extension에서 yaml를 검색하고 위와 같은 익스텐션을 설치합니다.

 

 

설치가 됐으면 톱니바퀴를 클릭하고, Extension Settings(확장 설정)을 클릭합니다.

 

 

스크롤을 밑으로 내리다보면 나오는 Edit in settings.json 버튼을 클릭해줍니다.

 

settings.json에 아래와 같이 kubernetes 관련 설정을 추가해줍니다.

{
    "yaml.schemas": {
        "kubernetes": "*.yaml"
    }
}

 

만약 json파일 내에 다른 설정이 되어있다면 첫 depth에 위 구문을 넣어주면 됩니다.

설정이 완료됐다면 아래와 같은 자동완성 기능이 활성화되는 것을 볼 수 있습니다.

 

 

다시 돌아와서 매니페스트를 이용한 pod 생성에 대해 설명드리겠습니다.

 

apiVersion: v1
kind: Pod
metadata:
  name: nginx01
spec:
  containers:
  - name: nginx-test01
    image: nginx:latest

 

 

yaml파일을 통해 pod를 띄울때는 apply 명령어를 사용합니다.

> kubectl apply -f nginx-test.yml
pod/nginx01 created
> kubectl get pod
NAME                    READY   STATUS    RESTARTS       AGE
nginx01                 1/1     Running   0              10s

 

yaml 파일을 통해 생성한 pod는 생성할 때와 마찬가지로 f 옵션을 준뒤 delete 명령어를 통해 삭제합니다.

> kubectl delete -f nginx-test.yml
pod "nginx01" deleted

 

2. 디플로이먼트

디플로이먼트(deployment)는 파드의 개수를 관리합니다. 파드는 레플리카셋이라는 수치를 통하여 파드의 개수를 설정하고 유지합니다. 디플로이먼트는 이런 파드의 레플리카셋을 관리하고 스펙을 정의하는 기능을 합니다. 또한 생성되고 제거되는 pod의 이력을 관리하는 기능을 가지고 있어, 단순히 pod를 생성하고 레플리카셋을 설정하는 것보다 디플로이먼트를 통해 pod를 관리합니다.

 

디플로이먼트도 kubectl 명령어를 통해 생성할 수 있습니다. pod는 run 명령어를 통해 생성했다면, 디플로이먼트는 create 명령어를 통해 생성합니다.

 

> kubectl create deployment deploy-hello --image=hello-world
deployment.apps/deploy-hello created

 

생성된 디플로이먼트는 아래의 명령어들로 확인할 수 있습니다.

 

> kubectl get pod
NAME                            READY   STATUS      RESTARTS      AGE
deploy-hello-7c478bcd59-fsc8p   0/1     Completed   3 (33s ago)   57s
> kubectl get replicaset
NAME                      DESIRED   CURRENT   READY   AGE
deploy-hello-7c478bcd59   1         1         0       2m6s
> kubectl get deployment
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
deploy-hello   0/1     1            0           2m20s

 

생성된 디플로이먼트의 삭제는 pod와 마찬가지로 delete 명령어를 통해 수행합니다.

> kubectl delete deployment deploy-hello
deployment.apps "deploy-hello" deleted

 

다음으로 디플로이먼트를 실행할 때, 레플리카셋을 조정하는 방법을 알아보겠습니다.

레플리카셋이란, pod의 개수를 원하는 개수만큼 유지시켜 줄 때의 개수를 말합니다. 예를 들어 레플리카셋을 3개로 지정하면 쿠버네티스 클러스터는 해당 디플로이먼트를 통해 생성된 pod의 개수를 항상 3개로 유지시키려고 합니다.

 

nginx이미지를 통해 레플리카셋이 3인 pod를 생성해보겠습니다.

> kubectl create deployment deploy-nginx --image=nginx --replicas=3
deployment.apps/deploy-nginx created

 

생성된 pod를 확인해보면, READY 컬럼에 3개의 pod가 관리되고 있음을 알 수 있습니다.

 

> kubectl get pod
NAME                            READY   STATUS     RESTARTS   AGE
deploy-nginx-7f979874cf-7qp6w   1/1     Running    0          51s
deploy-nginx-7f979874cf-s7lnt   1/1     Running    0          51s
deploy-nginx-7f979874cf-tdj7w   1/1     Running    0          51s

 

디플로이먼트와 레플리카셋도 확인해보면 3개의 pod를 관리하고 있음을 확인할 수 있습니다.

> kubectl get deployment,replicaset
NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deploy-nginx   3/3     3            3           99s

NAME                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/deploy-nginx-7f979874cf   3         3         3       99s

 

레플리카셋이 3개로 설정된 pod를 자세히 살펴보겠습니다. -o wide 옵션을 통해 pod의 상태를 더 자세히 볼 수 있습니다.

 

> kubectl get pod -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
deploy-nginx-7f979874cf-qwhs2   1/1     Running   0          30s   10.233.70.41     ubun20-03   <none>           <none>
deploy-nginx-7f979874cf-skn2j   1/1     Running   0          30s   10.233.70.39     ubun20-03   <none>           <none>
deploy-nginx-7f979874cf-vc4mv   1/1     Running   0          30s   10.233.104.225   ubun20-01   <none>           <none>

 

3개의 pod는 각각 10.233.70.41, 10.233.70.39, 10.233.104.225의 IP로 실행됐으며, 위에 두개는 3번 노드에, 아래 한개는 1번 노드에 실행되고 있음을 확인할 수 있습니다. 해당 IP로 띄워진 pod는 클러스터 내부에서만 통신이 가능하고, 현재는 pod를 외부로 노출시키는 작업을 하지 않았기 때문에 로컬호스트에서 해당 IP주소로 접속해보면 접속이 되지 않는 것을 확인할 수 있습니다. 

쿠버네티스 클러스터의 서버에 접속해서 nc 명령어를 통해 네트워크 통신을 확인해보면 정상적으로 통신이 되는 것을 확인할 수 있습니다.

> nc -zv 10.233.70.39 80
Connection to 10.233.70.39 80 port [tcp/http] succeeded!

 

여기서 생성된 pod 중 하나를 삭제해보겠습니다.

> kubectl delete pod deploy-nginx-7f979874cf-qwhs2
pod "deploy-nginx-7f979874cf-qwhs2" deleted

 

그다음 다시 pod를 확인해보면 아래와 같은 결과를 확인할 수 있습니다.

> kubectl get pod -o wide
NAME                            READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
deploy-nginx-7f979874cf-jcdd5   1/1     Running   0          7s      10.233.70.42     ubun20-03   <none>           <none>
deploy-nginx-7f979874cf-skn2j   1/1     Running   0          4m27s   10.233.70.39     ubun20-03   <none>           <none>
deploy-nginx-7f979874cf-vc4mv   1/1     Running   0          4m27s   10.233.104.225   ubun20-01   <none>           <none>

 

위에서 제거한 qwhs2의 id를 가진 pod가 사라지고 새로운 pod가 생겼습니다.(AGE가 7초) 이렇듯 replicaset이 설정된 deployment는 pod가 어떤 요인에 의해 삭제되면 다른 pod를 생성하여 개수를 유지하려는 성질이 있습니다.

 

이제 명령어를 통해 생성한 디플로이먼트를 삭제하고 매니페스트를 통해 새로운 디플로이먼트를 생성해보겠습니다.

> kubectl delete deployment deploy-nginx
deployment.apps "deploy-nginx" deleted

> kubectl get deployment
No resources found in default namespace.

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/name: nginx-deploy
  template:
    metadata:
      labels:
        app.kubernetes.io/name: nginx-deploy
    spec:
      containers:
      - name: nginx
        image: nginx:latest

 

위 구문에서 처음 나오는 spec은 디플로이먼트에 대한 상태를 정의합니다. 그 안에 있는 또다른 spec은 pod의 상태를 정의하는 것으로 여기서 유의할 점은 디플로이먼트의 matchLabels와 pod의 labels의 이름을 같도록 지정해주어야 합니다.

 

이제 생성한 매니페스트를 통해 디플로이먼트를 실행시켜보겠습니다.

> kubectl apply -f nginx-deploy.yaml
deployment.apps/deploy-nginx created

 

생성된 디플로이먼트를 확인해보겠습니다.

> kubectl get pod -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
deploy-nginx-5b6549999b-m2f69   1/1     Running   0          5s    10.233.109.166   ubun20-02   <none>           <none>
deploy-nginx-5b6549999b-qmvhp   1/1     Running   0          5s    10.233.104.223   ubun20-01   <none>           <none>
deploy-nginx-5b6549999b-zkpld   1/1     Running   0          5s    10.233.70.45     ubun20-03   <none>           <none>

 

레플리카셋이 3개인 디플로이먼트가 잘 실행된 것을 확인할 수 있습니다. 위에서 생성한 yaml파일을 수정하면서 레플리카셋과 이미지의 버전 등을 변경해줄 수 있습니다. metadata의 이름을 같게 설정하면 기존에 생성된 디플로이먼트의 상태를 업데이트 해주는 용도로 사용할 수 있습니다.

 

 

3. 서비스

다음으로 서비스에 대해 알아보겠습니다. 서비스는 pod의 외부 접근을 위한 기능을 수행합니다. pod와 디플로이먼트 절에서 확인했듯이 IP주소는 pod가 재생성되면 재할당되는 특성이 있습니다. 이때, 클라이언트는 pod에 접속하기 위해 갖고 있던 IP주소가 변경되었기 때문에 pod로 요청이 정상적으로 이루어지지 않을 수 있습니다. 이런 문제를 해결하기 위해 서비스를 사용합니다. 서비스는 클라이언트의 요청을 받아서 pod로 포워딩해주는 역할을 합니다.

서비스는 이런 특성을 활용해서 외부 트래픽 노출, 로드밸런싱, 서비스에 대한 디스커버리 등의 기능을 수행합니다.

 

           +-----------------------+
           |        Client         |
           +-----------+-----------+
                       |
                       v
           +-----------+-----------+
           |        Service        |
           +-----------+-----------+
                       |
         +-------------+--------------+
         |             |              |
         v             v              v
     +---+---+     +---+---+      +---+---+
     |  Pod  |     |  Pod  |      |  Pod  |
     |(App 1)|     |(App 2)|      |(App 3)|
     +---+---+     +---+---+      +---+---+

 

쿠버네티스 서비스의 종류에는 ClusterIP, NodePort, LoadBalancer, ExternalName이 있습니다. 서비스의 종류는 매니페스트에서 type으로 지정할 수 있습니다. 이제 서비스 종류 각각에 대해 알아보겠습니다.

 

(1) ClusterIp

cluster ip는 서비스의 default 값으로, 클러스터 내에서만 pod에 접근할 수 있도록 합니다.

cluster ip를 설정하면, 클러스터 내에서만 접근 가능한 IP를 할당하고, 외부에서는 접근할 수 없습니다.

cluster ip를 설정하는 매니페스트를 작성해보겠습니다.

 

서비스 실습은 위에서 작성했던 디플로이먼트의 web-deploy먼트를 활용해서 진행하겠습니다.

apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app.kubernetes.io/name: nginx-deploy
  type: ClusterIP
  ports:
    - protocol: TCP
      port: 80

 

디플로이먼트의 매니페스트에서 지정한 web-deploy를 selector에 지정해주고, type에 ClusterIP를 넣습니다.

외부 포트는 80번으로 지정해줍니다.

서비스를 작성할 때는 연동할 디플로이먼트를 spec.selector.app.kubernetes.io/name을 통해 지정해주어야 합니다.

디플로이먼트와 같이 실행 명령어는 kubectl apply 입니다. 명령어를 통해서 서비스를 실행시켜 보겠습니다.

> kubectl apply -f service-clusterip.yaml
service/web-service created

 

서비스를 실행시켰으면 , 정상적으로 기동됐는지 확인해보겠습니다.

 

> kubectl get svc
NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes    ClusterIP   10.233.0.1     <none>        443/TCP   30h
web-service   ClusterIP   10.233.34.110   <none>        80/TCP    2s

 

10.233.34.110의 IP로 cluster ip가 생성된 것을 확인할 수 있습니다.

하지만, cluster ip는 클러스터 내부에서만 통신이 되기 때문에, 제 로컬호스트에서는 접속이 되지 않습니다. 통신이 정상적으로 수행되는 지 확인하기 위해 임시 pod를 하나 생성해서 curl 명령어를 수행해보겠습니다.

> kubectl run test-cluster --image=nginx
kubectl run test-cluster --image=nginx
> kubectl exec -it test-cluster -- /bin/bash
root@test-cluster:/#
root@test-cluster:/# curl "10.233.34.110:80"
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

 

 

curl을 통해 명령어를 전송하면, 위와 같이 정상적으로 nginx페이지가 반환되는 것을 확인할 수 있습니다.

계속해서 다른 서비스들을 실습하기 위해 띄워놓은 서비스와 디플로이먼트를 종료하겠습니다.

 

> kubectl delete pod test-cluser
pod "test-cluster" deleted
> kubectl delete -f service-clusterip.yaml
service "web-service" deleted
> kubectl delete -f nginx-deploy.yaml
deployment.apps "deploy-nginx" deleted

 

(2) NodePort

NodePort는 각 노드의 특정 포트를 통해 외부 접근을 제공합니다. NodeIp:NodePort를 통해 클러스터 외부에서 클러스터 내부의 pod에 접근할 수 있도록 해줍니다. NAT와 유사한 서비스를 제공합니다.

        요청
         |
         v
+-------------------+
|       Node        |
|  +-------------+  |
|  |  NodePort   |  |  <- 클러스터의 모든 노드에서 특정 포트가 열림
|  +-------------+  |
|         |         |
|         v         |
|  +-------------+  |
|  |     Pod     |  |  <- 서비스가 포드로 트래픽을 라우팅
|  |  (Container)|  |
|  +-------------+  |
+-------------------+

 

 

이제 NodePort를 위한 매니페스트를 작성해보겠습니다.

apiVersion: v1
kind: Service
metadata:
  name: web-service-nodeport
spec:
  selector:
    app.kubernetes.io/name: nginx-deploy
  type: NodePort
  ports:
    - protocol: TCP
      nodePort: 31001
      port: 80
      targetPort: 80

 

ClusterIp와 마찬가지로 selector에는 생성된 디플로이먼트의 name을 작성해줍니다.

type은 NodePort로 작성하고, NodePort에서는 ports 요소에 nodePort라는 아이템을 작성해줍니다. nodePort는 외부에서 접근하는 아이피를 의미합니다. 외부에서 31001이라는 IP로 접근하면 서비스의 80포트로 접속되고, 서비스의 80포트가 pod의 타겟 포트인 80 포트로 다시 전달한다는 의미입니다.

 

다시 디플로이먼트를 실행시키고 이번에 생성한 NodePort의 매니페스트를 실행시켜 접속이 가능한 지 확인해보겠습니다.

 

> kubectl apply -f nginx-deploy.yaml
deployment.apps/deploy-nginx created
> kubectl apply -f service-nodeport.yaml
service/web-service-nodeport created
> kubectl get svc
NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes             ClusterIP   10.233.0.1     <none>        443/TCP        31h
web-service-nodeport   NodePort    10.233.42.69   <none>        80:31001/TCP   35s

 

서비스를 확인하면 80:31001과 같이 외부로 노출된 포트가 뒤쪽에 나오는 것을 확인할 수 있습니다.

제 클러스터의 pod를 확인해보면

> kubectl get pod -o wide
NAME                            READY   STATUS    RESTARTS   AGE    IP               NODE        NOMINATED NODE   READINESS GATES
deploy-nginx-5b6549999b-7mqbs   1/1     Running   0          106s   10.233.70.51     ubun20-03   <none>           <none>
deploy-nginx-5b6549999b-gqgcv   1/1     Running   0          106s   10.233.70.48     ubun20-03   <none>           <none>
deploy-nginx-5b6549999b-th7bk   1/1     Running   0          106s   10.233.104.234   ubun20-01   <none>           <none>

 

3번 노드에 두개의 pod가 실행되고 있음을 확인할 수 있고, 3번 노드의 IP에 31001 포트로 접근해보면

 

이렇게 nginx로 접속이 되는 것을 확인할 수 있습니다.

 

 

(3) LoadBalancer

다음으로는 로드밸런서에 대해 알아보겠습니다.

로드밸런서는 서비스에서 NodePort의 상위호환이라고 생각하면 됩니다. 외부 IP와 포트를 지정해놓으면 이 IP와 포트를 따라 NodePort로 들어오고 NodePort에서 Pod로 분배되는 순으로 접속하게 됩니다.

다시 매니페스트를 통해서 로드밸런서가 지정된 서비스를 실행시켜보겠습니다.

 

apiVersion: v1
kind: Service
metadata:
  name: web-service-loadbalancer
spec:
  selector:
    app.kubernetes.io/name: nginx-deploy
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  externalIPs:
    - 192.168.64.30

 

매니페스트를 통해 서비스를  생성했습니다. port는 서비스가 사용할 포트, targetPort는 pod가 사용할 포트입니다. 서비스의 80포트로 접속하면 pod의 80번 포트를 통해 디플로이먼트에 접속이 되는 구조입니다.

실행된 서비스의 정보를 확인해보겠습니다.

 

> kubectl get svc
NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
kubernetes                 ClusterIP      10.233.0.1      <none>          443/TCP        3d5h
web-service-loadbalancer   LoadBalancer   10.233.44.171   192.168.64.30   80:30825/TCP   81s

 

서비스가 위에서 설정한 192.168.64.30이라는 IP와 80라는 외부 포트를 통해 네트워크가 오픈된 것을 볼 수 있습니다. 80포트로 접속하면 nodeport로 설정된 30825 포트로 접속되는 구조입니다. 접속해보기 전에, 새로 생긴 EXTERNAL-IP는 제 로컬호스트에서 통신이 되고 있지 않은 상황이니, 포트포워딩을 따로 설정해주겠습니다. 8080 포트를 30번 서버의 80포트에 매핑시켜주겠습니다.

 

> kubectl port-forward svc/web-service-loadbalancer 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80

 

 

8080포트로 접속하면 nginx까지 접속이 되는 것을 확인할 수 있습니다. 이렇게 LoadBalance를 사용하면 하나의 IP를 통해 쿠버네티스 클러스터의 pod에 접속할 수 있습니다.

4. 스토리지