어쩌다 IT
article thumbnail
반응형

리뷰 (Review)

더보기

Kubernetes 실습 환경 구성

  1. Master node, Worker node에 해당하는 서버 생성
  2. Master node, Worker node에 container runtime 환경 구성 - Docker 설치
  3. kubeadm, kubectl, kubelet 설치
  4. Master node / Worker node 구성
  5. CNI 구성
  6. Worker node에서 Master node 연결
  7. Kubernetes 환경 구성 확인

 

AWS로 Kubernetes 사용 시

  • The connection to the server 127.0.0.1:80 was refused - did you specify the right host or port?
  • 해당 에러가 자주 발생한다.
  • 스크립트 생성 - daemon 및 kubelet 재시작
cat > reload.sh
sudo systemctl daemon-reload
sudo systemctl restart kubelet
  • 스크립트 실행
source reload.sh

 

실습 및 연습 환경


kubectl 명령어

 

kubectl

  • Kubernetes 상태를 확인하고 원하는 상태를 요청하는 client 명령
  • CLI 형태로 사용
  • kubectl 명령 동작 시 config file은 $HOME/.kube 디렉토리에서 찾으며 KUBECONFIG 환경 변수를 설정하거나
    '--kubeconfig' flag를 사용하여 다른 kubeconfig 파일을 지정할 수 있다.
  • kubecetl reference
  • kubectl [command] [TYPE] [NAME] [flags]
    • command - 하나 이상의 리소스(object)에서 수행하려는 동작 지정
      • create
      • run
      • apply
      • get
      • describe
      • delete
      • exec
      • logs
      • config
    • TYPE
      • 리소스 Type 지정
      • 리소스 Type은 대소문자를 구분하지 않으며 단수형, 복수형 또는 약어 형식으로 지정
    • NAME
      • 리소스 이름 지정
      • 대소문자 구분
      • 생략하면 모든 리소스를 지정하거나 하나 이상의 file을 지정
    • flags
      • 선택적 flag 지정 (옵션)
        • -o <flag 내용> : 출력 형식 지정
        • -f <파일명> : 파일 지정
    • TYPE 및 NAME으로 리소스 지정 시 참고 사항
      • 리소스가 모두 동일한 TYPE인 경우 리소스를 그룹화하려면 'TYPE name1, name2 name<#>' 형식과 같이 사용
        • ex) kubectl get example-pod1 example-pod2
      • 여러 리소스 TYPE을 개별적으로 지정하려면 'TYPE/name1 TYPE/name2 TYPE<#>/name<#>' 형식과 같이 사용
        • ex) kubectl get pod/example-pod1 replicationcontroller/example-rc1
    • kubectl : kubectl 명령 목록 출력
    • kubectl [command] --help : command에 대한 도움말
    • kubectl api-versions : 현재 cluster에서 사용 가능한 API 버전 정보
    • kubectl api-resources : 사용할 수 있는 resource 목록
    • kubectl config view : config 파일 내용

 

대표적인 kubectl 명령

  • get - 리소스 목록 출력
  • apply - 원하는 상태 적용, -f <파일명> 형식을 많이 사용
  • create - 리소스 생성
  • describe - 리소스 상태의 자세한 정보 확인
  • delete - 리소스 제거
  • exec - container 명령 전달, container 접근 시 사용
  • logs - container 로그 정보 확인
  • config - kubectl 설정 관리

 

  • kubectl get [resources]
    • kubectl get all : Pod, Replicaset, Deployment, Service, Job 등 전체 목록
    • kubectl get nodes : cluster 내 node 목록
    • kubectl get pods : pod 목록
    • kubectl get pods -o wide : pod 목록 정보 상세 출력
    • kubectl get pod <pod 이름> -o yaml : pod 정보를 yaml 형식으로 출력
    • kubectl get pods --show-labes : label 포함 출력

 

  • kubectl describe [resource 이름]
    • resource에 대한 상세 정보 출력
    • 통상 pod가 제대로 동작하지 않는 경우 log를 확인하거나 해당 pod의 describe 정보를 확인하여 원인 파악

 

  • kubectl apply -f [yaml 파일(현재 시스템 / 원격지 시스템 경로 포함)]
    • 리소스 생성
    • 하나 이상의 서비스 생성

 

  • kubectl delete -f [yaml 파일]
    • 생성 시 사용한 yaml을 이용하여 리소스 삭제
  • kubectl delete [TYPE] [NAME]
    • TYPE에 해당하는 NAME의 리소스 삭제
  • kubectl delete [pod NAME]
    • 해당 pod 삭제

 

  • kubectl logs POD [-c CONTAINER] [--follow] [flags]
    • pod log 확인

 

  • kubectl exec [pod NAME] -it /bin/bash
    • 특정 pod에 대하여 명령 실행

 

  • kubectl config view
    • config 파일 내용 확인

namespace

 

Kubernetes Object

  • Kubernetes는 Object(Resource)와 Object를 관리하는 Controller로 나누어져 있다.
  • Kubernetes Object
    • Kubernetes 시스템에서 영속성을 가지는 Object
    • Object를 생성하면 Kubernetes 시스템은 원하는 상태를 보장하기 위해 지속적으로 동작
  • Kubernetes는 cluster의 상태를 나타내기 위해 Object를 이용
  • Object를 2개의 필드에 의해서 구성
    • status - Kubernetes 시스템과 component에 의해 제공되고 업데이트된 Object의 현재 상태 설명
    • spec - Object 특성으로 추구하는 상태
  • Controller는 status와 spec이 일치하도록 Object 관리

 

Kubernetes 기본 Object

  • Pod
    • Kubernetes에서 가장 기본적인 배포 단위
    • container를 포함하는 단위
    • Kubernetes의 특징 중 하나로 container를 개별적으로 배포하는 것이 아닌 Pod 단위로 배포
    • Pod는 하나 이상의 container 포함
  • Volume
    • container는 기본적으로 상태가 없는 app container 사용
    • 상태가 없다는 것은 container 혹은 node에 문제가 있어 container를 새로 실행했을 때 다른 node에 자유롭게
      옮길 수 있다는 뜻으로 container의 장점
    • 하지만 container가 실행되지 않거나 삭제된다면 현재까지 저장한 데이터는 사라진다는 단점
    • app의 특성에 따라 container에 문제가 발생해도 데이터를 보존해야 하는 경우 Volume 사용
    • Volume은 container가 재시작하더라도 데이터 유지
  • Service
    • Pod 집합에서 실행 중인 Application을 네트워크 서비스로 노출하는 추상화 방법
    • Service는 Pod에게 고유한 IP 주소와 Pod 집합에 대한 단일 DNS를 부여하여 Pod가 cluster 안 어디에 있든
      고정 주소를 통해 접근 가능하도록 한다.
  • Namespace
    • Kubernetes cluster 하나를 여러 개의 논리적인 단위로 나눠서 사용
    • Pod와 Service 등 namespace 별로 생성하고 관리될 수 있다.

 

Kubernetes Object 기술 방법 - YAML

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: python-sample-deployment
  namespace: default
spec:
  selector:
    matchLabels:
      app: python-sample-app
  replicas: 1
  template:
    metadata:
      labels:
        app: python-sample-app
    spec:
      containers:
      - name: python-sample
        image: dockerimage주소:태그
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 500m
            memory: 200Mi
        ports:
        - containerPort: 8000
  • YAML 파일 4개의 공통 tag
    • apiVersion
      • Object를 생성하기 위한 Kubernetes API 버전 명시
    • kind
      • 어떤 종류의 Object를 생성하고자 하는지 명시
    • metadata
      • Object 이름 부여
      • Object를 유일하게 구분 지어줄 데이터
      • name - 동일 namespace상 유일한 값
      • labels - 특정 Kubernetes Object만 나열하거나 검색할 때 유용하게 쓰이는 key:value 쌍
    • spec
      • 생성할 Object의 구체적인 내용을 정의한 spec
      • spec의 format은 Kubernetes Object 종류마다 다르다.
      • 자주 쓰이는 spec 항목
        • containers
          • Pod에는 1개 이상 container 포함
          • containers에 원하는 만큼 container 정의
        • image - pull 받아올 docker image 주소
        • replicas - 원하는 Pod 개수
        • selector - controller가 어떤 Pod를 감시하는지 명시
        • template
          • 새로운 Pod를 생성할 때 사용할 template
          • selector 값이 template의 labels과 일치해야 관리되는 Pod를 제대로 선택
##### exam-nginx-pod.yml #####
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: myweb
spec:
  containers:
  - name: myweb-container
    image: nginx:latest
    ports:
    - containerPort: 80
##### exam-nginx-deploy.yml #####
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

 

 

 

namespace

  • Kubernetes cluster 내의 논리적인 분리 단위
  • namespace 단위로 자원 할당, 사용자 접근 권한 관리 등을 수행할 수 있다.
  • 별도로 namespace를 지정하지 않으면 항상 default namespace에 Object 생성
  • namespace는 논리적인 분리 단위를 의미하고 물리적인 분리를 의미하지는 않는다.

 

namespace 생성

  • YAML 파일 이용 생성
    • kubectl apply -f exam-namespace.yml
##### exam-namespace.yml #####
apiVersion: v1
kind: Namespace
metadata:
  name: exam-namespace
spec:
  finalizers:
  - kubernetes
  • kubectl create 명령으로 생성
    • kubectl create namespace <namespace 이름>
  • namespace에 Object 생성
    • YAML 파일 metadata tag에 namespace: 지정하고 Object 생성
apiVersion: v1
kind: Pod
metadata:
 name: nginx-pod
 namespace: exam-namespace2
 labels:
   app: myweb
spec:
 containers:
 - name: myweb-container
   image: nginx:latest
   ports:
   - containerPort: 80
  • namespace 지정하여 Object 검색
    • kubectl get namespaces : 전체 namespace 검색
    • kubectl get <resource 이름> --namespace <namespace 이름>
      • kubectl get pods --namespace default
  • namespace 삭제
    • kubectl delete namespace/<namespace 이름>
    • kubectl delete -f <yaml 파일 이름>

TIF

AWS에서 쿠버네티스를 실행하면

The connection to the server 127.0.0.1:80 was refused - did you specify the right host or port?

해당 에러가 너무 많이 발생한다.

거의 명령어 하나 입력할 때마다 에러 나는 것 같다.

 

Play with Kubernetes로 하려고 했더니 여기도 막혔나... 접속이 안된다.

카타코다는 6월부터인가 서비스가 끝났다고 하고...

 

Linux로 환경 구성을 하나 더 해야 되나 싶다.

 

 

2022. 10. 11 에 작성된 글입니다.

반응형
profile

어쩌다 IT

@jwlish

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