반응형
리뷰 (Review)
더보기
Kubernetes 실습 환경 구성
- Master node, Worker node에 해당하는 서버 생성
- Master node, Worker node에 container runtime 환경 구성 - Docker 설치
- kubeadm, kubectl, kubelet 설치
- Master node / Worker node 구성
- CNI 구성
- Worker node에서 Master node 연결
- 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
실습 및 연습 환경
- VirtualBox 등 가상 환경에 구축
- https://labs.play-with-k8s.com/
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 <파일명> : 파일 지정
- 선택적 flag 지정 (옵션)
- 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
- 리소스가 모두 동일한 TYPE인 경우 리소스를 그룹화하려면 'TYPE name1, name2 name<#>' 형식과 같이 사용
- kubectl : kubectl 명령 목록 출력
- kubectl [command] --help : command에 대한 도움말
- kubectl api-versions : 현재 cluster에서 사용 가능한 API 버전 정보
- kubectl api-resources : 사용할 수 있는 resource 목록
- kubectl config view : config 파일 내용
- command - 하나 이상의 리소스(object)에서 수행하려는 동작 지정
대표적인 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를 제대로 선택
- containers
- apiVersion
##### 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는 논리적인 분리 단위를 의미하고 물리적인 분리를 의미하지는 않는다.
- 하나의 cluster를 논리적으로 dev(개발) / stg(통합) / prd(운영)로 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 에 작성된 글입니다.
반응형
'구름 쿠버네티스' 카테고리의 다른 글
구름 쿠버네티스 전문가 과정 6기 - 49일차 (3) | 2023.11.07 |
---|---|
구름 쿠버네티스 전문가 과정 6기 - 48일차 (1) | 2023.11.06 |
구름 쿠버네티스 전문가 과정 6기 - 46일차 (3) | 2023.11.02 |
구름 쿠버네티스 전문가 과정 6기 - 45일차 (2) | 2023.11.01 |
구름 쿠버네티스 전문가 과정 6기 - 44일차 (1) | 2023.10.30 |