일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- login
- 젠킨스
- Docker
- hive
- spring
- ec2
- SpringBoot
- 레디스
- EMR
- 자바
- gradle
- Zeppelin
- 자동
- redash
- 클러스터
- config
- 간단
- Redis
- Cluster
- 설정
- vue
- 머신러닝
- java
- fastcampus
- 로그인
- Jenkins
- aws
- 예제
- Kafka
- Mac
- Today
- Total
코알못
[kubernetes] 쿠버네티스 Pod 실습 본문
이번 시간에 두가지 실습을 진행해보도록 한다!
첫번째. 환경 변수 컨테이너에 전달하기
두번째. 파드간 통신
이제 실습을 진행해보도록 하자!
우선 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.
끝!
'ETC' 카테고리의 다른 글
Ranger 적용된 EMR 집계 로그 S3 저장 안되는 이유 (0) | 2023.05.16 |
---|---|
[kubernetes] 쿠버네티스 Label, Selector 실습 (0) | 2023.05.07 |
[kubernetes] 쿠버네티스 Pod, Label, Selector 소개 (0) | 2023.05.07 |
[kubernetes] 쿠버네티스 정의 방법 및 기본 명령어 호출 (0) | 2023.05.06 |
[kubernetes] 쿠버네티스 설치 및 셋팅 (0) | 2023.05.06 |