영기
article thumbnail

0. 준비사항

도메인 구입

[aws] Amazon Route 53을 사용해 도메인 이름을 등록하는 방법

이메일 Verify 전문

1.  ACM 발급

아래 블로그 참고

[tistory] AWS의 Certificate Manager 로 SSL 인증서 발급 받기

 

 

2. ExternalDNS 설치

# ExternalDNS
MyDomain=myeks.net
echo "export MyDomain=myeks.net" >> /etc/profile

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


curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/aews/externaldns.yaml
MyDomain=$MyDomain MyDnzHostedZoneId=$MyDnzHostedZoneId envsubst < externaldns.yaml | kubectl apply -f -

 

* gasida/PKOS/main/aews/externaldns.yaml 분석

apiVersion: v1
kind: ServiceAccount
metadata:
  name: external-dns
  namespace: kube-system
  labels:
    app.kubernetes.io/name: external-dns
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: external-dns
  labels:
    app.kubernetes.io/name: external-dns
rules:
  - apiGroups: [""]
    resources: ["services","endpoints","pods","nodes"]
    verbs: ["get","watch","list"]
  - apiGroups: ["extensions","networking.k8s.io"]
    resources: ["ingresses"]
    verbs: ["get","watch","list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: external-dns-viewer
  labels:
    app.kubernetes.io/name: external-dns
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: external-dns
subjects:
  - kind: ServiceAccount
    name: external-dns
    namespace: kube-system # change to desired namespace: externaldns, kube-addons
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: external-dns
  namespace: kube-system
  labels:
    app.kubernetes.io/name: external-dns
spec:
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app.kubernetes.io/name: external-dns
  template:
    metadata:
      labels:
        app.kubernetes.io/name: external-dns
    spec:
      serviceAccountName: external-dns
      containers:
        - name: external-dns
          image: registry.k8s.io/external-dns/external-dns:v0.14.0
          args:
            - --source=service
            - --source=ingress
            - --domain-filter=${MyDomain} # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones
            - --provider=aws
            #- --policy=upsert-only # would prevent ExternalDNS from deleting any records, omit to enable full synchronization
            - --aws-zone-type=public # only look at public hosted zones (valid values are public, private or no value for both)
            - --registry=txt
            - --txt-owner-id=${MyDnzHostedZoneId}
          env:
            - name: AWS_DEFAULT_REGION
              value: ap-northeast-2 # change to region where EKS is installed
  1. ServiceAccount:
  2. ClusterRole:
    • name: external-dns
    • labels: app.kubernetes.io/name: external-dns
    • rules: 다음과 같은 Kubernetes 리소스 및 API 그룹에 대한 액세스 권한을 정의합니다.
      • 서비스, 엔드포인트, 파드, 노드에 대한 get, watch, list 권한
      • 인그레스에 대한 get, watch, list 권한
  3. ClusterRoleBinding:
    • name: external-dns-viewer
    • labels: app.kubernetes.io/name: external-dns
    • roleRef: external-dns ClusterRole에 대한 참조를 제공합니다.
    • subjects: external-dns ServiceAccount에 대한 정보를 제공하여 해당 권한을 부여합니다.
  4. Deployment:
    • name: external-dns
    • namespace: kube-system
    • labels: app.kubernetes.io/name: external-dns
    • spec: 배포 구성을 정의합니다.
      • serviceAccountName: external-dns ServiceAccount를 지정합니다.
      • containers: ExternalDNS 컨테이너를 정의합니다.
        • image: ExternalDNS 컨테이너의 이미지를 지정합니다.
        • args: ExternalDNS 실행을 위한 명령행 인수를 설정합니다.
          • -source: ExternalDNS에서 동작할 소스를 정의합니다. 여기서는 서비스 및 인그레스를 감지하도록 지정되어 있습니다.
          • -domain-filter: 처리할 호스팅된 존을 제한하기 위해 도메인 필터를 설정합니다.
          • -provider: 외부 DNS 서비스 제공업체를 설정합니다. 여기서는 AWS를 사용합니다.
          • -aws-zone-type: AWS 호스팅된 존의 유형을 설정합니다. 여기서는 공용 호스팅된 존만을 대상으로 설정됩니다.
          • -registry: 레코드를 등록할 레지스트리 유형을 설정합니다. 여기서는 TXT 레코드를 사용합니다.
          • -txt-owner-id: TXT 레코드를 등록하는 데 사용할 Zone ID를 설정합니다.
        • env: ExternalDNS 컨테이너에서 사용할 환경 변수를 설정합니다.
          • AWS_DEFAULT_REGION: AWS 리전을 설정합니다. 

3. kube-ops-view

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

 

4. AWS LB Controller

# AWS LB 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

 

5. EBS CSI driver 설치

# EBS csi driver 설치 확인
eksctl get addon --cluster ${CLUSTER_NAME}
kubectl get pod -n kube-system -l 'app in (ebs-csi-controller,ebs-csi-node)'
kubectl get csinodes

 

6.  gp3 스토리지 클래스 생성

# gp3 스토리지 클래스 생성
kubectl get sc
kubectl apply -f https://raw.githubusercontent.com/gasida/PKOS/main/aews/gp3-sc.yaml
kubectl get sc

 

7. 설치 정보 확인

# 이미지 정보 확인
kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" | tr -s '[[:space:]]' '\n' | sort | uniq -c

# eksctl 설치/업데이트 addon 확인
eksctl get addon --cluster $CLUSTER_NAME

# IRSA 확인
eksctl get iamserviceaccount --cluster $CLUSTER_NAME

# EC2 Instance Profile에 IAM Role 정보 확인
cat myeks.yaml | grep managedNodeGroups -A20 | yh
managedNodeGroups: 
- amiFamily: AmazonLinux2
  desiredCapacity: 3
  disableIMDSv1: true
  disablePodIMDS: false
  iam: 
    withAddonPolicies: 
      albIngress: false
      appMesh: false
      appMeshPreview: false
      autoScaler: false
      awsLoadBalancerController: false  >> IRSA 사용
      certManager: true
      cloudWatch: true
      ebs: true
      efs: false
      externalDNS: true
      fsx: false
      imageBuilder: true
      xRay: true

 

profile

영기

@yeongki0944

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그