어쩌다 IT
article thumbnail
반응형

리뷰 (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 다운로드

 

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 생성

  • 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 에 작성된 글입니다.

 

반응형
profile

어쩌다 IT

@jwlish

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!