본 글은 gasida님의 AEWS 강의 및 AWS Docs, 연관 Blog 등을 참고하여 작성하였습니다.




# aws cli 설치 (MAC)
brew install awscli
aws --version
# iam (주체) 자격 증명 설정
aws configure
# 확인
aws sts get-caller-identity
# kubectl
brew install kubernetes-cli
kubectl version --client=true
# helm 설치
brew install helm
helm version
# 테라폼 설치
## tfenv 설치 후 테라폼 버전 확인
brew install tfenv
tfenv list-remote
## 테라폼 특정 버전 설치 및 사용 설정
tfenv install 1.14.7
tfenv use 1.14.7
## 설치한 버전 확인
tfenv list
## 테라폼 버전 정보 확인
terraform version
## 자동완성
terraform -install-autocomplete
## 자동완성 참고
cat ~/.zshrc
## autoload -U +X bashcompinit && bashcompinit
## complete -o nospace -C /usr/local/bin/terraform terraform
AWS CLI (AWS를 CLI로 사용하게 해주는 도구)

kubectl (kubernetes API를 통해 컨트롤 플레인과 통신하는 도구)

helm (kubernetes를 위한 패키지 관리 도구)

aews 교육을 위한 실습코드 Git 레포를 활용합니다.
# 코드 다운로드
git clone https://github.com/gasida/aews.git
cd aews
tree aews
# 작업 디렉터리 이동
cd 1w

# 변수 지정
aws ec2 describe-key-pairs --query "KeyPairs[].KeyName" --output text
export TF_VAR_KeyName=$(aws ec2 describe-key-pairs --query "KeyPairs[].KeyName" --output text)
export TF_VAR_ssh_access_cidr=$(curl -s ipinfo.io/ip)/32
echo $TF_VAR_KeyName $TF_VAR_ssh_access_cidr
# 배포 : 12분 정도 소요
terraform init
terraform plan
nohup sh -c "terraform apply -auto-approve" > create.log 2>&1 &
tail -f create.log




# EKS 와의 연결을 위한 자격증명 설정
aws eks update-kubeconfig --region ap-northeast-2 --name myeks
# k8s config 확인 및 rename context
cat ~/.kube/config
cat ~/.kube/config | grep current-context | awk '{print $2}'
kubectl config rename-context $(cat ~/.kube/config | grep current-context | awk '{print $2}') myeks
cat ~/.kube/config | grep current-context
# eks 클러스터 정보 확인
kubectl cluster-info
# endpoint 확인
CLUSTER_NAME=myeks
aws eks describe-cluster --name $CLUSTER_NAME


# dig 조회 엔드포인트 IP 소유자 조회
APIDNS=$(aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint | cut -d '/' -f 3)
dig +short $APIDNS
curl -s ipinfo.io/{IP 입력}

# eks 노드 그룹 정보 확인
aws eks describe-nodegroup --cluster-name $CLUSTER_NAME --nodegroup-name $CLUSTER_NAME-node-group | jq

# 노드 정보 확인 : OS와 컨테이너런타임 확인
kubectl get node --label-columns=node.kubernetes.io/instance-type,eks.amazonaws.com/capacityType,topology.kubernetes.io/zone
kubectl get node --label-columns=node.kubernetes.io/instance-type
# 노드의 capacityType 확인
kubectl get node --label-columns=eks.amazonaws.com/capacityType
kubectl get node
kubectl get node -o wide
# 인증 정보 확인
kubectl get node -v=6


# 파드 정보 확인
kubectl get pod -n kube-system
kubectl get pod -n kube-system -o wide
kubectl get pod -A

# kube-system 네임스페이스에 모든 리소스 확인
kubectl get deploy,ds,pod,cm,secret,svc,ep,endpointslice,pdb,sa,role,rolebinding -n kube-system

# 모든 파드의 컨테이너 이미지 정보 확인 : dkr.ecr 저장소 확인!
kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" | tr -s '[[:space:]]' '\n' | sort | uniq -c

# kube-proxy : iptables mode, bind 0.0.0.0, conntrack 등
kubectl describe pod -n kube-system -l k8s-app=kube-proxy
kubectl get cm -n kube-system kube-proxy -o yaml
kubectl get cm -n kube-system kube-proxy-config -o yaml

# coredns
kubectl describe pod -n kube-system -l k8s-app=kube-dns
kubectl get cm -n kube-system coredns -o yaml
kubectl get pdb -n kube-system coredns -o jsonpath='{.spec}' | jq

# aws-node : 2개의 컨테이너 - aws-node(cni plugin), aws-eks-nodeagent(network policy agent)
kubectl describe pod -n kube-system -l k8s-app=aws-node



# 노드 IP 확인 및 공인IP 변수 지정
aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output table
NODE1=13.124.172.105
NODE2=15.164.250.203
# 노드의IP ping 테스트
ping -c 1 $NODE1
ping -c 1 $NODE2

# 노드 보안그룹 확인
aws ec2 describe-security-groups | jq
aws ec2 describe-security-groups --filters "Name=tag:Name,Values=myeks-node-group-sg" | jq
aws ec2 describe-security-groups --filters "Name=tag:Name,Values=myeks-node-group-sg" --query 'SecurityGroups[*].IpPermissions' --output text

# kube-ops-view
helm repo add geek-cookbook https://geek-cookbook.github.io/charts/
helm install kube-ops-view geek-cookbook/kube-ops-view --version 1.2.2 --set service.main.type=NodePort,service.main.ports.http.nodePort=30000 --set env.TZ="Asia/Seoul" --namespace kube-system
# 확인
kubectl get deploy,pod,svc,ep -n kube-system -l app.kubernetes.io/instance=kube-ops-view

# kube-ops-view 접속
open "http://$NODE1:30000/#scale=1.5"
open "http://$NODE1:30000/#scale=1.3"

# 샘플 애플리케이션 배포
cat << EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: mario
labels:
app: mario
spec:
replicas: 1
selector:
matchLabels:
app: mario
template:
metadata:
labels:
app: mario
spec:
containers:
- name: mario
image: pengbai/docker-supermario
---
apiVersion: v1
kind: Service
metadata:
name: mario
spec:
selector:
app: mario
ports:
- port: 80
protocol: TCP
targetPort: 8080
nodePort: 30001
type: NodePort
EOF

# 확인
kubectl get deploy,pod,svc,ep

# 접속
curl http://$NODE1:30001 -I
open http://$NODE1:30001

# 구성한 환경 삭제
terraform destroy
# terraform 을 tf 로도 사용할 수 있게 하는 방법
echo 'alias tf="terraform"' >> ~/.bash_profile
source ~/.bash_profile


참조
- 컨테이너: https://kubernetes.io/ko/docs/concepts/containers/
- 쿠버네티스 : https://kubernetes.io/ko/docs/concepts/overview/
- EKS : https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/what-is-eks.html
- aws-cli : https://aws.amazon.com/ko/cli/
- kubectl : https://kubernetes.io/ko/docs/reference/kubectl/
- helm : https://helm.sh/ko/