[구름 k8s] TIL 3-2-2

Peppie·2022년 10월 12일
0

0. 쿠버네티스 환경 구성 개선

Kubernetes container runtime
: 쿠버네티스 1.24 이후부터 도커 컨테이너 엔진 지원 종료에 따른 컨테이너 엔진 교체

CRI 도커 컨테이너 런타임
: cri-dockerd_0.2.6.3.0.ubuntu-jammy_amd64.deb 파일 사용

기존 클러스터 초기화

마스터 노드

  • sudo kubeadm reset
  • 관련 파일 삭제
    • sudo rm -r /etc/cni/net.d/*
    • sudo rm -r ~/.kube/config
  • sudo systemctl restart kubelet

워커 노드

  • sudo kubeadm reset
  • 관련 파일 삭제
    • sudo rm -r /etc/cni/net.d/*
    • sudo rm -r ~/.kube/config
  • sudo systemctl restart kubelet

cri-docker 설치 및 활성화 - 마스터/워커 노드

  • sudo apt install ./cri-dockerd_0.2.6.3-0.ubuntu-jammy_amd64.deb
  • daemon 확인 : systemctl status cri-docker
  • daemon 및 socket enable 설정
    • sudo systemctl enable cri-docker
    • sudo systemctl enable --now cri-docker.socket
  • kubelet 재시작 : sudo systemctl restart kubelet

마스터 노드에 클러스터 구성

cri-dockerd.sock 파일 확인

  • ls -lF /var/run/cri-dockerd.sock

클러스터 생성

  • sudo kubeadm init --cri-socket "unix:///var/run/cri-dockerd.sock"

클러스터 구성 후 현재 사용자 및 root 사용자에 적용

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

워커노드에서 클러스터에 join하는 명령 저장

sudo kubeadm join 10.0.1.212:6443 --token k5yjpk.p4sj5m4zm7c0z4ie \
        --discovery-token-ca-cert-hash sha256:aca0eaed572a1fcd37d05ed954e5167174a851f8c53002438e48eaed0d90fc0f --cri-socket "unix:///var/run/cri-dockerd.sock"

CNI 구성 (weavenet)

kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

1. Pod

쿠버네티스에서 하나의 독립적인 서비스를 제공할 수 있는 컨테이너들을 모아서 관리하는 최소 배포 단위

Pod 단위로 컨테이너 작성/시작/정지/삭제 등의 조작 수행

Pod 특징

  • 동일한 Pod의 컨테이너는 반드시 동일한 노드 상에 동시에 deploy
  • 컨테이너는 서비스와 연결되도록 포트 가짐; 같은 Pod 안에서 포트 중복 X
  • Pod 안의 여러 컨테이너에서 가상 NIC (Private IP) 공유하는 구성
    -> 컨테이너끼리 localhost를 경유하여 통신 가능
  • Pod가 생성될 때 고유 IP할당, 클러스터 내에서만 접근 가능

Pod 구성

  • 1개 이상의 컨테이너
  • 볼륨 : Pod 내의 컨테이너 간 데이터 공유 (선택적)

단일 컨테이너 Pod

Pod 당 하나의 컨테이너 모델, 가장 일반적인 형태

다중 컨테이너 Pod

Pod에 밀접한 연관성을 가진 컨테이너를 배치하여 연관성 있는 컨테이너 간 리소스를 공유하는 형태의 캡슐화된 모델

Pod 생성

kubectl run 명령으로 생성

단일 컨테이너 Pod 생성

  • 도커에서 컨테이너 생성하는 방법과 같은 방식
  • kubectl run <pod 이름> --image <컨테이너 이미지 이름:버전> --port <포트번호>
kubectl run webserver --image=nginx --port=80
: default namespace에 Pod 생성

kubectl run webserver2 --image=nginx --port=80 --namespace myspace
: myspace namespace에 Pod 생성

kubectl get pods -o wide : default namespace Pod 목록 확인

kubectl get pods -o wide --all-namespaces : 모든 namespace의 Pod 목록 확인

kubectl get pods -o wide --namespace myspace : myspace namespace Pod 목록 확인

kubectl describe pod/webserver --namespace myspace
: myspace namespace의 webserver Pod 상세 정보 확인

Pod에 명령 수행

  • kubectl exec <pod 이름> -it <명령>
    kubectl exec <pod 이름> -it -- <명령>
    • kubectl exec webserver -it /bin/bash -> 소멸 예정 명령 형식
    • kubectl exec webserver -it -- /bin/bash -> 새로 지원하는 방식

생성했던 Pod / Namespace 삭제

  • kubectl delete pod/hello pod/webserver
  • kubectl delete pod/webserver pod/webserver2 --namespace myspace
  • kubectl delete namespace myspace

application debug

https://kubernetes.io/ko/docs/tasks/debug/debug-application/_print/

kubectl apply 명령으로 실행

  • kubectl apply 명령으로 Pod 생성 - 단일 컨테이너 생성 : kubectl apply -f exam-nginx.yml
apiVersion: v1
kind: Pod
metadata:
  name: webserver
  labels:
    app: myweb
spec:
  containers:
  - name: nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
  • kubectl apply 명령으로 다중 Pod 생성 - 다중 컨테이너 생성
    : kubectl apply -f multi-container.yml
apiVersion: v1
kind: Pod
metadata:
  name: kubetm
spec:
  containers:
  - name: container1
    image: kubetm/p8000
    ports:
    - containerPort: 8000
  - name: container2
    image: kubetm/p8080
    ports:
    - containerPort: 8080

Label

임의의 라벨을 설정하여 클러스터 안에서 편리하게 관리

  • 쿠버네티스 리소스에 설정한 라벨을 LabelSelector 기능을 사용하여 필터링
  • 라벨은 key-value 형으로 설정, key와 value 모두 문자형
  • Pod에는 여러개의 라벨 부여
apiVersion: v1
kind: Pod
metadata:
 name: webserver
 labels:
   type: app
    lo: dev
spec:
 containers:
 - name: nginx-container
   image: nginx:latest
   ports:
   - containerPort: 80

Node Schedule

Pod가 생성하여 동작하는 노드(워커 노드)를 결정하는 방법

  • 마스터 노드의 kube-scheduler에 의한 자동 결정 -> 기본 방식
  • 사용자에 의한 결정 -> 필요에 따라 YAML 파일에 속성으로 지정하여 결정 가능; nodeSelector 속성
apiVersion: v1
kind: Pod
metadata:
  name: webserver
  labels:
    app: myweb
spec:
  nodeSelector:
    kubernetes.io/hostname: worker1.example.com
  containers:
  - name: nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80

Pod 생명주기

kubectl describe pods <Pod 이름> 명령으로 생명 주기 확인

Pod Status

Pending

Pod 생성을 기다리는 상태
컨테이너 이미지 다운로드 등 시간이 걸리는 경우 발생

Running

Pod 정상 작동 중인 상태

Succeeded

Pod 안의 컨테이너가 정상적으로 종료된 상태

Failed

Pod 안의 컨테이너 중 하나의 컨테이너가 실패하여 종료된 상태

Unknown

어떤 이유로 Pod와 통신할 수 없는 상태

Pod Conditions

Initialized

모든 초기화 컨테이너가 성공적으로 시작 완료

Ready

Pod는 요청 실행 가능; 연결된 모든 서비스의 Load Balancing pool에 추가되어야 함

ContainersReady

Pod 안 모든 컨테이너가 준비 상태

PodScheduled

Pod가 하나의 노드로 스케쥴 완료했음

Unschedulable

스케쥴이 자원부족 또는 다른 제약 등으로 지금 당장 Pod 스케쥴 불가능

2. Volume

Pod의 일부분으로 정의되는 요소, Pod와 동일한 생명주기를 갖는 disk storage

  • Pod에 여러 컨테이너를 갖는 경우 모든 컨테이너가 볼륨 공유 가능
  • 독립적인 리소스 X -> 자체 생성/삭제 불가능
  • Pod의 모든 컨테이너에서 사용가능, 사용시 컨테이너에서 마운트해야 사용 가능
  • 각 컨테이너 파일 시스템의 어느 경로에도 마운트 가능

볼륨 유형

emptyDir

일시적인 데이터 저장시 사용하는 빈 디렉토리

hostPath

워커 노드의 파일 시스템을 Pod의 디렉토리로 마운트하여 사용

nfs

NFS 공유 Pod에 마운트

public cloud 전용 스토리지

Amazon EBS, GCE Persistent Disk, Azure Disk Volume

configMap, secret, downwardAPI

쿠버네티스 리소스나 클러스터 정보를 Pod에 노출하는 데 사용되는 특별한 유형의 볼륨

persistentVolumeClaim

사전 혹은 동적으로 프로비저닝된 persistent storage 사용하는 방법

볼륨 예제 - emptyDir

apiVersion: v1
kind: Pod
metadata:
  name: fortune
  labels:
    app: exam-volume
spec:
  containers:
    - image: luksa/fortune
      name: html-generator
      volumeMounts:
        - name: html
          mountPath: /var/htdocs
    - image: nginx:alpine
      name: webserver
      volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
          readOnly: true
      ports:
        - containerPort: 80
          protocol: TCP
  volumes:
    - name: html
      emptyDir: {}
  • html-generator container에서 fortune 결과를 html 형식으로 생성하여 공유 볼륨에 저장
  • websever 컨테이너에서 공유 볼륨의 내용을 이용하여 HTML 형식으로 서비스

실행 방법

Pod가 실행되는 노드 (워커 노드)에서 수행

  • kubectl port-forward fortune 8080:80 : 호스트 포트를 Pod의 포트로 포워딩
  • curl http://localhost:8080 : 웹브라우저로 fortune 결과 확인

0개의 댓글