CloudNetaStudy/[Study] DOIK

[2주차] 실습 환경 세팅하기

HeeWorld 2023. 10. 25. 23:14

이 글은 CloudNet@ 팀 gasida님의 스터디 DOIK 2기 내용 및 실습으로 작성된 글입니다.

 


 

기본 세팅
IAM & SSH Key 준비

 

사전에 IAM과 SSH key(Key pair)는 구성이 완료된 상태이다.

터미널에도 aws configure이 등록된 상태!

* 만약에 기존 aws configure이 등록되어있는 경우 user 디렉터리에 있는 .aws 디렉터리를 삭제후 다시 등록하면 된다.

 

 

 

.aws 디렉터리 삭제 후 다시 IAM 등록하면 됨

 

Stack 배포 및 확인

 

제공해주신 Stack 을 서울리전을 선택하여 CloudFormation 으로 자동 배포

제공해주신 Stack을 배포하는데 대략 20분 정도가 걸리며, 배포 완료되면 총 9개의 Stack이 확인된다.

 

Stack의 기본 이름은 myeks 이다.

 

# SSH 접속 및 설치 확인

 

# SSH Bastion 접근

ssh -i ~/.ssh/<본인 Key Name>.pem ec2-user@$(aws cloudformation describe-stacks --stack-name myeks --query 'Stacks[*].Outputs[0].OutputValue' --output text)

# 설치 내용 확인

kubectl cluster-info
eksctl get cluster
eksctl get nodegroup --cluster $CLUSTER_NAME

# Node 정보 확인

kubectl get node --label-columns=node.kubernetes.io/instance-type,eks.amazonaws.com/capacityType,topology.kubernetes.io/zone
eksctl get iamidentitymapping --cluster myeks

# krew 플러그인 확인

kubectl krew list
kubectl resource-capacity

# NS 적용

kubectl ns default

# 모든 리소스 확인

kubectl get-all

 

 

What is krew?

kubectl을 보다 편리하게 사용할 수 있도록 해주는 플러그인 관리 도구
apt, brew와 비슷하게 kubectl 플러그인을 검색하고 설치 가능
210개 정도의 kubectl 플러그인이 등록되어있고, Mac OS, Linux, Window 등 플랫폼에서 작동

- Document Page:  https://krew.sigs.k8s.io/docs/

 

# Worker Node 정보 및 SSH 접속 확인

 

# Node 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

# Private IP 변수 지정

N1=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2a -o jsonpath={.items[0].status.addresses[0].address})
N2=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2b -o jsonpath={.items[0].status.addresses[0].address})
N3=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2c -o jsonpath={.items[0].status.addresses[0].address})

echo "export N1=$N1" >> /etc/profile
echo "export N2=$N2" >> /etc/profile
echo "export N3=$N3" >> /etc/profile

echo $N1, $N2, $N3

# 보안그룹 ID와 보안그룹 이름 확인

aws ec2 describe-security-groups --query 'SecurityGroups[*].[GroupId, GroupName]' --output text

# Node 보안그룹 ID 확인

aws ec2 describe-security-groups --filters Name=group-name,Values=*ng1* --query "SecurityGroups[*].[GroupId]" --output text
NGSGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values=*ng1* --query "SecurityGroups[*].[GroupId]" --output text)

echo $NGSGID

 

 

 

# Node IP나 coredns Pod IP로 ping 테스트

ping -c 2 $N1
ping -c 2 $N2
ping -c 2 $N3

# Worker Node 접속 테스트

for node in $N1 $N2 $N3; do ssh ec2-user@$node hostname; done

 

 

# 기본 설정 작업 (AWS LB Ctrl, External DNS, Kube-ops-viwe, Storage Class, AWS Cert Manager 인증서 확인)

 

# AWS Load Balancer Controller 설치

helm repo add eks https://aws.github.io/eks-charts
helm repo update
helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=$CLUSTER_NAME \
--set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller
  
# Check
  
kubectl get crd
kubectl get deployment -n kube-system aws-load-balancer-controller
kubectl describe deploy -n kube-system aws-load-balancer-controller

 

이미 repo에 있다고 나오는데 제대로 안읽고 한 번 더 치기... 나오는 문구는 꼼꼼히 읽도록 합시다...!

 

# External DNS 설치

MyDomain=<자신의 도메인>

echo "export MyDomain=<자기 도메인>" >> /etc/profile

MyDnsHostedZoneId=$(aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones[0].Id" --output text)
echo $MyDomain, $MyDnsHostedZoneId

# ExternalDNS 컨트롤러 설치
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/externaldns.yaml
MyDomain=$MyDomain MyDnsHostedZoneId=$MyDnsHostedZoneId envsubst < externaldns.yaml | kubectl apply -f -

 

호스팅케이알을 통해서 도메인을 구매했다!

 

# kube-ops-viwe 설치

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 env.TZ="Asia/Seoul" --namespace kube-system

kubectl patch svc -n kube-system kube-ops-view -p '{"spec":{"type":"LoadBalancer"}}'
kubectl annotate service kube-ops-view -n kube-system "external-dns.alpha.kubernetes.io/hostname=kubeopsview.$MyDomain"
echo -e "Kube Ops View URL = http://kubeopsview.$MyDomain:8080/#scale=1.5"

# 확인 및 로그

kubectl get pod -l app.kubernetes.io/name=external-dns -n kube-system
kubectl logs deploy/external-dns -n kube-system -f

 

 

# EBS Storage Class 생성

# gp2 기본 스토리지 클래스 default 설정 제거

kubectl patch sc gp2 -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

# gp3 스토리지 클래스 생성

kubectl apply -f https://raw.githubusercontent.com/gasida/DOIK/main/1/gp3-sc.yaml

# 스토리지 클래스 확인

kubectl get sc

 

 

# EFS Storage Class 생성

# efs 스토리지 클래스 yaml 파일 생성

cat <<EOT > efs-sc.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata: 
  name: efs-sc
provisioner: efs.csi.aws.com
parameters: 
  provisioningMode: efs-ap
  fileSystemId: $EFS_ID
  directoryPerms: "700"
EOT

cat efs-sc.yaml | yh

# gp3 스토리지 클래스 생성

kubectl apply -f efs-sc.yaml

# 스토리지 클래스 확인

kubectl get sc

 

 

# AWS Certificate Mangaer 등록

 

1. 도메인 구매

 

내가 원하는 도메인을 구매하려고 여러 사이트를 돌아다니다가 호스팅케이알 이라는 곳에서 도메인을 1년치 구입했다!

새로 구축한 NAS 서버에도 연결하고, 내 개인 서버에도 연결할 목적으로 구입하였기 때문에 아깝지 않다. (ATV 포함 10,780원 결제)

 

뿌듯하다 ㅎㅎ

 

2. Route53 등록

 

1) 호스팅 영역에 내 도메인 등록

 

2)  호스팅 케이알에 네임서버 변경하기

 

AWS의 NS 유형의 값/트래픽 라우팅 대상 Copy하여 호스팅 케이알에 등록

 

 

3) 레코드 생성

 

Route53 > 호스팅 영역 > heeworld.kr > 레코드 생성

 

- 값에는 인스턴스의 Public IP를 기재

 

3. AWS 인증서 생성

 

AWS Certificate Manager > 인증서 > 인증서 요청

 

퍼블릭 인증서 요청으로 선택 후 다음
나는 이메일 검증으로 선택했다.

 

호스팅 케이알에서 도메인 발급 시에 기재한 이메일로 승인 AWS에서 승인 관련 메일을 보낸다.

그러면 내용을 보고, 승인을 하면 된다.

 

Amazon Certificate Approvals 클릭!

 

I Approve 클릭!

 

위에 메일을 승인하고 나면 아래와 같이 인증서가 발급된다!

 

 

# AWS Cert Manager 인증서 확인

# ACM 인증서 확인
aws acm list-certificates

# ACM 인증서 변수 선언
CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`; echo $CERT_ARN

 

 

# 프로메테우스 스택 설치

 

# 네임스페이스 생성
kubectl create ns monitoring

# 사용 리전의 인증서 ARN 확인
CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`
echo $CERT_ARN

# repo 추가
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

# 파라미터 파일 생성
cat <<EOT > monitor-values.yaml
prometheus:
  prometheusSpec:
    podMonitorSelectorNilUsesHelmValues: false
    serviceMonitorSelectorNilUsesHelmValues: false
    retention: 5d
    retentionSize: "10GiB"
    scrapeInterval: '15s'
    evaluationInterval: '15s'

  ingress:
    enabled: true
    ingressClassName: alb
    hosts: 
      - prometheus.$MyDomain
    paths: 
      - /*
    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
      alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
      alb.ingress.kubernetes.io/success-codes: 200-399
      alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb
      alb.ingress.kubernetes.io/group.name: study
      alb.ingress.kubernetes.io/ssl-redirect: '443'

grafana:
  defaultDashboardsTimezone: Asia/Seoul
  adminPassword: prom-operator

  ingress:
    enabled: true
    ingressClassName: alb
    hosts: 
      - grafana.$MyDomain
    paths: 
      - /*
    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
      alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
      alb.ingress.kubernetes.io/success-codes: 200-399
      alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb
      alb.ingress.kubernetes.io/group.name: study
      alb.ingress.kubernetes.io/ssl-redirect: '443'

defaultRules:
  create: false
kubeEtcd:
  enabled: false
alertmanager:
  enabled: false
EOT


# 배포
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 51.7.0 \
-f monitor-values.yaml --namespace monitoring

# 확인
## operator : 시스템 경고 메시지 정책(prometheus rule), 애플리케이션 모니터링 대상 추가 등의 작업을 편리하게 할수 있게 CRD 지원
## prometheus-0 : 모니터링 대상이 되는 파드는 ‘exporter’라는 별도의 사이드카 형식의 파드에서 모니터링 메트릭을 노출, pull 방식으로 가져와 내부의 시계열 데이터베이스에 저장
## node-exporter : 노드익스포터는 물리 노드에 대한 자원 사용량(네트워크, 스토리지 등 전체) 정보를 메트릭 형태로 변경하여 노출
## kube-state-metrics : 쿠버네티스의 클러스터의 상태(kube-state)를 메트릭으로 변환하는 파드
## grafana : 프로메테우스는 메트릭 정보를 저장하는 용도로 사용하며, 그라파나로 시각화 처리
helm list -n monitoring
kubectl get pod,svc,ingress -n monitoring
kubectl get-all -n monitoring
kubectl get prometheus,servicemonitors -n monitoring
kubectl get crd | grep monitoring

 

echo $CERT_ARN 시, 내 인증서 확인 가능

 

# 프로메테우스 ingress 확인

kubectl get ingress -n monitoring kube-prometheus-stack-prometheus
kubectl describe ingress -n monitoring kube-prometheus-stack-prometheus

# 프로메테우스 ingress 도메인으로 웹 접속

echo -e "Prometheus Web URL = https://prometheus.$MyDomain"

# 그라파나 ingress 확인

kubectl get ingress -n monitoring kube-prometheus-stack-grafana
kubectl describe ingress -n monitoring kube-prometheus-stack-grafana

# 그라파나 ingress 도메인으로 웹 접속 : 기본 계정 - admin / prom-operator

echo -e "Grafana Web URL = https://grafana.$MyDomain"

 

 

'CloudNetaStudy > [Study] DOIK' 카테고리의 다른 글

[5주차] Kafka & Strimzi Operator  (0) 2023.11.17
[4주차] Percona Operator for MongoDB  (1) 2023.11.06
[3주차] Cloud Native PostgreSQL  (0) 2023.11.01
[2주차] K8S Operator & Inno DB  (0) 2023.10.26
[1주차] Kubernetes 기초  (0) 2023.10.17