1. Kubectl 사용 환경 설정

1.1. Vagrant를 사용한 kubectl

https://github.com/techiescamp/vagrant-kubeadm-kubernetes를 클론하여 vagrant로 실행되는 쿠버네티스 클러스터를 생성하자.
해당 사이트는 쿠버네티스 클러스터를 자동으로 설정하기 위한 Vagrant 파일 및 스크립트들로 이루어져 있다.

이를 실행, 실행확인, 종료하며 vagrant와 쿠버네티스에 대해 익숙해져보자

> git install https://github.com/techiescamp/vagrant-kubeadm-kubernetes
> vagrant up 
> vagrant status
> vagrant ssh controlplane

~$ kubectl get nodes
~$ exit

> vagrant destory

1.2. Docker Desktop으로 Kubectl 실행

20240925_163744 환경설정에 들어간 뒤 위와 같이 Kubernetes 옵션을 켜 주고 Apply&restart를 눌러준다.

이후 kubectl 명령어를 사용해 생성된 노드들을 조회할 수 있다.

D:\새싹-금천구\클라우드\k8s\vagrant-kubeadm-kubernetes>kubectl get nodes
NAME             STATUS   ROLES           AGE   VERSION
docker-desktop   Ready    control-plane   30m   v1.29.2

2. Kubectl 기본 실습

도커 이미지를 도커 허브에서 받아와 모든 노드에서 실행하려고 한다. control plane에 도커를 설치한 뒤 다음 작업을 실행 해 보자

  1. 도커 허브 계정 정보를 갖고 있는 시크릿 생성
    ~$ kubectl create secret docker-repository regcred --docker-service=https://index.docker.io/v1/ --docker-username=******** --docker-password=*********
    
    • docker-repository: 시크릿 유형
    • regcred: 시크릿 이름
  2. 특정 시크릿을 imagePullSecrets의 기본값으로 할당
     ### 1. 클러스터 내 서비스 계정 목록 조회
     $ kubectl get serviceaccount
    
     ### 2. default 네임스페이스 내 default 서비스 계정의 상세 정보 조회
     $ kubectl describe serviceaccount default -n default
    
     ### 3. default 서비스 계정에 1에서 생성한 regcred 시크릿 연결
     $ kubectl patch -n default serviceaccount/default -p '{"imagePullSecrets":[{"name":"regcred"}]}'
    
     ### 4. 업데이트 확인
     $ kubectl describe serviceaccount default -n default
    
  3. nginx 컨테이너로 구성된 파드 생성

    case 1. 기본 제공 이미지로 파드 생성

    $ kubectl run my-nginx-pod-cli --image=nginx:latest --port 80
    

    case 2. YAML 파일을 작성하여 파드 생성
    a. controlplane 노드에서 아래 파일 생성

     apiVersion: v1 # YAML 파일에서 정의된 오브젝트의 API 버전
     kind: Pod # 리소스의 종류 
     metadata: # 라벨, 주석(annotation), 이름과 같은 리소스의 부가 정보
     name: my-nginx-pod
     spec: # 리소스 생성을 위한 정보
       containers:
         - name: my-nginx-contianer
         image: nginx:latest
         ports:
           - containerPort: 80
           protocol: TCP
    

        b. 실행 : $ kubectl apply -f nginx-pod.yml

  1. Pod 실행 확인
     $ kubectl get pods -o wide
    

    위 명령어를 입력하면 STATUS 항목에서 pod의 생성 현황을 볼 수 있다.
    가질 수 있는 상태값들은 다음과 같다.

    • ContainerCreating: 컨테이너 생성중 - Running: 파드가 클러스터의 특정 노드에 배치되었으며 내부의 모든 컨테이너가 생성 완료된 상태
    • ErrImagePull: 이미지 풀 실패
    • ImagePullBackOff: 지정된 컨테이너 이미지 가져오기 실패

    만약 실패했다면 아래 명령어를 입력하여 로그를 찾아보자.

     $ kubectl describe pod <pod이름>
    

    만약 다음과 같은 에러가 나타났다면 입력한 계정이 잘못된 것이므로 secret를 삭제 후 재생성 해 주어야 한다.

     Failed to pull image "nginx:latest": initializing source
     docker://quay.io/nginx:latest: unable to retrieve auth token: invalid
     username/password: unauthorized: Invalid Username or Password
    
  2. Control plane 노드에서 다른 노드로 이동하기
     ### 1. 현재 실행중인 pod들의 정보 보고 현재 실행중인 pod의 ip 조회 
     $ kubectl get pods -o wide
     NAME ...           IP               NODE
     my-nginx-pod       172.16.196.134   node01  ...
        
     ### 2. 해당 ip와의 연결 확인
     $ curl 172.16.196.134
    
     ### 3. ssh 명령어를 사용해 다른 node로도 접근이 가능하다.
     $ ssh vagrant@10.0.0.11
    
    - vagrant 기본 비밀번호: vagrant
    • 10.0.0.10 : 쿠버네티스 클러스터에서 기본 할당되는 IP. 여기서 1씩 증가한다.
  3. Pod 삭제
     $ kubectl delete [-f] <podname>
    
    • -f 옵션: kubectl apply -f로 생성한 객체를 제거할 땐 -f 옵션 사용