23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
새로운 IT시스템을 시작하게 되면 처음 만나는 것 중에 해당 시스템을 생성하거나 동작시키는 명령어가 있다.
실제 구축과정에서 사용한 명령어를 정리해 보기로 하였다. AKS로 구축 진행했던 과정에서 인상에 남는 내용들로 정리를 하였다.
AKS는 물론 쿠버네티스 기반이므로 쿠버네티스 명령어가 주로 사용되었다. azure portal UI 나 azure cli도 사용이 되었다.
구축과정의 명령어를 위주로 정리하였고, 운영과정에서의 사용성이 높은 명령어도 추가할 것이다.
azure portal UI로 진행가능하지만, 아래의 azure cli 로 클러스터를 생성할 수 있다.
# 1. 구독 설정
$ az account set --subscription <구독명>
# 2. 클러스터 생성
$ az aks create \
--resource-group <리소스그룹명> \
--name <클러스터명> \
--node-count 3 \
--generate-ssh-keys실행 결과]
아래의 명령어로 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 쿠버네티스를 로컬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자동완성과 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 shellaks를 구성하면 노드를 중심으로 정보를 확인하게 된다. 여기서 노는 control plane을 제외한 워커노드를 의미한다.
# 노드 정보 보기
$ kubectl get nodes
# 노드 정보 상세 보기
$ kubectl describe node <노드이름>
# 클러스터 정보 보기
$ kubectl cluster-info
# 클러스터 정보 상세 보기
$ kubectl cluster-info dump
노드의 상세 정보는 descirbe 명령으로 확인한다.
$ kubectl describe node <노드이름>ㅇ 아래의 예시를 참조해 볼 수 있다. 찾아 보게 되는 정보는 용량, 수용 가능 pod 개수, 서브넷 정도였다.
k9s를 사용하면 클러스터의 기본 정보 부터 pod의 내용까지 편리하게 정보를 확인해 낼 수 있다.
위 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"mgmt/dev/stg/prd별로 클러스터를 생성해서 구축을 하다보니 컨텍스트를 변경해야 할 일이 많아졌다.
아래의 명령어로 수행이 가능하지만 확인과 변경에 번거로움이 있어 kubectx를 자주 사용하게 되었다.
- 컨텍스트의 정의 : context는 kubeconfig 파일에서 클러스터, 사용자, 네임스페이스에 대한 정보를 그룹화한 설정 단위
$ kubectl config get-contexts
$ kubectl config use-context <클러스터명>
$ kubectx kubectx 는 brew install kubectx 로 간편하게 설치하여 사용 가능하다.
- 노란색이 현재 상태에서 지정된 기본 컨텍스트
처음 리소스 생성 후 확인하는 과정에서 당황하는 경우가 있다. 조회시 네임스페이스를 꼭 기입해야 확인이 된다. 하지만, 여러 번 빼먹고 당황하고 했다.
$ 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 76dyaml파일을 준비하고 kubectl apply 명령과 kubectl delete 명령으로 간단히 가능하다.
$ kubectl apply -f <yaml 파일명>
$ kubectl delete -f <yaml 파일명>초기라서 단순한 yaml 설정 오류로 삭제하는 경우가 빈번하게 일어났다. 많은 시간을 대기하는 경우가 많았으나 시간 낭비만 발생했다. 이미 오류를 눈치채고 빠르게 바꾸는 것이 현명하므로 강제로 삭제하는 것이 효율적이다.
$ kubectl delete pod <파드명> --grace-period=0 --force -n <네임스페이스명>신속하게 삭제가 되어 업무 효율에 도움이 많이 되었다.
리소스의 yaml을 변경하고 재적용할 경우 반영이 안되는 경우들을 만났다.
깔끔하게 삭제후에 생성하는 편이 더 좋은 경우가 많으니 삭제하고 진행하는 것을 권한다.
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도메인 기반으로 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.yamlargocd와 같은 툴을 도메인 접속을 통해 SSL 방식으로 구성하려는 경우에는 secret 리소스를 생성하여 수행한다.
확보한 인증서로 아래의 명령어로 secret을 생성하면 되고, 사용자 접속은 https를 지원하게 된다.
$ kubectl create secret tls <tls명칭> \
--cert {__dir__}/<인증서 파일 경로> \
--key {__dir__}/<개인키 파일 경로> -n <네임스페이스명>프라이빗 이미지 저장소인 acr을 aks와 연결할 필요가 있다. az cli로 간단히 attach할 수 있어 편리하게 사용하였다.
$ az account set --subscription <구독명>
$ az aks update -n <클러스터명> -g <리소스그룹명> --attach-acr <acr명>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 정보를 봐야 한다.
인그레스 라우딩이 어떤 호스트로 향하는지 확인이 가능하다.
$ 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ㅇ 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: 네임스페이스의 리소스 할당 및 제한 범위 관련 정보 확인
모든 pod의 컨테이너 로그를 실시간으로 보여 준다.
# 1. 설치
$ brew install stern
# 2. 사용
$ stern <파드명> -n <네임스페이스명>아래와 같이 실시간으로 pod가 구성되고, 동작하는 상태를 로그로 모니터링 할 수 있다.
운영 초기 단계라서 아직 많은 명령이 활용되고 있지는 않다. k9s 많이 활용하고, argocd에서도 운영에 필요한 정보를 쉽게 찾아볼 수 있어 유용하게 사용하고 있다.
UI로 일반적으로 수행하지만 동작하지 않을 경우가 있다. az cli로 아래와 같이 간단히 수행할 수 있다.
az account set --subscription <구독명>
az aks upgrade --name <클러스터명> --resource-group <리소스그룹명> --kubernetes-version <버전명>배포한 pod가 의도한 QoS(일반적으로 Gauranteed로 배포) 인지 확인
$ kubectl describe pods <파드명> | grep "QoS Class"시스템에 있는 데이터 분석이 필요하여 NAS 저장된 파일을 로컬로 복사해야 했다.
pod로 NAS를 마운트해서 NAS에 있는 파일을 kubectl cp 명령어로 로컬로 복사할 수 있다.
$ kubectl cp <파드명>:/mnt/특정파일 .AKS로 쿠버네티스 시작하기에서 실제 시스템 구축을 진행하면서 사용한 명령어를 알아 보았다.
쿠버네티스 기반이라 다양한 클라우드 환경에서도 사용이 가능할 것이다.
AKS 환경에서 쿠버네티스를 구축하기 이전의 엔지니어라면 사전에 학습용으로 또는 실무 작업에 직접적인 도움이 될 만한 내용들도 될 것이다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.