쿠버네티스 클러스터(= 서버)를 관리하는 동작은 대부분이 kubectl이라는 커맨드라인 인터페이스(CLI)로 실행할 수 있다.
kubectl에서 지원하는 명령은 아래와 같이 확인 가능.
kubectl or kubectl입력후 tab두번으로 자동완성
명령형 커맨드 : yaml파일 사용 x
명령형 오브젝트 구성 : yaml파일 사용 o
선언형 오브젝트 구성 : yaml파일 사용 o
📗 오브젝트 = resource
📗 오브젝트 관리 참조
명령형 커맨드를 사용할 경우, 사용자는 클러스터 내 활성 오브젝트를 대상으로 직접 동작시킨다. 사용자는 실행할 작업을 인수 또는 플래그로 kubectl 커맨드에 지정한다.
이것은 클러스터에서 일회성 작업을 개시시키거나 동작시키기 위한 추천 방법이다. 이 기법은 활성 오브젝트를 대상으로 직접적인 영향을 미치기 때문에, 이전 구성에 대한 이력을 제공해 주지 않는다.
yaml파일을 작성하지 않고 그냥 한줄로 명령을 실행하는 것.
약간 ansible에서 adhoc명령과 같은 느낌.
예시로, 디플로이먼트 오브젝트를 생성하여 nginx 컨테이너의 인스턴스를 구동시킨다.
kubectl create deployment nginx --image nginx
1 . 컨테이너 생성 예시
kubectl create deployment myapp --image=ghcr.io/c1t1d0s7/go-myweb:alpine
# 깃허브 레지스트리에서 image가져와서 컨테이너 생성
kubectl get deployments
# 배포한 컨테이너 정보 보기
kubectl get replicasets
# 내가 생성하지는 않았지만 자동으로 같이 생성된다
# replicasets 정보 보기
kubectl get pods
# 파드 정보 보기
-> deployment deployment이름 의 형식으로 입력하는데 deployment는 컨테이너이름을 입력하는 느낌이다.
2 . 1번에서 만든 컨테이너에서 포트포워딩한 서비스 생성
kubectl expose deployment myapp --port=80 --protocol=TCP --target-port=8080 --name myapp-svc --typ
e=LoadBalancer
# 80을 8080에 포워딩
kubectl get services
# 생성한 서비스 확인
-> 브라우저에 호스트ip:80(생략) 입력하면 text 확인
3 . 컨테이너 복제 및 확인
kubectl scale deployment myapp --replicas=2
# 1에서 만든 컨테이너를 두개로 복제
kubectl get pods
# 생성된 컨테이너 확인
-> 실제로 두개가 생성되어있는 것을 볼 수 있다.
-> 해당 ip에 curl해보면 로드 밸런싱이 되면서 text가 나오는 것을 확인
-> 실제 브라우저에 입력하면 로드 밸런싱은 되지 않는데, 그 이유는 브라우저는 로컬 캐싱을 하기 때문이다.
kubectl get all
-> pods, deployment, service, replicasets의 정보를 한번에 볼 수 있다.
4 . 삭제 및 선언형의 특징 예시
kubectl scale deployment myapp --replicas=5
# myapp이라는 컨테이너의 복제본을 5개로 선언한 것
kubectl get all
# 실제 확인해보면 pod가 5개가 생성됨
kubectl delete pod pod명
# 5개중 하나를 삭제
kubectl get all
# 다시 확인해보면 그대로 5개가 존재하는 것을 확인
-> 이전에 삭제한 pod는 실제로 삭제되었지만 바로 새로운 pod가 생성되면서 5개를 유지한다.
-> 쿠버네티스는 선언한 상태를 유지하려고 한다
📗 pc의 성능이나 환경에 의해 반드시 유지할 수 있는 것은 아니다
5 . nginx이미지로 컨테이너 생성 및 웹 서비스 생성
kubectl create deployment mynginx --image nginx --replicas 2
# 생성할떄 replica를 지정해서 생성할 수 있다.
-> dockerhub에 sudo로 login해서 image를 다운받아도 된다
-> 다운 받지 않아도 그냥 image이름 입력하면 자동으로 이미지를 다운받아서 컨테이너를 생성한다
kubectl get all
# 두개가 생성된 것을 확인
kubectl expose deployment mynginx --name mynginx-svc --port 80 --target-port 80 --protocol TCP --t
ype LoadBalancer
# 생성한 컨테이너에 포트포워딩한 웹 서비스 생성
-> 만약 targetport는 위의 2번 예시처럼 8080으로 뚫으면 접속이 안되는 것을 볼 수 있는데, 이유는 2번 예시의 사용된 image는 8080포트를 사용할 수 있도록 임의로 설정한 것이고 nginx 기본 image는 기본 포트가 80이므로 targetport를 80으로 설정해야 한다.
📗 항상 작업을 한 후 만든 것은 지워야 한다
kubectl delete deployment deployment이름
kubectl delete service service이름
kubectl delete pod pod이름
터미널에서 vi를 이용해 yaml파일을 작성할 수 있다._
vi ~/.vimrc # 설정파일 접속 후 아래처럼 작성
syntax on
autocmd FileType yaml setlocal ai ts=2 sw=2 sts=2 et autoindent
set cursorcolumn
-> 설정을 통해 ansible에서 yaml파일 작성한거와 같이 들여쓰기를 편하게 해준다
vi를 이용하지 않고 vscode를 연결하여 yaml파일 작성
vscode접속
확장팩 클릭
Remote-ssh 설치
터미널에서 vagrantfile있는 디렉터리에 명령어 입력
vagrant ssh-config
명령어 결과 복사
vscode 좌측하단 초록색 버튼 클릭
ssh 구성파일열고 users 디레터리에 .ssh선택 후 접속
복사한 명령어를 아래와 같이 수정후 이어 붙이기
💡 워크로드 참조
📗 사실 파드는 직접 생성할 필요없이 deployment, job과 같은 워크로드 리소스( = 컨트롤러)를 사용하여 생성한다. 파드가 상태를 추적해야 한다면, 스테이트풀셋(StatefulSet) 리소스를 고려한다.
📗 파드 개념 참조
쿠버네티스 클러스터의 오브젝트나 컨트롤러가 어떤 상태여야 하는지를 적용할 때는 YAML형식의 템플릿을 사용
apiVersion: v1
kind: Pod
metadata:
spec: # spec은 리소스마다 아래에 들어가는 항목이 모두 다르다
-> YAML파일의 최상위에는 항상 이 항목이 들어가고, 이 형태로 작성이 된다.
-> 리스트가 아닌 이상 순서는 상관없다
-> 명사가 두개이상 나오는 경우는 두번째부터 명사 시작에는 항상 대문자 시작한다 = camel case
-> YAML파일에 정의한 작업은 api서버에 요청한다
-> kubectl api-resources를 보면 KIND라는 항목이 있는데 이 항목이 YAML파일의 kind에 들어간다. 항상 대문자로 시작하며, 단수이다.
-> YAML파일의 apiVersion에는 아무 버전이나 입력하는 것이 아니라 위의 사진처럼 리소스에 해당하는 버전을 사용한다.
< 버전 >
v1 alpha1 -> v1 alpha2 -> v1 alpha3 .....
-> v1 beta1 -> v1 beta2 -> v1 beta3 .....
-> v1 (stable) = 가장 최신 버전
📌 버전 개념 참고
💡 쿠버네티스는 3개월마다 새로운 버전이 나오면 기존의 버전은 1년뒤에 지원을 종료한다. 따라서 항상 1년동안 한번은 버전 업그레이드를 해야한다.
버전 예시
api-versions # 버전 찾기
= v1-> v2beta1-> v2beta2-> v2
< metadata >
1 . 템플릿 구성 예시
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycon
image: nginx
ports:
- containerPort: 80
-> 단어끝에 s, 복수형이면 아래에는 보통 리스트 형태가 온다.
kubectl create -f test.yml
# 작성한 yaml파일 실행
kubectl get pods
# 생성된 컨테이너를 담은 파드 확인
kubectl delete -f test.yml
# 생성된 컨테이너를 담은 파드 삭제
# yaml파일이 지워지지는 않는다
2 . 설명 보기 (중요)
kubectl explain pods
kubectl explain pods.apiVersion
kubectl explain pods.kind
kubectl explain pods.metadata
kubectl explain pods.metadata.name
kubectl explain pods.spec
kubectl explain deployments
등등...
-> Deprecated라고 표시되어있는 것을 볼 수 있는데 이것은 추후에 없어질 기능이라는 것이다
-> Read-only라고 표시되어있는 것은 우리가 정의할 수 있는 것이 아닌 그저 읽기용이라는 것이다.
-> -required- 라고 표시되어있는 것은 반드시 들어가야할 항목, 필수라는 것이다.
-> kubectl explain pods.spec을 해보면 각 항목마다 자료형이 정의되어있다.
📌 예를 들어, <[]Object> 라고 표시되어 있다면 리스트, < integer > 라고 표시되어 있다면 정수를 사용해야 한다.