6 분 소요

k8s - Pod

  • 컨테이너를 다루는 기본 단위

  • 쿠버네티스에서는 컨테이너 어플리케이션을 구동하기 위해 반드시 알아야 할 몇 가지 오브젝트가 있다. Pod, Replica Set, Service, Deployment가 그것이다.

  • 쿠버네티스에서는 컨테이너 어플리케이션의 기본 단위를 포드(Pod)라고 부르며, 포드는 1개 이상의 컨테이너로 구성된 컨테이너의 집합이다. ( 도커 엔진에서의 기본 단위는 컨테이너, 스웜 모드에서의 기본 단위는 여러 개의 컨테이너로 구성된 Service 였다.)

  • 쿠버네티스에서는 컨테이너 어플리케이션을 배포하기 위한 기본 단위로 포드라는 개념을 사용한다.

  • 1개의 컨테이너가 있을 수도, 여러 개의 컨테이너가 존재할 수도 있다.

# Pod 실습

cd ~
vim nginx-pod.yaml
!
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod
spec:
  containers:
  - name: my-nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP
!
kubectl apply -f nginx-pod.yaml
kubectl get pod
kubectl get pod -o wide // pod ip와 어느 node에서 동작하는지 알 수 있다
# pod 컨테이너에 ubuntu 설치

vim nginx-pod-with-ubuntu.yaml
!
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod
spec:
  containers:
  - name: mynginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP

  - name: ubuntu-sidecar-container
    image: moon682/rr-test:curl
    command: [“tail”]
    args: [“-f”, “/dev/null”]
!
kubectl delete pod,delpoy,svc --all
kubectl apply -t nginx-pod-with-ubuntu.yaml
kubectl get pods
kubectl exec -it my-nginx-pod -c ubuntu-sidecar-container bash // -c : container 뒤 우분투 container에 들어가서 bash를 실행하라는 뜻
curl localhost // sidecar는 응답 요청에대해 어느 노드에서나 언제든 요청을 받아준다.
# pod 를 --- 으로구분하여 생성

vim my-nginx-pod-ab.yaml
!
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod-a
spec:
  containers:
  - name: mynginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP
---
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod-b
spec:
  containers:
  - name: mynginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP
!
kubectl apply -f my-nginx-pod-ab.yaml
kubectl get pods // a, b 각각 생성을 확인
kubectl delete pod my-nginx-pod-a
kubelctl get pods // a만 지워진다

k8s - Replica Set

  • Replica Set - 일정 개수의 포드를 유지하는 컨트롤러

  • ReplicaSet은 레플리카를 수행하여 원하는 상태를 유지하고, 만약 팓의 수가 줄어들거나 사라지면 새로운 파드를 생성하여 지정된 복제본 수를 유지한다.

  • ReplicaSet은 Label Selector를 사용하여 파드를 관리한다.

  • ReplicaSet은 Scailing을 지원한다. 복제본 수를 증가시키거나 감소시킴으로 써 애플리케이션의 처리량을 조정할 수 있다.

  • Rolling Update를 지원하여 애플리케이션의 버전을 업데이트하는 과정을 안전하게 수행할 수 있다. 이전 버전의 파드를 유지하면서 새로운 버전의 파드를 순차적으로 배포하여 서비스 중단을 최소화 한다.

  • 대부분의 경우 Deployment를 사용하여 ReplicaSet을 관리한다.

  • 결론적으로, ReplicaSet은 Kubernetes에서 복제본 파드를 관리하는 역할을 수행하며, 안정적인 애플리케이션 배포와 확장성을 지원한다.

# pod replica set

vim replicaset-nginx.yaml
!
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-nginx-pods-label         # 여기까지가 레플리카셋 정의
  template:            # 이제부터 포드 정의
    metadata:            
      name: my-nginx-pod
      labels:
        app: my-nginx-pods-label
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
!
kubelctl apply -f replicaset-nginx.yaml
kubectl get pods // replicaset-nginx에 3개의 pod 확인
kubectl delete pod 레플리카파드이름
kubectl get pods // 3개가 유지되는것을 확인할 수 있다. 이게 replica set
mv replicaset-nginx.yaml replicaset-nginx-4pods.yaml
vim replicaset-nginx-4pods.yaml
!
replicas : 4 수정
!
kubectl apply -f replicaset-nginx-4pods.yaml // configured 창이 뜨는데 기존 레플리카에 1개만 늘어남을 확인할 수 있다.
kubectl get rs // 레플리카셋 확인 명령어
# Pod replicaset label

kubectl delete pod --all
kubectl delete rs --all
vim nginx-pod-without-rs.yaml
!
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod
  labels:
    app: my-nginx-pods-label
spec:
  containers:
  - name: my-nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
!
kubectl apply -f nginx-pod-without-rs.yaml
kubectl get pods // 1개 생성 확인
kubectl apply -f replicaset-nginx-4pods.yaml
kubectl get pods // 4개를 확인할 수 있는데 이는 앞서 만든 yaml 파일과 label이 동일하기 떄문에 3개만 더 생성된 4개이다.
kubectl delete pod my-nginx-pod
kubectl get pods // 다시 4개인것을 확인, 그러므로 pod를 삭제할땐 replica set 먼저 삭제해야 한다.
kubectl edit pods relicaset-nginx-54hrq
!
app: label //을 삭제
!
kubectl get pods // 이제 5개로 보인다. 라벨을 삭제했기 때문에
kubectl delete rs replicaset-nginx
kubectl get pods // app: label을 지운 pod만뺴고 다 삭제됨을 확인
kubectl api-resources // namespced의 shortnames를 확인할 수 있다.

image

k8s - Deployment

  • 레플리카셋, 포드의 배포를 관리

  • 실제 쿠버네티스 운영 화경에서 Replica Set을 YAML 파일에 사용하는 경우는 거의 없다.

  • 대부분은 Deployment라는 이름의 오브젝트 파일을 YAML 파일에 정의해 사용한다.

# Pod Deployment, SVR 등 실습을 위한 ftp 설치 

yum -y install vsftpd
systemctl enable --now vsftpd.service
cd /var/ftp
ls -ltr
chmod 777 pub
HOST PC에서 192.168.0.100 알드라이브 어나니머스로 접속, kubernetest-code.zip 파일 추가
cd pub
mkdir /kubercode
mv kubernetest-code.zip /kubercode
cd /kubercode
unzip kubernetest-code.zip
rm -rf kubernetest-code.zip
cd start-docker-kubernetes-master
mv ./* ../
rm -rf start-docker-kubernetes-master/
cd ..
ls // 압축푼 파일들을 kubercode로 확보
cd chapter6
vim replicaset-nginx-match-expression.yaml
!
  - key: app2  #key값이 2개임을 확인
        values:
          - my-nginx-pods-label
          - your-nginx-pods-label
!
kubectl apply -f replicaset-nginx-match-expression.yaml
kubectl get pods
kubectl describe pod replicaset-nginx-65bzf // pod의 상세 옵션을 확인할 수 있다.
kubectl describe rs replicaset-nginx // replica set의 상세 옵션을 확인할 수 있다. label 2개임을 확인.
kubectl delete pod,rs --all
# Pod deployment // 포드의 배포 관리

pwd
chapter6
kubectl apply -f deployment-nginx.yaml
kubectl get deploy // deploy 확인명령어
kubectl get rs // 레플리카 셋도 확인된다.
kubectl get pods
kubectl set image deployment my-nginx-deployment nginx=nginx:1.21 --record // record 옵션으로 nginx가 1.21버전으로 업그레이드 된 버전을 기록
kubectl get rs // 77b4가 3개, 794f가 1개 확인되는데 794f가 옛날버전이고, 77b4가 최신버전으로 업데이트 됨을 확인.
kubectl rollout history deployment my-nginx-deployement // recode 기록을 확인할 수 있다.
kubectl rollout undo deployment my-nginx-deployment --to-revision=1 // 롤백 명령어
kubectl get rs // 구버전인 794f로 돌아감을 확인할 수 있다.
kubectl get replicasets --show-labels // label을 확인
kubectl describe deploy my-nginx-deployment // Annotations: deployment.kubernetes.io/revision: 3 3번 리비젼되었다고 확인이 된다.

image

k8s - Service(svc)

  • 포드를 연결하고 외부에 노출할 수 있는 네트워크 서비스를 제공하는 리소스이다.

  • Service는 파드 그룹에 대한 가상 IP 주소를 할당하여 클라이언트가 접근할 수 있도록 한다. (클러스터 내부에서 파드를 쉽게 찾고 통신할 수 있게 해준다.)

  • Service Discovery : 파드가 생성되거나 삭제되더라도 Service는 일정한 IP와 포트를 유지한다. 클라이언트 Service의 IP와 포트를 사용하여 애플리케이션에 접근할 수 있으며, 파드의 변화에 대해 알 필요가 없다.

  • Load Balancing : 여러 개의 파드로 구성된 SERVICE에 접근하는 클라이언트 요청은 로드 밸런서를 통해 파드들 사이에 고르게 분배된다. 이를 통해 애플리케이션의 부하 분산과 확장성을 지원한다.

  • Service는 파드를 선택하는 기준으로 Label Selector를 사용하며, 선택된 파드들에 대한 네트워크 연결을 관리한다.

  • 또한 Service와 파드 간의 연결은 Kubernetes 내부의 IP 테이블을 통해 구성되므로 네트워크 설정에 대한 걱정 없이 애플리케이션에 접근할 수 있다.

  • 종합적으로, Kubernetes Service는 클라이언트가 파드 그룹에 접근할 수 있는 네트워크 추상화를 제공하며, 로드 밸런싱과 서비스 디스커버리를 통해 애플리케이션의 안정성과 확장성을 향상시킵니다.

- 지금까지 쿠버네티스에서 컨테이너를 구성하는 가장 중요한 요소인 포드, 레플리카셋, 그리고 
디플로이먼트에 대해서 알아봤다. 

- 그러나 디플로이먼트를 통해 생성된 포드에 어떻게 접근할지가 관건이다. 

- 이전 예제에서 kubectl describe 명령어로 포드의 내부 IP를 직접 확인한 뒤 포드로 직접 접근할 수는 있었지만, 이 방법은 로컬 개발 환경 또는 쿠버네티스 클러스터 내부에서만 사용할 수 있었다.

- 게다가 도커 컨테이너와 마찬가지로 포드의 IP는 영속적이지 않아 항상 변할 수 있다는 점도
유의해야 한다. 

- 여러 개의 디플로이먼트를 하나의 완벽한 어플리케이션으로 연동하려면 포드 
IP가 아닌, 서로를 발견(Discovery)할 수 있는 다른 방법이 필요하다. 

- 도커 컨테이너에서는 -p(publish) 옵션으로 손쉽게 외부로 노출할 수 있었다. 

-즉, 컨테이너가 생성됨과 동시에 외부로 노출되는 방식이었다.
# Pod deployment // 포드의 배포 관리

pwd
chapter6
kubectl apply -f deployment-nginx.yaml
kubectl get deploy // deploy 확인명령어
kubectl get rs // 레플리카 셋도 확인된다.
kubectl get pods
kubectl set image deployment my-nginx-deployment nginx=nginx:1.21 --record // record 옵션으로 nginx가 1.21버전으로 업그레이드 된 버전을 기록
kubectl get rs // 77b4가 3개, 794f가 1개 확인되는데 794f가 옛날버전이고, 77b4가 최신버전으로 업데이트 됨을 확인.
kubectl rollout history deployment my-nginx-deployement // recode 기록을 확인할 수 있다.
kubectl rollout undo deployment my-nginx-deployment --to-revision=1 // 롤백 명령어
kubectl get rs // 구버전인 794f로 돌아감을 확인할 수 있다.
kubectl get replicasets --show-labels // label을 확인
kubectl describe deploy my-nginx-deployment // Annotations: deployment.kubernetes.io/revision: 3 3번 리비젼되었다고 확인이 된다.
# Pod Service // 포드에 연결하고 외부에 노출

kubectl delete pod,svc,rs --all
kubectl apply -f deployment-nginx.yaml 
vim deployment-hostname.yaml
!
image 쪽을 moon682로 변경
!
kubectl apply -f hostname.yaml
kubectl get pods -o wide
kubectl run -i --tty --rm debug --image=moon682/ubuntu:curl --restart=Never // 디버깅 목적으로 사용되는 임시컨테이너를 실행, 재시작 하지 않겠다는 옵션을 넣음
curl [아무 노드IP 상관 없다]
# Pod Service bash로 접근

vim hostname-svc-clusterip.yaml
kubectl apply -f hostname-svc-clusterip.yaml
kubectl get service(svc) // 8080 포트의 10.110.216.79 IP 확인
kubectl run -i --tty --rm debug --image=moon682/ubuntu:curl --restart=Never -- bash
curl 10.110.216.79:8080 // ClusterIP 이기떄문에 Bash가 svc를 통해 Pod로 접근된다.

댓글남기기