리뷰 (Review)
kubectl
- Kubernetes 상태를 확인하고 원하는 상태를 요청하는 client 명령
- CLI 형태로 사용
- kubectl [command] [TYPE] [NAME] [flags]
- kubectl reference
대표적인 kubectl 명령
- get - 리소스 목록 출력
- apply - 원하는 상태 적용, -f <파일명> 형식을 많이 사용
- create - 리소스 생성
- describe - 리소스 상태의 자세한 정보
- delete - 리소스 제거
- exec - container 명령 전달, container 접근 시 사용
- logs - container 로그 정보
- config - kubectl 설정 관리
Kubernetes Object
- Kubernetes는 Object(Resource)와 Object를 관리하는 Controller(kube-controller-manager)로 나뉜다.
- Kubernetes 시스템에서 영속성을 가지는 Object (Resource)
- Object를 생성하면 Kubernetes 시스템은 원하는 상태를 보장하기 위해 지속적으로 동작
- Kubernetes는 cluster의 상태를 나타내기 위해 Object를 이용
- Object는 status, spec 2개의 필드에 의해서 구성
- Controller는 status와 spec이 일치하도록 Object 관리
Kubernetes 기본 Object
- Pod - Kubernetes에서 가장 기본적인 배포 단위
- Volume
- Service
- Namespace - Linux Kernel의 Namespace와는 다른 의미
namespace
- Kubernetes cluster 내의 논리적인 분리 단위
- namespace 단위로 자원 할당, 사용자 접근 권한 관리 등을 수행
- 별도로 namespace를 지정하지 않으면 default namespace에 Object가 생성
Kubernetes 환경 구성 개선
CRI 지원 container runtime 설치 후 Kubernetes Cluster 재구성
1. 기존 cluster 초기화
- Master node, Worker node 초기화 및 관련 파일 삭제
sudo kubeadm reset
sudo rm -r /etc/cni/net.d/*
sudo rm -r ~/.kube/config
sudo systemctl restart kubelet
2. cri-docker container runtime 다운로드
- https://github.com/Mirantis/cri-dockerd/releases/tag/v0.2.6
- 버전에 맞는 파일 다운로드, 현재 환경에서는 cri-dockerd_0.2.6.3-0.ubuntu-jammy_amd64.deb
3. git, vscode 등을 이용하여 Instance에 업로드
4. cri-docker 설치 및 활성화
- Master node, Worker node에 해당 파일 설치
sudo apt install ./cri-dockerd_0.2.6.3-0.ubuntu-jammy_amd64.deb
- daemon 및 socket enable 설정
sudo systemctl enable cri-docker
sudo systemctl enable --now cri-docker.socket
5. Master node에 cluster 구성
- cri-dockerd.sock 파일 확인
ls -lF /var/run/cri-dockerd.sock
- Master node에서만 cluster 생성
sudo kubeadm init --cri-socket "unix:///var/run/cri-dockerd.sock"
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 생성된 token 수정 및 저장
cat > token.txt
kubeadm join 10.0.1.124:6443 --token 1q2w3e4r5t6y7u8i9o0p \
--discovery-token-ca-cert-hash sha256:1q2w3e4r5t6y7u8i9o0p --cri-socket "unix:///var/run/cri-dockerd.sock"
6. CNI 구성
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
7. Worker node에서 token.txt 값 입력하여 연결
sudo kubeadm join 10.0.1.124:6443 --token 1q2w3e4r5t6y7u8i9o0p \
--discovery-token-ca-cert-hash sha256:1q2w3e4r5t6y7u8i9o0p --cri-socket "unix:///var/run/cri-dockerd.sock"
8. Master node에서 연결 확인
kubectl get nodes
Pod
- 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에 밀접한 연관성을 갖고 있는 container를 배치하여 연관성 있는 container 간에 리소스를 공유하는
Pod 생성
- kubectl run reference
- kubectl run 명령으로 생성
- Docker에서 container 생성하는 방법과 같은 방식
- 단일 container Pod 생성
- kubectl run <pod 이름> --image <container image 이름:버전 정보> --port <port 번호>
- kubectl run webserver --image=nginx --port=80
- kubectl run webserver --image=nginx --port=80 --namespace myspace
- kubectl apply 명령으로 생성
- kubectl apply -f exam-nginx.yml - 단일 container 생성
- kubectl apply -f webserver-multi.yml - 다중 container 생성
##### exam-nginx.yml #####
apiVersion: v1
kind: Pod
metadata:
name: webserver
labels:
app: myweb
spec:
containers:
- name: nginx-container
image: nginx:latest
ports:
- containerPort: 80
##### webserver-multi.yml #####
apiVersion: v1
kind: Pod
metadata:
name: webserver2
labels:
app: myweb
spec:
containers:
- name: nginx-container
image: nginx:latest
ports:
- containerPort: 80
- name: httpd-container
image: httpd:latest
ports:
- containerPort: 8080
##### multi-container.yml #####
apiVersion: v1
kind: Pod
metadata:
name: kubetm
spec:
containers:
- name: container1
image: kubetm/8000
ports:
- containerPort: 8000
- name: container2
image: kubetm/p8080
ports:
- containerPort: 8080
Pod 목록 확인
- kubectl get pods : default namespace Pod 목록 확인
- kubectl get pods -o wide : default namespace Pod 목록 상세 정보 확인
- kubectl get pods -o wide --all-namespaces : 모든 namespace의 Pod 목록 상세 정보 확인
Pod에 명령 수행
- kubectl exec <pod 이름> -it <명령>
- kubectl exec webserver -it /bin/bash : webserver /bin/bash로 실행, 소멸 예정 명령 형식
- kubectl exec <pod 이름> -it -- <명령>
- kubectl exec webserver -it /bin/bash : webserver /bin/bash로 실행, 새로 지원하는 방식
Pod 삭제
- kubectl delete reference
- kubectl delete pod <pod 이름>
- kubectl delete pod webserver
- kubectl delete pod/<pod 이름>
- kubectl delete pod/webserver pod/webserver2 --namespace myspace
Application debug
Label
- 임의의 Label을 설정하여 cluster 안에서 편리하게 관리할 수 있다.
- Kubernetes 리소스에 설정한 Label을 LabelSelector 기능을 사용하여 필터링할 수 있다.
- Label은 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 이름> 명령으로 확인 가능
- Pod status
- Pending - Pod 생성을 기다리는 상태, container image 다운로드 등 시간이 걸리는 경우 발생
- Running - Pod 정상 작동 중인 상태
- Succeeded - Pod 안의 container가 정상적으로 종료된 상태
- Failed - Pod 안의 container 중 하나의 container가 생성 실패 등의 이유로 종료된 상태
- Unknown - 어떠한 이유로 Pod와 통신할 수 없는 상태
- Pod conditions
- 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 - Worker node의 파일 시스템을 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 Volume 예제
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에서 수행
kubectl port-forward fortune 8080:80
curl http://localhost:8080
TIF
수많은 명령어들을 다 외우는 것이 아니다.
쓰다 보면 자주 쓰는 건 자연스럽게 체득하고 나머지는 검색해서 쓰면 된다.
Kubernetes 실습하면서 에러가 많이 생겨서 오늘 환경 구성을 새로 했다.
이번에는 container 생성이 막힌다.
ContainerCreating에서 진전이 없길래 찾아보니 CNI가 꼬인 것이라고 하는데...
또 다시 세팅해야겠다.
다시 세팅하면서 복습도 하고 배우는 거지 뭐...
빌어먹을 sudo...
2022. 10. 12 에 작성된 글입니다.
'구름 쿠버네티스' 카테고리의 다른 글
구름 쿠버네티스 전문가 과정 6기 - 50일차 (3) | 2023.11.08 |
---|---|
구름 쿠버네티스 전문가 과정 6기 - 49일차 (3) | 2023.11.07 |
구름 쿠버네티스 전문가 과정 6기 - 47일차 (3) | 2023.11.03 |
구름 쿠버네티스 전문가 과정 6기 - 46일차 (3) | 2023.11.02 |
구름 쿠버네티스 전문가 과정 6기 - 45일차 (2) | 2023.11.01 |