Chap 4. 쿠버네티스 첫만남

ka8main.png

기본 명령

파드 실행

kubectl run <NAME> —image <IMAGE>

위 명령어로 새로운 컨테이너(pod)을 실행시킬 수 있다.

파드 확인

kubectl get pod

위 명령어로 배포된 컨테이너(pod)을 확인할 수 있다.

kubectl run mynginx --image nginx
kubectl get pods

shell1.png

  • nginx 파드가 배포된 모습이다.

get 명령의 세번째 컬럼 STATUS는 현재 pod의 상태 정보를 나타낸다. pod이 가질 수 있는 상태는 다음과 같다.

상태값 설명
Pending 쿠버네티스 마스터에 생성 명령은 전달되었지만 실행되지 않은 상태(PVC 마운트 오류 등으로 발생할 수 있음)
ContainerCreating 특정 노드에 스케줄링되어 컨테이너를 생성중인 단계(이미지 다운로드 등)
Running Pod가 정상적으로 실행되고 있는 상태
Completed 계속 실행되고 있는 프로세스가 아닌, 한 번 실행하고 완료되는 배치작업 Pod에서 작업이 완료된 상태
Error Pod에 문제가 생겨 에러가 발생한 상태
CrashLoopBackOff 지속적으로 에러 상태로 있어 crash가 반복되는 상태

상태 정보 상세조회

특정 Pod의 상태 정보를 더 자세히 보고 싶다면 -o yaml 옵션을 추가하면 된다

kubectl get pod mynginx -o yaml

shell2.png

위와 같이 PodIP, nodeName등 다양한 상세 정보를 확인 가능하다.

각 Pod 요약정보 추가 호출

각 Pod의 IP등 정보를 바로 확인하려면 -o wide 옵션을 사용할 수 있다.

kubectl get pods -o wide

shell3.png

  • 내부 IP 로 10.244.1.2 가 할당된것을 확인 가능하다.

💡 k8s 내부 리소스들의 IP는 따로 DHCP와 같은 프로토콜로 할당되는 것이 아닌 CNI 플러그인을 통해 할당된다.

파드 상세정보 확인

kubectl describe pod

describe 명령어는 Event로그를 포함한 더 자세한 정보를 보여준다.

kubectl describe pod mynginx

shell4.png

파드 로깅

kubectl logs

파드의 로그 정보를 확인할 수 있다.

kubectl logs mynginx -f

-f옵션은 follow로, 로그를 계속 출력한다.

shell5.png

파드 명령 전달

kubectl exec <NAME> — <CMD>

실행중인 컨테이너에 명령을 전달할때 사용한다. 예를 들어 bash쉘을 띄워 서비스 DNS가 잘 호출되는지 등,,,

kubectl exec mynginx -it -- bash

shell6.png

파드/호스트간 파일 복사

kubectl cp <TARGET> <SOURCE>

호스트에서 파드로 (혹은 반대로) 파일을 복사한다.

kubectl cp /etc/passwd mynginx:/tmp/passwd

shell7.png

파드 정보 수정

kubectl edit pod <NAME>

실행중인 파드의 정보를 수정한다.

라벨 수정하기

kubectl edit mynginx

shell8.png

hello: world 라는 라벨을 추가했다.

파드 삭제하기

kubectl delete pod mynginx

shell9.png

nginx 파드를 삭제했다.

YAML기반 파드 생성

apiVersion: v1
kind: Pod
metadata:
  name: mynginx
spec:
  containers:
  - name: mynginx
    image: nginx

shell10.png

아래와 같이 수정하여 라벨을 추가할 수도 있다.

apiVersion: v1
kind: Pod
metadata:
  labels:
    hello: world
  name: mynginx
spec:
  containers:
  - name: mynginx
    image: nginx

shell11.png

고급 명령

리소스별 명령

쿠버네티스는 모든 것이 리소스로 표현된다. 예컨대, 지금까지는 Pod으로 명령어를 지정하였지만, Service, ReplicaSet, Deployment 등 다양한 리소스를 타겟으로 지정할 수도 있다.

kubectl get service
kubectl get deployments
...

네임스페이스

쿠버네티스에는 네임스페이스라는 개념이 있다. 클러스터를 논리적으로 나누기 위해서이다. 각 리소스는 네임 스페이스 별로 생성할 수 있으며, 접근제어 정책을 다르게 지정할 수도 있다.

  • default: 기본 네임스페이스로, 아무런 옵션 없이 리소스를 생성하면 이 네임스페이스에 생성된다.
  • kube-system: 쿠버네티스의 핵심 컴포넌트들이 들어있는 네임스페이스이다. 네트워크 설정, DNS 서버 등 중요한 역할을 담당하는 컨테이너가 존재한다.
  • kube-public: 외부로 공개 가능한 리소스를 담고 있는 네임스페이스이다.
  • kube-node-lease: 노드가 살아있는지 마스터에 알리는 용도로 존재하는 네임스페이스이다.

각 명령을 실행할때 —namespace | -n 옵션을 이용하여 특정 네임스페이스에 리소스를 생성하거나, 특정 네임스페이스의 리소스를 조회 가능하다.

자동완성 기능

쿠버네티스 명령을 매번 일일이 입력하는 것은 귀찮으므로 명령을 완성시켜주는 스크립트를 제공한다.

https://kubernetes.io/docs/reference/kubectl/generated/kubectl_completion/

echo 'source >(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc

즉석 리소스 생성

책에서는 cat + 파이프라인을 통해 yaml파일을 출력하는데, 아래 방식이 더 깔끔한 것 같다.

kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: mynginx
  labels:
    app: mynginx
spec:
  containers:
  - name: mynginx
    image: nginx
EOF

리소스 특정 정보 추출

jsonpath를 사용해서 특정 속성값만 추출해올 수 있다.

kubectl get node master -o jsonpath="{.status.addresses[0].address"

shell12.png

모든 리소스 조회

kubectl api-resources

shell13.png

  • --namespaced=true: 네임스페이스 레벨의 API 리소스만 조회

리소스 정의 설명

kubectl explain pods

클러스터 상태 확인

클러스터가 정상적으로 동작하고 있는지 확인하고 싶다면 아래 명령어를 사용할 수 있다.

kubectl cluster-info
kubectl get node
klubectl get pod -n kube-system

각 쿠버네티스 API 서버 작동 여부, 전체 노드 상태, 핵심 컴포넌트 Pod 상태를 확인한다.

클라이언트 설정 파일

kubectl config <SUBCOMMAND>

kubectl 툴은 내부적으로 KUBECONFIG ($HOME/.kube/config) 설정 파일을 참조하여 마스터 주소, 인증 정보 등을 관리한다. kubectl의 설정값을 바꾸기 위해서 해당 파일을 직접 수정할 수도 있고, kubectl config 명령을 사용할 수도 있다. 먼저, view 명령을 통해 클라이언트 설정 파일값들을 확인한다.

kubectl config view

or

kubectl $HOME/.kube/config

shell14.png

KUBECONFIG 파일은 크게 3가지 영역으로 나뉜다

  • clusters: kubectl 툴이 바라보는 클러스터 정보를 입력한다. (원격에 위치한 클러스터인 경우 원격 주소지를 입력한다.)
  • users: 쿠버네티스 클러스터에 접속하는 사용자를 정의한다. 접근제어 설정 등
  • contexts: cluster와 user를 연결해주는 것을 context라고 한다. 여러개의 클러스터나 사용자를 관리할 경우 유용하다.