# 40. K8S-쿠버네티스 CLI-2026 2. 쿠버네티스 CLI 실습 1 # EC2 1대 생성 CloudFormation으로 EC2생성 40 ec2-t3-small-no-cli-2026 또는 콘솔로 EC2 생성 2 # EC2에 aws configure로 access-key, secret-key 적용 3 # EC2 로그인 sudo su - aws s3 ls # aws cli 신규버전 설치 # 1. 기존 AWS CLI 제거 (안전을 위해) sudo yum remove awscli -y # 2. AWS CLI v2 설치 curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install --update hash -r sudo ln -s /usr/local/aws-cli/v2/current/bin/aws /usr/local/bin/aws sudo ln -s /usr/local/aws-cli/v2/current/bin/aws_completer /usr/local/bin/aws_completer # 3. 설치 확인 (2.x 버전인지 확인) aws --version # kubectl 설치 sudo curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl alias k='kubectl' complete -F __start_kubectl k # k에서도 자동완성 지원 4 # 3. Amazon Linux # 기본 도구 설치 (git, bash-completion 등) # dnf 대신 yum을 사용합니다. sudo yum install -y git bash-completion fzf # 참고 -신세대 os 버전 sudo dnf install -y git bash-completion fzf # kubectl 설치 (이미 설치되어 있다면 스킵) sudo curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl # kubectx 설치 sudo curl -L https://github.com/ahmetb/kubectx/releases/latest/download/kubectx -o /usr/local/bin/kubectx # kubens 설치 sudo curl -L https://github.com/ahmetb/kubectx/releases/latest/download/kubens -o /usr/local/bin/kubens sudo chmod +x /usr/local/bin/kubect[x,s] 5 # 재로그인시 적용 돠도록 하기 sudo su - vi ~/.bashrc # 맨아래줄 추가 # 1. 자동 완성 활성화 source /usr/share/bash-completion/bash_completion source <(kubectl completion bash) # 2. k Alias 및 자동 완성 연동 alias k='kubectl' complete -F __start_kubectl k # 3. 생산성 Alias alias kgp='k get pods' alias kgs='k get svc' alias kgn='k get nodes' alias kd='k describe' alias ke='k edit' alias kl='k logs -f' alias kctx='kubectx' alias kns='kubens' alias wa='watch -d kubectl get deploy,rs,pods,svc' # 4. fzf와 kubectx 연동 (리스트에서 화살표로 선택 가능) export FZF_DEFAULT_OPTS="--height 40% --layout=reverse --border" source ~/.bashrc 5 # 최신 릴리즈 바이너리 다운로드 및 설치 curl -sL https://github.com/derailed/k9s/releases/latest/download/k9s_Linux_amd64.tar.gz | tar xfz - sudo mv k9s /usr/local/bin/ 6 git clone https://github.com/jonmosco/kube-ps1.git ~/.kube-ps1 # .bashrc에 추가 echo "source ~/.kube-ps1/kube-ps1.sh" >> ~/.bashrc echo "PS1='[\u@\h \W]\$(kube_ps1) \$ '" >> ~/.bashrc 7 # EKS 클러스터 설정을 로컬 kubectl에 저장 # aws eks update-kubeconfig --region <리전코드> --name <클러스터명> 1) 클러스터를 생성했던 IAM 사용자는 할 필요없다. eks권한이 자동 부여된다. k get no 잘됨 2) # ec2에 access-key로 사용하고 새 EC2에서 권한 얻기 aws eks update-kubeconfig --region ap-northeast-2 --name free-vpc-cluster k get no 3) # ec2에 seo-admin-role 적용하고 새 EC2에서 권한 얻기 kubectl 에러가 발생하는 이유는 명확합니다. EKS 클러스터(free-vpc-cluster)를 생성할 때 사용한 주체가 지금 사용 중인 seo-admin 역할이 아니기 때문입니다. EKS는 보안상 클러스터 생성자 외에는 아무리 관리자(Admin) 권한이 있는 IAM이라도 클러스터 내부 접근을 허용하지 않습니다. 이 문제를 해결하려면 **클러스터를 생성했던 IAM 사용자(또는 역할)**로 로그인하여 seo-admin 역할에게 권한을 부여해야 합니다. # ec2에 admin role을 준경우는 role에 권한을 부여해야 한다. aws eks create-access-entry \ --cluster-name free-vpc-cluster \ --principal-arn arn:aws:iam::697016550159:role/seo-admin \ --type STANDARD aws eks associate-access-policy \ --cluster-name free-vpc-cluster \ --principal-arn arn:aws:iam::697016550159:role/seo-admin \ --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy \ --access-scope type=cluster k get no --------------- 6. kOps를 이용해 클러스터를 생성 # 기존 클러스터 삭제 1 클러스터 이름 확인 aws eks list-clusters --region ap-northeast-2 --query "clusters" --output text or # 첫 번째 클러스터 이름을 가져와서 CLUSTER_NAME 변수에 할당 export CLUSTER_NAME=$(aws eks list-clusters --region ap-northeast-2 --query "clusters[0]" --output text) # 확인 echo $CLUSTER_NAME 2 #!/bin/bash CLUSTER_NAME="free-vpc-cluster" REGION="ap-northeast-2" echo "1. 노드 그룹 목록을 확인합니다..." NODEGROUPS=$(aws eks list-nodegroups --cluster-name $CLUSTER_NAME --region $REGION --query "nodegroups" --output text) if [ -z "$NODEGROUPS" ] || [ "$NODEGROUPS" == "None" ]; then echo "삭제할 노드 그룹이 없습니다." else for ng in $NODEGROUPS; do echo "노드 그룹 [$ng] 삭제를 시작합니다..." aws eks delete-nodegroup --cluster-name $CLUSTER_NAME --nodegroup-name $ng --region $REGION echo "노드 그룹 [$ng]이 삭제될 때까지 대기합니다 (이 작업은 5~10분 정도 소요됩니다)..." aws eks wait nodegroup-deleted --cluster-name $CLUSTER_NAME --nodegroup-name $ng --region $REGION echo "노드 그룹 [$ng] 삭제 완료!" done fi echo "2. 클러스터 [$CLUSTER_NAME] 삭제를 시작합니다..." aws eks delete-cluster --name $CLUSTER_NAME --region $REGION echo "3. 클러스터가 완전히 삭제될 때까지 대기합니다..." aws eks wait cluster-deleted --name $CLUSTER_NAME --region $REGION echo "=========================================================" echo "클러스터와 노드 그룹이 모두 성공적으로 삭제되었습니다!" echo "=========================================================" -------- 1 # 1. 환경 변수 설정 export NAME=mycluster.k8s.local export KOPS_STATE_STORE=s3://kops-state-seoul-$(date +%s) export ZONES=ap-northeast-2a,ap-northeast-2c # 2. S3 버킷 생성 aws s3 mb $KOPS_STATE_STORE --region ap-northeast-2 # 3. 클러스터 생성 (수정된 명령어) # --region 플래그를 빼고, master 대신 control-plane 용어 사용 kops create cluster \ --name=${NAME} \ --control-plane-count 1 \ --node-count 2 \ --node-size t3.small \ --control-plane-size t3.small \ --zones=${ZONES} \ --yes 4 # 클러스터 실제 생성 시작 및 관리자 설정 kops update cluster --name ${NAME} --yes --admin # 클러스터가 완전히 준비될 때까지 대기 (약 5~10분) kops validate cluster --wait 10m 5 wa 6 Changes may require instances to restart: kops rolling-update cluster (mycluster:N/A) [root@kops-ec2 ~]# (mycluster:N/A) [root@kops-ec2 ~]# kops rolling-update cluster Using cluster from kubectl context: mycluster.k8s.local 7 k create deployment my-web --image=nginx && k expose deployment my-web --port=80 --type=LoadBalancer (2분후) 8 꿀팁: t3.small 사용 시 주의사항 리소스 부족: t3.small은 메모리가 2GiB뿐입니다. 쿠버네티스 기본 시스템 컴포넌트들이 약 0.5~1GiB를 사용하므로, 실제 배포할 앱은 가벼운 것으로 테스트하시는 것이 좋습니다. 삭제 (비용 절감): 테스트가 끝나면 잊지 말고 꼭 삭제하세요! kops delete cluster --name ${NAME} --yes -------------- 7. yaml로 쿠버네티스 오브젝트 관리 1 cat < web-server.yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-web spec: replicas: 2 selector: matchLabels: app: nginx-web template: metadata: labels: app: nginx-web spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: my-web-svc spec: type: LoadBalancer ports: - port: 80 targetPort: 80 selector: app: nginx-web EOT kubectl apply -f web-server.yaml 2 kubectl get -f web-server.yaml 3 # 실행 중인 my-web 디플로이먼트 설정을 yaml로 보기 kubectl get deployment my-web -o yaml > my-web-backup.yaml 4 (2분후) 서비스로 접속 해보기 5 # 삭제 kubectl delete -f web-server.yaml