이 글은 CloudNet@ 팀 gasida님의 스터디 DOIK 2기 내용 및 실습으로 작성된 글입니다.
기본 세팅
IAM & SSH Key 준비
사전에 IAM과 SSH key(Key pair)는 구성이 완료된 상태이다.
터미널에도 aws configure이 등록된 상태!
* 만약에 기존 aws configure이 등록되어있는 경우 user 디렉터리에 있는 .aws 디렉터리를 삭제후 다시 등록하면 된다.
Stack 배포 및 확인
제공해주신 Stack 을 서울리전을 선택하여 CloudFormation 으로 자동 배포
제공해주신 Stack을 배포하는데 대략 20분 정도가 걸리며, 배포 완료되면 총 9개의 Stack이 확인된다.
# 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
# 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에서 승인 관련 메일을 보낸다.
그러면 내용을 보고, 승인을 하면 된다.
위에 메일을 승인하고 나면 아래와 같이 인증서가 발급된다!
# 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
# 프로메테우스 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 |