데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      AKS로 쿠버네티스 시작하기 : 사용한 명령어

      broccoli 23.08.31
      6,621 11 0
      DEVOTEE 요약
      IT 시스템을 시작하게 되면 처음으로 해당 시스템을 생성하거나 동작시키는 명령어를 사용하게 된다. AKS로 구축 진행한 경험을 토대로 AKS 클러스터 생성과정, AKS 환경 구성, kubectl 명령어 사용, 리소스 생성 및 삭제, namespace 사용, ingress-controller 설치, SSL 접속 방식 구성 등의 명령어 사용 방법을 설명한 글이다.
      DEVOTEE 추천 블로그

      IT 시스템을 시작하면 접하는 명령어

      새로운 IT시스템을 시작하게 되면 처음 만나는 것 중에 해당 시스템을 생성하거나 동작시키는 명령어가 있다.

      실제 구축과정에서 사용한 명령어를 정리해 보기로 하였다. AKS로 구축 진행했던 과정에서 인상에 남는 내용들로 정리를 하였다.

      AKS는 물론 쿠버네티스 기반이므로 쿠버네티스 명령어가 주로 사용되었다. azure portal UI 나 azure cli도 사용이 되었다.

      구축과정의 명령어를 위주로 정리하였고, 운영과정에서의 사용성이 높은 명령어도 추가할 것이다.

      AKS 클러스터를 처음 생성하고 확인하기

      azure portal UI로 진행가능하지만, 아래의 azure cli 로 클러스터를 생성할 수 있다.

      # 1. 구독 설정
      $ az account set --subscription <구독명>
      # 2. 클러스터 생성
      $ az aks create \
          --resource-group <리소스그룹명> \
          --name <클러스터명> \
          --node-count 3 \
          --generate-ssh-keys

      실행 결과]

      image.png


      image.png

      아래의 명령어로 Azure CNI 플러그인 사용, 서브넷 지정 등 추가로 설정하여 생성할 수 있다.

      $ az aks create \
        --resource-group myResourceGroup \
        --name myAKSCluster \ 
        --network-plugin azure \
        --vnet-subnet-id <subnet-id> \
        --docker-bridge-address 172.17.0.1/16 \
        --dns-service-ip 10.2.0.10 \
        --service-cidr 10.2.0.0/24 

      AKS를 다루기 위한 환경 구성하기

      쿠버네티스를 로컬PC에서 접속해서 관리를 손쉽게 할 수 있다. 그리고, 자주 쓰는 명령어를 편리하게 사용할 수 있도록 준비하여 사용하자.

      1. AKS를 로컬PC에서 접속하기 환경 구성

      azure portal에서 생성한 aks리소스에 대해 아래의 azure portal에서 config 파일을 준비하는 환경 설정으로 이후부터는 자신의 PC에서 자유롭게 구성을 진행할 수 있다.

      Kubernetes 클러스터에 접속하기 위한 Credential 설정 과정은 아래와 같다.

      # 1. 구독 설정
      $ az account set --subscription <구독명>
        
      # 2. 지정한 AKS 클러스터의 접속 정보(credentials)를 가져와 kubeconfig 파일에 저장
      $ az aks get-credentials --resource-group <리소스그룹명> --name <클러스터명>
        
      # 3. 특정 컨텍스트를 기본 컨텍스트로 설정
      $ kubectl config use-context <클러스터명>
        
      # 4. kubeconfig에 저장된 모든 컨텍스트 정보를 확인
      $ kubectl config get-contexts
        
      # 5. 모든 컨텍스트 정보를 저장하는 kubeconfig 파일 위치
      $ cd ~/.kube/config

      2. kubectl을 편하게 사용 '자동완성과 alias'

      자동완성과 alias 를 사용해서 자주 이용하게 되는 kubectl을 편리하게 사용 가능하자

      # BASH
      source <(kubectl completion bash) # set up autocomplete in bash into the current shell, bash-completion package should be installed first.
      echo "source <(kubectl completion bash)" >> ~/.bashrc # add autocomplete permanently to your bash shell.
      
      alias k=kubectl
      complete -o default -F __start_kubectl k
      
      
      # ZSH
      source <(kubectl completion zsh)  # set up autocomplete in zsh into the current shell
      echo '[[ $commands[kubectl] ]] && source <(kubectl completion zsh)' >> ~/.zshrc # add autocomplete permanently to your zsh shell

      AKS로 구축하기

      1. 클러스터의 구성 정보 확인

      aks를 구성하면 노드를 중심으로 정보를 확인하게 된다. 여기서 노는 control plane을 제외한 워커노드를 의미한다.

      # 노드 정보 보기 
      $ kubectl get nodes
      # 노드 정보 상세 보기
      $ kubectl describe node <노드이름>
      # 클러스터 정보 보기 
      $ kubectl cluster-info
      # 클러스터 정보 상세 보기 
      $ kubectl cluster-info dump 
       

      노드의 상세 정보는 descirbe 명령으로 확인한다.

      $ kubectl describe node <노드이름>

      ㅇ 아래의 예시를 참조해 볼 수 있다. 찾아 보게 되는 정보는 용량, 수용 가능 pod 개수, 서브넷 정도였다.

      image.png

      2. 가장 많이 사용한 'k9s'툴

      k9s를 사용하면 클러스터의 기본 정보 부터 pod의 내용까지 편리하게 정보를 확인해 낼 수 있다.

      image.png

      위 k9s툴을 볼 때, 처음 설치하고 나서 라인들이 깨지는 경우가 있을 땐, 아래의 내용을 추가하면 된다.

      .zshrc 에 아래의 내용 추가하면 해소
      # zshrc
      LANG="en_US.UTF-8"
      LC_COLLATE="en_US.UTF-8"
      LC_CTYPE="en_US.UTF-8"
      LC_MESSAGES="en_US.UTF-8"
      LC_MONETARY="en_US.UTF-8"
      LC_NUMERIC="en_US.UTF-8"
      LC_TIME="en_US.UTF-8"

      3. Default 컨텍스트 변경

      mgmt/dev/stg/prd별로 클러스터를 생성해서 구축을 하다보니 컨텍스트를 변경해야 할 일이 많아졌다.

      아래의 명령어로 수행이 가능하지만 확인과 변경에 번거로움이 있어 kubectx를 자주 사용하게 되었다.

      - 컨텍스트의 정의 : context는 kubeconfig 파일에서 클러스터, 사용자, 네임스페이스에 대한 정보를 그룹화한 설정 단위

      $ kubectl config get-contexts
      $ kubectl config use-context <클러스터명>
      
      $ kubectx 

      kubectx 는 brew install kubectx 로 간편하게 설치하여 사용 가능하다.

      image.png

      - 노란색이 현재 상태에서 지정된 기본 컨텍스트

      4. namespace를 항상 명시

      처음 리소스 생성 후 확인하는 과정에서 당황하는 경우가 있다. 조회시 네임스페이스를 꼭 기입해야 확인이 된다. 하지만, 여러 번 빼먹고 당황하고 했다.

      $ kubectl get svc ingress-nginx-controller
      Error from server (NotFound): services "ingress-nginx-controller" not found
      # 분명히 설치를 했는데 안 보이니 처음에는 당황한다. 
      
      # 네임스페이스를 명시하면 리소스 확인이 가능하다. 
      $ kubectl get svc ingress-nginx-controller  -n ingress-nginx
      NAME                       TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)                      AGE
      ingress-nginx-controller   LoadBalancer   10.0.7.81    10.26.0.5     80:30684/TCP,443:31840/TCP   76d

      5. 리소스 생성과 삭제

      yaml파일을 준비하고 kubectl apply 명령과 kubectl delete 명령으로 간단히 가능하다.

      $ kubectl apply -f <yaml 파일명>
      $ kubectl delete -f <yaml 파일명>

      6. 단순 설정 오류 시 빠르게 삭제

      초기라서 단순한 yaml 설정 오류로 삭제하는 경우가 빈번하게 일어났다. 많은 시간을 대기하는 경우가 많았으나 시간 낭비만 발생했다. 이미 오류를 눈치채고 빠르게 바꾸는 것이 현명하므로 강제로 삭제하는 것이 효율적이다.

      $ kubectl delete pod <파드명> --grace-period=0 --force -n <네임스페이스명>

      신속하게 삭제가 되어 업무 효율에 도움이 많이 되었다.

      7. 삭제 후 생성

      리소스의 yaml을 변경하고 재적용할 경우 반영이 안되는 경우들을 만났다.

      깔끔하게 삭제후에 생성하는 편이 더 좋은 경우가 많으니 삭제하고 진행하는 것을 권한다.

      8. 생성한 리소스 한 번에 파악

      helm등으로 설치된 리소스를 한 번에 파악하기에는 kubectl get all 명령어를 활용했다.

      $ kubectl get all -n datadog
      NAME                                         READY   STATUS    RESTARTS   AGE
      pod/datadog-cluster-agent-56684b85bd-5zp6q   1/1     Running   0          2d2h
      pod/datadog-f7glf                            3/3     Running   0          8d
      pod/datadog-j259t                            3/3     Running   0          2d2h
      pod/datadog-nn5mw                            3/3     Running   0          8d
      pod/datadog-z2km2                            3/3     Running   0          17h
      
      NAME                                                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
      service/datadog                                      ClusterIP   10.0.150.173   <none>        8125/UDP   8d
      service/datadog-cluster-agent                        ClusterIP   10.0.239.145   <none>        5005/TCP   8d
      service/datadog-cluster-agent-admission-controller   ClusterIP   10.0.110.163   <none>        443/TCP    8d
      
      NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
      daemonset.apps/datadog   4         4         4       4            4           kubernetes.io/os=linux   8d
      
      NAME                                    READY   UP-TO-DATE   AVAILABLE   AGE
      deployment.apps/datadog-cluster-agent   1/1     1            1           8d
      
      NAME                                               DESIRED   CURRENT   READY   AGE
      replicaset.apps/datadog-cluster-agent-56684b85bd   1         1         1       8d

      9. ingress-controller를 설치

      도메인 기반으로 pulic 접속을 위해 ingress-controller 설치와 ingress 설정이 필요하다.

      yaml 파일을 이용해서 ingress-controller 를 손쉽게 설치할 수 있다.

      참고로 FD등 앞 단에 게이트웨이들 둔 상태에서 ingress-controller를 설치하는 경우에는 아래의 yaml 파일에서 internal LB에 대한 설정과 네트워크 설계에 따라 도출된 internal IP 정보를 기입하여 설치하면 된다.

      $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud/deploy.yaml

      10. SSL 접속 방식 구성

      argocd와 같은 툴을 도메인 접속을 통해 SSL 방식으로 구성하려는 경우에는 secret 리소스를 생성하여 수행한다.

      확보한 인증서로 아래의 명령어로 secret을 생성하면 되고, 사용자 접속은 https를 지원하게 된다.

      $ kubectl create secret tls <tls명칭> \
         --cert {__dir__}/<인증서 파일 경로> \
         --key {__dir__}/<개인키 파일 경로> -n <네임스페이스명>

      11. 생성 AKS에 acr(azure container registry)을 attach

      프라이빗 이미지 저장소인 acr을 aks와 연결할 필요가 있다. az cli로 간단히 attach할 수 있어 편리하게 사용하였다.

      $ az account set --subscription <구독명>
      $ az aks update -n <클러스터명> -g <리소스그룹명> --attach-acr <acr명>

      12. 배포하기 argocd 명령어

      argocd를 배포하는 툴로 사용하고 있다. UI에서 배포할 수 있지만 구축과정에서 다수 배포시에는 argocd cli를 사용하면 편리하다.

      # argocd 설치 후 패스워드 확인이 필요하며 아래의 명령으로 가능하다. 
      $ kubectl get secret argocd-initial-admin-secret -n argocd -o jsonpath="{.data.password}" | base64 -d && echo
      
      # 우선 클러스터로 서비스를 구성한 argocd를 LB로 일시적으로 변경한다. 해당 argocd로 로컬에서 로그인하기 위함이다. 
      $ kubectl patch svc argocd-server -n <argocd 네임스페이스명> -p '{"spec": {"type": "LoadBalancer"}}' 
      # 위의 LB IP로 로그인
      $ argocd login <LB IP>
      # 배포 명령어 수행 
      $ argocd app create d-admin-portal \
        --repo <repo주소> \  
        --path <repo내 패키지의 설치 경로> \  
        --dest-server <배포할 타겟 클러스터> \
        --dest-namespace <네임스페이스명>

      디버그 하기

      k8s 리소스를 생성하고 나면 정상 동작하지 않는 경우들이 있다. 이 때 디버그하는 명령어를 사용하게 되는데, kubectl describe, kubectl log, stern을 사용하게 되었다.

      서비스 라우팅 흐름을 확인하기 위해서는 ingress 정보를 봐야 한다.

      1. 서비스 정보 흐름 확인 ingress

      인그레스 라우딩이 어떤 호스트로 향하는지 확인이 가능하다.

      
      $ kubectl get ingress p-ingress-aop -n aop
      NAME            CLASS   HOSTS                                                                     ADDRESS     PORTS   AGE
      p-ingress-aop   nginx   studio.ifland.io,studiocdn.ifland.io,oavataradmin.treal.xyz + 1 more...   10.27.0.5   80      19dd

      2. 이벤트 확인 'kubectl describe'

      ㅇ pod가 동작하지 않을 때, 발생 이벤트에 대한 내용도 알려 줘서 제일 먼저 보게 되었다.

      아래에서는 'kubectl describe pod' 명령어로 pod의 yaml 구성정보, 볼륨 권한(여기서는 rw), Event, 상태, 기동시간, 재기동 횟수 등을 알 수 있다.

      $ kubectl describe pod unitybuild-base -n unitybuild-base
      
      Name:             unitybuild-base
      Namespace:        unitybuild-base
      Priority:         0
      Service Account:  default
      Node:             aks-agentpool2-12810365-vmss000001/10.26.1.39
      Start Time:       Tue, 29 Aug 2023 10:06:42 +0900
      Labels:           <none>
      Annotations:      <none>
      Status:           Running
      IP:               10.26.1.118
      IPs:
        IP:  10.26.1.118
      Containers:
        unitybuild-base:
          Container ID:  containerd://569116547b0f6bbd2c19bb99ec2d5b78416eed2e3d22864aa2d031ce7cd57db9
          Image:         ubuntu:22.04
          Image ID:      docker.io/library/ubuntu@sha256:ec050c32e4a6085b423d36ecd025c0d3ff00c38ab93a3d71a460ff1c44fa6d77
          Port:          <none>
          Host Port:     <none>
          Command:
            sh
            -c
            apt-get update
            apt-get install -y ca-certificates curl gnupg lsb-release
            curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
            echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
            apt-get update
            apt-get install -y docker-ce docker-ce-cli containerd.io
            sleep 3600
      
          State:          Running
            Started:      Wed, 30 Aug 2023 06:08:33 +0900
          Last State:     Terminated
            Reason:       Completed
            Exit Code:    0
            Started:      Tue, 29 Aug 2023 20:07:31 +0900
            Finished:     Wed, 30 Aug 2023 06:08:31 +0900
          Ready:          True
          Restart Count:  2
          Environment:    <none>
          Mounts:
            /scripts from script-volume (rw)
            /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-nzfc9 (ro)
      Conditions:
        Type              Status
        Initialized       True
        Ready             True
        ContainersReady   True
        PodScheduled      True
      Volumes:
        script-volume:
          Type:          HostPath (bare host directory volume)
          Path:          /scripts
          HostPathType:
        kube-api-access-nzfc9:
          Type:                    Projected (a volume that contains injected data from multiple sources)
          TokenExpirationSeconds:  3607
          ConfigMapName:           kube-root-ca.crt
          ConfigMapOptional:       <nil>
          DownwardAPI:             true
      QoS Class:                   BestEffort
      Node-Selectors:              kubernetes.io/hostname=aks-agentpool2-12810365-vmss000001
      Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                   node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
      Events:                      <none>

      kubectl describe를 잘 활용하면 Kubernetes 리소스 구성과 상태를 자세히 파악할 수 있다.

      - Pod: Pod의 상태, 이벤트 로그, 컨테이너 로그 등 POD의 자세한 정보 확인

      - Node: 노드의 자원 할당 상태, 조건 등 노드 정보 확인

      - Deployment: 디플로이먼트 상태, 업데이트 기록, 이벤트 로그 등 배포 관련 정보 확인

      - Service: 서비스의 선택자, 엔드포인트, 세션 어피니티 등 서비스 구성 정보 확인

      - Ingress: 인그레스 규칙, 백엔드, 이벤트 로그 등 인그레스 정보 확인

      - ConfigMap: 컨피그맵의 데이터, 볼륨 마운트 정보 등 확인

      - Secret: 시크릿 데이터, 타입, 볼륨 마운트 정보 등 확인

      - PersistentVolume: PV의 용량, 접근 모드, 상태 등 범용 볼륨 정보 확인

      - Namespace: 네임스페이스의 리소스 할당 및 제한 범위 관련 정보 확인

      3. 실시간 컨테이너 로그 확인 'stern'

      모든 pod의 컨테이너 로그를 실시간으로 보여 준다.

      # 1. 설치
      $ brew install stern
        
      # 2. 사용
      $ stern <파드명> -n <네임스페이스명>

      아래와 같이 실시간으로 pod가 구성되고, 동작하는 상태를 로그로 모니터링 할 수 있다.

      image.png

      운영하기

      운영 초기 단계라서 아직 많은 명령이 활용되고 있지는 않다. k9s 많이 활용하고, argocd에서도 운영에 필요한 정보를 쉽게 찾아볼 수 있어 유용하게 사용하고 있다.

      1. aks 버전 업그레이드

      UI로 일반적으로 수행하지만 동작하지 않을 경우가 있다. az cli로 아래와 같이 간단히 수행할 수 있다.

      az account set --subscription <구독명>
      az aks upgrade   --name <클러스터명>    --resource-group <리소스그룹명>    --kubernetes-version <버전명>

      2. 운영 pod의 QoS 확인

      배포한 pod가 의도한 QoS(일반적으로 Gauranteed로 배포) 인지 확인

      $ kubectl describe pods <파드명> | grep "QoS Class"

      3. 로컬로 파일 복사

      시스템에 있는 데이터 분석이 필요하여 NAS 저장된 파일을 로컬로 복사해야 했다.

      pod로 NAS를 마운트해서 NAS에 있는 파일을 kubectl cp 명령어로 로컬로 복사할 수 있다.

      $ kubectl cp <파드명>:/mnt/특정파일 .

      정리

      AKS로 쿠버네티스 시작하기에서 실제 시스템 구축을 진행하면서 사용한 명령어를 알아 보았다.

      쿠버네티스 기반이라 다양한 클라우드 환경에서도 사용이 가능할 것이다.

      AKS 환경에서 쿠버네티스를 구축하기 이전의 엔지니어라면 사전에 학습용으로 또는 실무 작업에 직접적인 도움이 될 만한 내용들도 될 것이다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      broccoli 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기