kubectl CLI 설치
https://kubernetes.io/ko/docs/tasks/tools/install-kubectl-linux/
를 참고했다. 책의 내용과 동일함.
kubectl 기본 사용법
kubectl 명령어의 구성(생김새)
kubectl [command][TYPE] [NAME][flags]
command : 자원에 실행하려는 동작을 의미함. create, get, delete 등
type : 자원 타입을 의미함. pod, service, ingress 등
name : 자원 이름을 의미함.
flags : 부가적인 설정 옵션
The connection to the server localhost:8080 was refused - did you specify the right host or port?
위와 같은 오류가 떠서 찾아보는 중, 내 마스터노드에
mkdir -p HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):(id -g) $HOME/.kube/config
다음 명령을 실행하지 않았다는 것을 알게 되었다. 애초에 $HOME/.kube/config 파일이 해당 위치에 존재하지도 않는다. 실습이 전체적으로 꼬인것 같아 아예 삭제하고 새로 클러스터를 구성해야 할 것 같다.
kubectl get pods의 실행 화면이다
NAME : 파드 이름이 나온다.
READY : 0/1이면 파드는 생성되었으나 사용할 준비가 되지 않았다는 의미. 1/1이면 생성되었으며 사용할 준비도 되었다는 의미이다
STATUS : 파드의 현재 상태를 의미한다. Running은 파드가 실행되었다는 의미. 새로운 파드를 생성하는중에는 Terminating(컨테이너 접속중) 이나 ContainerCreating(컨테이너 생성중) 등으로 표시된다
RESTARTS : 해당 파드의 재사직 횟수를 의미한다
AGE : 파드의 생성 후 시간을 의미한다.
kubectl get services 의 실행 화면이다. svc는 service의 줄임말
NAME : 서비스의 이름
TYPE : 서비스 타입
CLUSTER-IP : 현재 클러스터 안에서 사용되는 IP
EXTERNAL-IP : 클러스터 외부에서 접속할 때 사용하는 IP이다. 별도 설정하지 않았을 시 none 이다.
PORTS : 해당 서비스에 접속하는 포트
AGE : 자원 생성 후 지난 시간.
POSIX/GNU 스타일 명령 작성 규칙
kubectl은 POSIX/GNU스타일의 명령 작성 규칙을 따른다.
다음 예시를 살펴보자
kubectl -n default exec my-pod -c my-container -- ls /
-n default : -n은 --namespace 옵션이다. 쿠버네티스 클러스터의 namespace를 default로 설정하라는 의미이다.
exec my-pod : 'my-pod'라는 이름의 파드에 해당 명령을 실행하라는 뜻이다(필수 인자)
-c my-container : 컨테이너 지정 옵션이다. -c == -container. 파드 안에 여러개의 컨테이너가 실행되었을 때 특정 컨테이너를 지정하는 옵션이다. my-container는 사용자가 만든 컨테이너이다
-- ls / 쿠버네티스 관련 옵션들을 모두 종료한다는 의미이다. 이후 컨테이너에서 실행할 명령 설정이 가능하다.
** 기억해 둘 만한 전역 플래그
-h(--help) : kubectl [command] --helop 형태로 사용한다. 개별 명령의 도움말을 출력한다
-v[log level] : 명령을 실행하는 과정의 로그를 출력하거나 로그 레벨을 설정한다. 디버깅 시에 사용한다.
kubectl api-resources
SHORTNAMES(자원의 단축 이름) APIGROUPT(함께 노출되는 자원 집합), NAMESPACED(특정 네임스페이스에 속해있는가?), KIND(객체 스키마) 등의 정보를 제공한다.
만약 도커 데스크탑으로 쿠버네티스를 사용한다면 자동으로 kubeconfig가 설정된다.
kubectl config use-context docker-desktop
위 명령으로 실행해 사용 가능하다
--kubeconfig 옵션으로 다른 설정파일을 지정할 수 있다
kubectl -kubeconfig=AWSconfig get pods
kubectl -kubeconfig=GCPconfig get pods
k8s로 컨테이너 실행시에는 두가지 방법이 있다.
kubectl run으로 컨테이너 실행하기
kubectl run [deployment name] --image [container image name] --port=[port number]
해당 명령은 다음과 같이 전달된다
[사용자] -(명령)-> [쿠버네티스 클러스터의 컨테이너] <-(컨테이너 이미지)- [도커 허브]
사용자가 쿠버네티스 클러스터에 컨테이너 실행 명령을 내리면 컨테이너 이미지를 쿠버네티스 클러스터 안으로 가져와 실행한다.
디플로이먼트 설정이 담긴 탬플릿(yaml파일)로 컨테이너를 실행할 수도 있다.
책을 참고하면 탬플릿의 예시가 나온다.
외부 접근을 위해서는 k8s service를 사용해야 한다. 바로 파드에 접근할 수 없다
서비스 타입에는 ClusterIP, NodePort, LoadBalancer, ExternaName이 있다.
서비스 하나에 모든 노드의 지정된 포트를 할당하는 NodePort가 실습내용이다.
다음 명령어를 사용한다
kubectl expose deployment nginx-app --typNodePort
nginx-app은 컨테이너 이름이다
이후 kbuectl get service 명령으로 nginx-app이라는 서비스가 NodePort 타입으로 실행된것을 확인 가능하다
Port(s) 항목에 80:31572를 확인할 수 있는데, 쿠버네티스 내부의 80번 포트가 31572라는 외부 포트와 연결되었다는 뜻이다
이는 웹 브라우저에서 localhost:31572로 접속하면 클러스터 안의 해당 app에 접근 가능하다는 의미이다. nginx 기본페이지를 확인할 수 있다.