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 결과 확인
'Kubernetes > [구름] 쿠버네티스 전문가 양성 과정 k-digital' 카테고리의 다른 글
[리포트+후기] 구름 쿠버네티스 전문가 양성 과정(6기) 수료 프로젝트 (1) | 2022.12.20 |
---|---|
[11주-10.13] ReplicaSet (0) | 2022.10.26 |
[11주-10.11] kubectl 명령어 (1) | 2022.10.23 |
[10주-10.7] Kubernetes 환경 구성 (1) | 2022.10.22 |
[10주-10.6] Kubernetes 개요 (0) | 2022.10.21 |