코알못

[kubernetes] 쿠버네티스 Pod 실습 본문

ETC

[kubernetes] 쿠버네티스 Pod 실습

코린이s 2023. 5. 7. 19:57
728x90

이번 시간에 두가지 실습을 진행해보도록 한다!

첫번째. 환경 변수 컨테이너에 전달하기

두번째. 파드간 통신

이제 실습을 진행해보도록 하자!

우선 VisualCode 사용자라면 yaml 작성 편리하게 하기위해 아래 플러그인을 설치 한다.

자동 완성 플러그인

첫번째. 환경 변수 컨테이너에 전달하기

우선 아래 yaml 파일을 작성하며 환경 변수 전달은 env 부분을 보면 된다.

예시로 POD_NAME 의 경우 metadata.name 값을 가져와서 컨테이너에 해당 값을 전달하며 현재 값은 hello-app 인것을 알 수 있다.

# hello-app.yaml

apiVersion: v1
kind: Pod
metadata:
  name: hello-app
  namespace: default
spec:
  containers:
  - name: hello-app
    image: yoonjeong/hello-app:1.0
    ports:
    - containerPort: 8080
    env:
    - name: POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
    - name: POD_IP
      valueFrom:
        fieldRef:
          fieldPath:  status.podIP
    - name: NAMESPACE_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
    - name: NODE_NAME
      valueFrom:
        fieldRef:
          fieldPath: spec.nodeName
    - name: NODE_IP
      valueFrom:
        fieldRef:
          fieldPath: status.hostIP
    - name: STUDENT_NAME
      value: Corin
    - name: GREETING
      value: hello $(STUDENT_NAME)
    resources:
      limits:
        memory: "128Mi"
        cpu: "100m"

이제 배포를 해보자!

$ kubectl apply -f hello-app.yaml
pod/hello-app created

파드를 확인해보면 정상적으로 생성 된것을 볼 수 있다.

$ kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE    IP            NODE                                           NOMINATED NODE   READINESS GATES
hello-app                           1/1     Running   0          5m9s   10.100.0.11   gke-corin-cluster-default-pool-d2d86113-3m94   <none>           <none>

우선 호스트 파일을 확인하여 파드의 IP 를 재 확인한다.

$ kubectl exec hello-app -- cat /etc/hosts
# Kubernetes-managed hosts file.
127.0.0.1	localhost
10.100.0.11	hello-app

env 설정이 되어있는지 아래와 같이 확인하며 우리가 예시로 확인했던 POD_NAME인 hello-app이 정상적으로 전달 됨을 확인할 수 있으며 나머지 설정도 정상적으로 가져와진것을 볼 수 있다.

$ kubectl exec hello-app -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=hello-app
...
STUDENT_NAME=Corin
GREETING=hello Corin
POD_NAME=hello-app
POD_IP=10.100.0.11
NAMESPACE_NAME=default
NODE_NAME=gke-corin-cluster-default-pool-d2d86113-3m94
NODE_IP=10.128.0.3
...
HOME=/root

해당 Pod의 열려있는 포트를 확인 하였으며 8080인것을 알 수 있다.

$ kubectl exec hello-app -- netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 :::8080                 :::*                    LISTEN

로컬에서 Pod 테스트를 위해 로컬의 8080포트와 컨테이너 포트인 8080을 연결한다.

$ kubectl port-forward hello-app 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080

curl 로 해당 컨테이너를 호출하며 -v 옵션을 주어 상세하게 확인하면 http status 코드가 200으로 정상인것을 볼 수 있다.

결과 데이터를 보면 우리가 설정한 환경 설정값을 정상적으로 가져와 띄워줌을 볼 수 있다.

 $ curl -v localhost:8080
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< X-Powered-By: Express
< Content-Type: text/html; charset=utf-8
< Content-Length: 1129
< ETag: W/"469-h+LyqBum53isf1UkpLK3nrmJR+k"
< Date: Sun, 07 May 2023 08:10:01 GMT
< Connection: keep-alive
< Keep-Alive: timeout=5
<
<!DOCTYPE html>
<htm1>
<head>
    <title>Pod Env - Hello App</title>
    <style>
        .kubernetes {
            margin: 10px 0;
            padding: 10px;
            border: 2px solid black;
        }
    </style>
</head>
<body>
    <h1>hello Corin</h1>
    <section class="content">
        <ul>
            <li>Pod</li>
            <li>ReplicaSet</li>
            <li>Deployment</li>
            <li>Service</li>
            <li>Ingress/IngressController</li>
            <li>ConfigMap</li>
            <li>Secret</li>
        </ul>
    </section>
    <section class="kubernetes">
        <p>
            <span>Pod Name: </span><span id="podIp">hello-app</span>
        </p>
        <p>
            <span>Pod IP: </span><span id="podIp">10.100.0.11</span>
        </p>
        <p>

이제 테스트 진행한 Pod를 삭제 한다.

$ kubectl delete pod hello-app
pod "hello-app" deleted

정상적으로 삭제 됐는지 확인하면 삭제 된것을 볼 수 있다.

$ kubectl get pods
No resources found in default namespace.

두번째. 파드간 통신

이제 파드간 통신하는 실습을 진행해보자!

우선 아래와 같이 blue-app, green-app 컨테이너가 있는 blue-green-app 파드 관련 yaml 을 작성 한다.

blue-green-app.yaml

# blue-app(8080)
# green-app(8081)
apiVersion: v1
kind: Pod
metadata:
  name: blue-green-app
spec:
  containers:
  - name: blue-app
    image: yoonjeong/blue-app:1.0
    ports:
    - containerPort: 8080
    env:
    - name: NODE_NAME
      valueFrom:
        fieldRef:
          fieldPath: spec.nodeName
    - name: NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
    - name: POD_IP
      valueFrom:
        fieldRef:
          fieldPath: status.podIP
    resources:
      limits:
        memory: "64Mi"
        cpu: "250m"
  - name: green-app
    image: yoonjeong/green-app:1.0
    ports:
    - containerPort: 8081
    env:
    - name: NODE_NAME
      valueFrom:
        fieldRef:
          fieldPath: spec.nodeName
    - name: NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
    - name: POD_IP
      valueFrom:
        fieldRef:
          fieldPath: status.podIP
    resources:
      limits:
        memory: "64Mi"
        cpu: "250m"

아래와 같이 파드를 적용 한다.

$ kubectl apply -f blue-green-app.yaml
pod/blue-green-app created
$ kubectl get pod -o wide
NAME             READY   STATUS    RESTARTS   AGE   IP            NODE                                           NOMINATED NODE   READINESS GATES
blue-green-app   2/2     Running   0          64s   10.100.0.15   gke-corin-cluster-default-pool-d2d86113-3m94   <none>           <none>

그 다음 red-app 컨테이너가 있는 red-app 파드를 생성하는 yaml 파일을 작성한다.

# red-app.yaml

apiVersion: v1
kind: Pod
metadata:
  name: red-app
spec:
  containers:
  - name: red-app
    image: yoonjeong/red-app:1.0
    ports:
    - containerPort: 8080
    resources:
      limits:
        memory: "64Mi"
        cpu: "250m"
    env:
    - name: NODE_NAME
      valueFrom:
        fieldRef:
          fieldPath: spec.nodeName
    - name: NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
    - name: POD_IP
      valueFrom:
        fieldRef:
          fieldPath: status.podIP
    resources:
      limits:
        memory: "64Mi"
        cpu: "250m"

이제 아래와 같이 red-app 파드를 배포하고 정상적으로 두 파드가 배포 되었는지 확인한다.

$ kubectl apply -f red-app.yaml
pod/red-app created
$ kubectl get pod -o wide
NAME             READY   STATUS              RESTARTS   AGE     IP            NODE                                           NOMINATED NODE   READINESS GATES
blue-green-app   2/2     Running             0          5m14s   10.100.0.15   gke-corin-cluster-default-pool-d2d86113-3m94   <none>           <none>
red-app          0/1     ContainerCreating   0          6s      <none>        gke-corin-cluster-default-pool-d2d86113-l47c   <none>           <none>
$ kubectl get pod -o wide
NAME             READY   STATUS    RESTARTS   AGE     IP            NODE                                           NOMINATED NODE   READINESS GATES
blue-green-app   2/2     Running   0          7m45s   10.100.0.15   gke-corin-cluster-default-pool-d2d86113-3m94   <none>           <none>
red-app          1/1     Running   0          2m37s   10.100.2.7    gke-corin-cluster-default-pool-d2d86113-l47c   <none>           <none>

blue-green-app 파드에 blue-app 컨테이너의 로그를 확인하면 정상적으로 기동 됨을 확인 할 수 있다.

$ kubectl logs blue-green-app -c blue-app

> blue-app@1.0.0 start
> nodemon --watch views --watch server.js server.js

[nodemon] 2.0.15
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): views/**/* server.js
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node server.js`
Server is running on 8080

blue-green-app 파드에 green-app 컨테이너 로그도 확인하면 정상이다.

$ kubectl logs blue-green-app -c green-app

> green-app@1.0.0 start
> nodemon --watch views --watch server.js server.js

[nodemon] 2.0.15
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): views/**/* server.js
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node server.js`
Server is running on 8081

이제 blue-green-app 파드의 blue-app 컨테이너의 환경 변수 설정을 확인하면 정상적으로 설정 됨을 확인 한다.

위에서 확인한  pod 의 ip가 POD_IP 설정 값에 정상적으로 되어 있음을 확인 할 수 있다.

$ kubectl exec blue-green-app -c blue-app -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=blue-green-app
...
NODE_NAME=gke-corin-cluster-default-pool-d2d86113-3m94
NAMESPACE=default
POD_IP=10.100.0.15
...
HOME=/root

$ kubectl exec blue-green-app -c green-app -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=blue-green-app
...
NODE_NAME=gke-corin-cluster-default-pool-d2d86113-3m94
NAMESPACE=default
POD_IP=10.100.0.15
...
HOME=/root

이제 blue-green-app 파드의 blue-app 컨테이너에 접속 하고(exec) curl을 통해 green-app(8081 포트) 호출 명령어를 날린다.(--를 이용하면 컨테이너 내부에서 명령어 호출 가능하다.)

결과를 보면 http status 코드가 200으로 정상이며 내용도 환경 변수 값이 정상적으로 셋팅 되어 나온다.

$ kubectl exec blue-green-app -c blue-app -- curl -v localhost:8081/tree
*   Trying 127.0.0.1:8081...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Connected to localhost (127.0.0.1) port 8081 (#0)
> GET /tree HTTP/1.1
> Host: localhost:8081
> User-Agent: curl/7.79.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< X-Powered-By: Express
< Content-Type: text/html; charset=utf-8
< Content-Length: 754
< ETag: W/"2f2-6nxf7Xqr7Rg+IaxAEwGrA1VjXB8"
< Date: Sun, 07 May 2023 08:49:30 GMT
< Connection: keep-alive
< Keep-Alive: timeout=5
<
{ [754 bytes data]
100   754  100   754    0     0   146k      0 --:--:-- --:--:-- --:--:--  184k
* Connection #0 to host localhost left intact
<!DOCTYPE html>
<htm1>
<head>
    <title>Pod Networking - Green App</title>
    <style>
        body {
            background-color: #1AB385;
        }
        .kubernetes {
            margin: 10px 0;
            padding: 10px;
            border: 2px solid black;
        }
    </style>
</head>
<body>
    <h1>Green App</h1>
    <section class="content">Tree is Green.</section>
    <section class="kubernetes">
        <p>
            <span>Pod IP: </span><span id="podIp">10.100.0.15</span>
        </p>
        <p>
            <span>Node: </span><span id="node">gke-corin-cluster-default-pool-d2d86113-3m94</span>
        </p>
        <p>
            <span>Namespace: </span><span id="node">default</span>
        </p>
    </section>
</body>
</html>%

이제 blue-app 컨테이너에서 다른 Pod 인 red-app 을 호출한다. 다른 파드이기에 localhost 는 불가능하며 Pod 의 Ip 를 통해 통신한다.

결과를 보면 http status 코드가 200이며, 내용도 정상이다.

$ kubectl exec blue-green-app -c blue-app -- curl -v 10.100.2.7:8080/rose
*   Trying 10.100.2.7:8080...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Connected to 10.100.2.7 (10.100.2.7) port 8080 (#0)
> GET /rose HTTP/1.1
> Host: 10.100.2.7:8080
> User-Agent: curl/7.79.1
> Accept: */*
>
<!DOCTYPE html>
<htm1>
<head>
    <title>Pod Networking - Red App</title>
    <style>
        body {
            background-color: #C02E4C;
        }
        .kubernetes {
            margin: 10px 0;
            padding: 10px;
            border: 2px solid black;
        }
    </style>
</head>
<body>
    <h1>Red App</h1>
    <section class="content">Rose is Red.</section>
    <section class="kubernetes">
        <p>
            <span>Pod IP: </span><span id="podIp">10.100.2.7</span>
        </p>
        <p>
            <span>Node: </span><span id="node">gke-corin-cluster-default-pool-d2d86113-l47c</span>
        </p>
        <p>
            <span>Namespace: </span><span id="node">default</span>
        </p>
    </section>
</body>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< X-Powered-By: Express
< Content-Type: text/html; charset=utf-8
< Content-Length: 747
< ETag: W/"2eb-DihgSyQwllOXVjBxfujKCOdpooE"
< Date: Sun, 07 May 2023 08:51:25 GMT
< Connection: keep-alive
< Keep-Alive: timeout=5
<
{ [747 bytes data]
100   747  100   747    0     0  53281      0 --:--:-- --:--:-- --:--:-- 57461
* Connection #0 to host 10.100.2.7 left intact

이제 실습을 진행한 파드를 모두 제거 하고 확인하면 정상적으로 제거 됨을 확인 할 수 있다.

$ kubectl delete pod --all
pod "blue-green-app" deleted
pod "red-app" deleted

$ kubectl get pods
No resources found in default namespace.

끝!

728x90
Comments