공부하기싫어
article thumbnail

CRI 지원 container runtime 설치 후 kubernetes cluster 재구성

 

kubernetes container runtime

- https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes/

 

kubernetes 1.24 이후 버전 부터 docker container engine 지원 종료에 따른 container engine 교체

 

cri-docker container runtime download

- https://github.com/Mirantis/cri-dockerd/releases/tag/v0.2.6

“cri-dockerd_0.2.6.3-0.ubuntu-jammy_amd64.deb” 파일 download - Ubunut 22.04LTS용

 

  • 기존 cluster 초기화
  • master node

sudo kubeadm reset

관련 파일 삭제

  • sudo rm -r /etc/cni/net.d/*
  • sudo rm -r ~/.kube/config

sudo systemctl restart kubelet

 

  • worker node

- sudo kubeadm reset

- 관련 파일 삭제

  • sudo rm -r /etc/cni/net.d/*
  • sudo rm -r ~/.kube/config

- kubelet 재시작

sudo systemctl restart kubelet

 

 

 

  • cri-docker 설치 및 활성화  - master/worker node

sudo apt install ./cri-dockerd_0.2.6.3-0.ubuntu-jammy_amd64.deb

daemon 확인 - systemctl status cri-docker

 

daemon 및 socker enable 설정

  • sudo systemctl enable cri-docker
  • sudo systemctl enable --now cri-docker.socket

 

kubelet 재시작

- sudo systemctl restart kubelet

 

 

  • master node에 cluster 구성

cri-dockerd.sock 파일 확인

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

 

cluster 생성

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

  • cluster 구성 후 현재 사용자와 root 사용자에 적용

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

 

  • worker node에서 cluster에 join 하는 명령 저장

$ cat > ~/work/token.txt 

sudo kubeadm join 10.0.1.71:6443 --token mhtvg9.g6zj0xtfukqb7jbx \

        --discovery-token-ca-cert-hash sha256:fc191583307bdfe23f8df91431d75befbfea5e4246eef3469a9b2047514c1c62 --cri-socket "unix:///var/run/cri-dockerd.sock"

 

CNI 구성( weave net )

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

 

 

 

Pod

참고 - https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/

 

kubernetes 에서 하나의 독립적인 서비스를 제공할 수 있는 container 들을 모아서 관리하는 최소 배포 단위

pod 단위로 container 작성, 시작, 정지, 삭제 등과 가튼 조작 수행

  •  pod 특징

동일한 pod의 container는 반드시 동일한 node 상에 동시에 deploy 됨

container는 service 와 연결될 수 있도록 port 를 가지고 있는데, 같은 pod 안에서 port는 중복될 수 없다.

pod 안의 여러 container 에서 가상 NIC(private ip) 를 공유하는 구성을 취하기 때문에 container 끼리 localhost 를 경유하여 통신할 수 있다.

pod 가 생성 될 때 고유 ip가 할당되며 cluster 내에서만 접근할 수 있다.

 

  • pod 구성

1개 이상의 container

Volume - pod 내의 container 간에 데이터 공유/저장, 선택적

단일 container pod

- pod 당 하나의 container 모델로 가장 일반적인 형태

다중 container pod

- pod에 밀접한 연관성을 갖고 있는 container 를 배치하여 연관성 있는 container 간에 리소스를 공유하는 형태의 캡슐화된 모델

 

 

  • pod 생성

kubectl run 명령으로 생성 -> 단일 container pod 생성

  • 단일 container pod 생성

kubectl run [pod이름] --image=[image:version] --port=[port num]

- kubectl run webserver --image=nginx --port=80

- kubectl run webserver --image=nginx --port=80 --namespace myspace

- kubectl get pods -wide -> default namespace pod 목록 확인

- kubectl get pod -o wide --all-namespace -> 모든 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 [cmd]

kubectl exec [pod] -it --[cmd]

- 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 생성 - 단일 container 생성

apiVersion: v1
kind: Pod
metadata:
 name: webserver
 labels:
   app: myweb
spec:
 containers:
 - name: nginx-container
   image: nginx:latest
   ports:
   - containerPort: 80

kubectl apply -f exam-nginx.yml

 

 

kubectl apply 명령으로 pod 생성 - 다중 container 생성

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

kubectl apply -f multi-container.yml

 

 

  • Label

임의의 Label 을 설정하여 cluster 안에서 편리하게 관리할 수 있다.

kubernetes 리소스에 설정한 label을 LabelSelector 기능을 사용하여 필터링 할 수 있다.

Label은 key-value 형으로 설정하며 key와 value 모두 문자형

pod 에는 여러개의 label 부여 가능

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가 생성하여 동작하는 node(worker node) 를 결정하는 방법

- master node 의 kube-scheduler 에 의한 자동 결정 - 기본 방식

- 사용자에 의한 결정

필요에 따라 YAML 파일에 속성으로 지정하여 결정 가능

nodeSelector 속성을 이용하여 설정

apiVersion: v1
kind: Pod
metadata:
 name: webserver
 labels:
   type: app
    lo: dev
spec:
 nodeSelector:
    kubernetes.io/hostname: worker1.example.com
 containers:
 - name: nginx-container
   image: nginx:latest
   ports:
   - containerPort: 80

 

 

 

  • pod 생명 주기

pod의 생명 주기는 kubectl describe pods [pod name] 명령으로 확인 가능

 

  • pod status
설명
Pending Pod 생성을 기다리는 상태, container image 다운로드등 시간이 걸리는 경우 발생
Running Pod 정상 작동 중인 상태
Succeeded Pod 안의 container가 정상적으로 종료된 상태
Failed Pod 안의 container 중 하나의 container가 실패하여 종료된 상태
Unknown 어떤 이유로 Pod와 통신할 수 없는 상태

 

pod conditions

Type 설명
Initialized 모든 초기화 container가 성공적으로 시작 완료 의미
Ready Pod는 요청들을 실행할 수 있고, 연결된 모든 서비스의 Load Balancing pool에 추가되어야 한다는 의미
ContainersReady Pod 안 모든 container가 준비 상태란 의미
PodScheduled Pod가 하나의 node로 schedule을 완료했다는 의미
Unschedulable schedule가 자원 부족이나 다른 제약등으로 지금 당장 Pod를 schedule 할 수 없다는 의미

 

 

 

 

Volume

  • Volume

volume은 pod의 일부분으로 정의되는 요소

pod와 동일한 생명주기를 갖는 disk storage

Volume 은 독립적인 리소스가 아니므로 자체적으로 생성, 삭제할 수 없다

pod에 여러개의 container를 갖는 경우 모든 container가 volume을 공유할 수 있다.

volume은 pod의 모든 container에서 사용 가능하며 사용시 container 에서 mount 해야 사용할 수 있다.

각 container 파일 시스템의 어느 경로에도 mount 할 수 있다.

 

 

  • volume 유형

emptyDir

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

 

hostPath

- 워커노드의 파일 시스템을 pod의 디렉토리로 mount 하여 사용

 

nfs

- nfs 공유 pod 에 mount

 

public cloud 전용 스토리지

- Amazon EBS, GCE Persistent Disk, Azure Disk Volume

 

configMap, secret, downwardAPI

- kubernetes 리소스나 cluster 정보를 pod에 노출하는데 사용되는 특별한 유형의 volume

 

persistentVolumeClaim

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

 

 

  • volume예제 - 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 형식으로 생성하여 공유 volume 에 저장

webserver container 에서 공유 volume 의 내용으르 이용하여 html 형식으로 서비스

실행방법 - pod가 실행되는 node(master node)에서 수행

- kuberctl port-forward fortune 8080:80 -> host port를 pod의 port로 포워딩

- curl http://localhost:8080 -> web browser로 fortune 결과 확인