✔️ Pod Design
- 단일 컨테이너 : 일반적인 형태
- 멀티 컨테이너 : 메인 어플리케이션이 존재하며 메인 어플리케이션 기능을 확장하기 위한 컨테이너를 배치
위의 그림은 파드에 컨테이너가 2개 있는 멀티 컨테이너 배치를 갖는다.
보조 기능을 하는 File Puller가 Git이나 S3에서 웹 컨텐츠를 가져와 볼륨(ex. var/www/html)에 저장한다.
메인 어플리케이션인 Web Server는 볼륨의 컨텐츠를 클라이언트에게 제공하는 역할을 한다.
하나의 파드에서는 네트워크와 볼륨을 공유한다.
파드에게 제공하는 볼륨이 있으면 같은 파드 내의 컨테이너는 해당되는 볼륨에 접근할 수 있다.
kubectl describe
를 통해 보면 컨테이너의 개수와 상관없이 파드에는 하나의 ip만 부여된다.
즉, 하나의 네트워크를 서로 다른 컨테이너가 공유하게 된다.
File Puller나 Web Server 모두 같은 ip를 사용한다.
vagrant@k8s-node1:~/pod$ cat myweb.yaml
apiVersion: v1
kind: Pod # kubectl api-resources
metadata:
name: myweb
spec:
containers:
- name: myweb1
image: httpd
- name: myweb2
image: httpd
vagrant@k8s-node1:~/pod$ kubectl delete pods myweb
pod "myweb" deleted
vagrant@k8s-node1:~/pod$ kubectl create -f myweb.yaml
pod/myweb created
vagrant@k8s-node1:~/pod$ kubectl get pods
NAME READY STATUS RESTARTS AGE
myweb 1/2 CrashLoopBackOff 2 (23s ago) 44s
아무런 현상없이 재시작이 걸린다는 것은 문제가 있는 것이다.
vagrant@k8s-node1:~/pod$ kubectl describe -f myweb.yaml
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 94s default-scheduler Successfully assigned default/myweb to node3
Normal Pulling 94s kubelet Pulling image "httpd"
Normal Pulled 93s kubelet Successfully pulled image "httpd" in 1.969986919s
Normal Created 92s kubelet Created container myweb1
Normal Started 92s kubelet Started container myweb1
Normal Pulled 91s kubelet Successfully pulled image "httpd" in 1.80483752s
Normal Pulled 88s kubelet Successfully pulled image "httpd" in 1.817685494s
Normal Pulled 74s kubelet Successfully pulled image "httpd" in 1.787219693s
Normal Pulling 49s (x4 over 92s) kubelet Pulling image "httpd"
Normal Created 47s (x4 over 91s) kubelet Created container myweb2
Normal Started 47s (x4 over 91s) kubelet Started container myweb2
Normal Pulled 47s kubelet Successfully pulled image "httpd" in 1.80760389s
Warning BackOff 46s (x5 over 88s) kubelet Back-off restarting failed container
BackOff
: 원래의 상태로 돌아간다는 의미이다.
컨테이너를 실패했기 때문에 restarting이 걸린다.
vagrant@k8s-node1:~/pod$ kubectl get pods
NAME READY STATUS RESTARTS AGE
myweb 1/2 CrashLoopBackOff 4 (58s ago) 2m39s
다시 확인을 해보면 둘 중에 하나만 실행되고 있다.
조금 더 상세하게 보면
Containers:
myweb1:
Container ID: containerd://b5a914ffa2dd787a18da510abd12db8fff0fa9ccbaed4e5a03bce56acca500f9
Image: httpd
Image ID: docker.io/library/httpd@sha256:2d1f8839d6127e400ac5f65481d8a0f17ac46a3b91de40b01e649c9a0324dea0
Port: <none>
Host Port: <none>
State: Running
Started: Tue, 17 May 2022 08:15:34 +0000
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-dww8l (ro)
myweb2:
Container ID: containerd://75a6ea04e5e08982fde05e23757667dc60d9409173ca483df538e1a62018d457
Image: httpd
Image ID: docker.io/library/httpd@sha256:2d1f8839d6127e400ac5f65481d8a0f17ac46a3b91de40b01e649c9a0324dea0
Port: <none>
Host Port: <none>
State: Terminated
Reason: Error
Exit Code: 1
Started: Tue, 17 May 2022 08:18:38 +0000
Finished: Tue, 17 May 2022 08:18:38 +0000
Last State: Terminated
Reason: Error
Exit Code: 1
Started: Tue, 17 May 2022 08:17:12 +0000
Finished: Tue, 17 May 2022 08:17:12 +0000
Ready: False
Restart Count: 5
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-dww8l (ro)
두개의 컨테이너 중 myweb1은 Running이고 myweb2는 Terminated 상태이다.
왜 그럴까 ? 포트가 겹쳐서 그렇다.
앞서 Pod는 네트워크를 공유한다고 했다.
하나의 파드가 있고 두개의 컨테이너가 있을 때 네트워크를 공유하므로
두 컨테이너 모두 80번 포트를 사용하려고 하기 때문에 실행이 안되는 것이다.
그렇다면 왜 myweb2가 Terminated 되는가 ?
myweb1, myweb2 둘 중에 myweb2가 나중에 생성되었기 때문이다
vagrant@k8s-node1:~/pod$ kubectl logs myweb -c myweb2
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.233.92.6. Set the 'ServerName' directive globally to suppress this message
(98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
(98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
AH00015: Unable to open logs
80포트로 연결하려고 시도했지만 안된다는 것을 알 수 있다.
vagrant@k8s-node1:~/pod$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myweb 1/2 CrashLoopBackOff 6 (2m47s ago) 8m37s 10.233.92.6 node3 <none> <none>
컨테이너가 2개인데 node3에 배치가 된다. 컨테이너의 개수에 상관없이 하나의 노드에 배치된다.
✔️ 사이드카 컨테이너
보조적인 기능을 하는 컨테이너를 말한다.
✔️ 사이드카 패턴
✔️ Sidecar
메인 컨테이너의 기능을 확장한다.
ex) Web Server 메인 컨테이너가 로컬에 로그를 남기면 Log Saving 사이드카 컨테이너가 다른 로그 서버로 전송한다.
✔️ Ambassador
컨테이너 내부에서 파드 외부로 나가는 형태의 네트워크 흐름을 가지는 사이드카
ex) 일반적인 형태는 proxy 형태이다.
Web App이 있고 Web App이 사용하는 DB가 여러대 있을 때 DB를 하나로 통신하기 위해서 로드 밸런서를 두는 형태이다.
✔️ Adapter
네트워크의 흐름이 외부에서 내부로 들어올 때
컨테이너의 출력을 standard, nomalize 한다.
ex) 어플리케이션이 로그를 남기는데 중앙 집중화된 모니터링 시스템이 있으면 수많은 정보를 가지고 올 것이다. 이때 표준화된 포맷이 있을 수 있다.
어플리케이션마다 남기는 로그의 형태가 다르다면 처리하기가 복잡하다.
따라서 로그 데이터를 가지고 올 때부터 표준화시킨다.
사이드카 컨테이너(Monitoring Adapter)가 로그를 가공해서 어떤 표준화된 형식으로 만들면 외부 시스템이 가져간다.
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Label, LabelSelector (레이블, 레이블셀렉터) (0) | 2022.05.18 |
---|---|
[Kubernetes] Namespace ( + 오브젝트의 이름와 UID) (0) | 2022.05.18 |
[Kubernetes] Workload - Pod (파드) (0) | 2022.05.17 |
[Kubernetes] Object의 정의와 관리 (0) | 2022.05.17 |
[Kubernetes] Kubernetes Objects(오브젝트) (0) | 2022.05.16 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!