0. 준비사항
도메인 구입
[aws] Amazon Route 53을 사용해 도메인 이름을 등록하는 방법
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
- ServiceAccount:
- name: external-dns
- namespace: kube-system
- labels: app.kubernetes.io/name: external-dns
- ClusterRole:
- name: external-dns
- labels: app.kubernetes.io/name: external-dns
- rules: 다음과 같은 Kubernetes 리소스 및 API 그룹에 대한 액세스 권한을 정의합니다.
- 서비스, 엔드포인트, 파드, 노드에 대한 get, watch, list 권한
- 인그레스에 대한 get, watch, list 권한
- ClusterRoleBinding:
- name: external-dns-viewer
- labels: app.kubernetes.io/name: external-dns
- roleRef: external-dns ClusterRole에 대한 참조를 제공합니다.
- subjects: external-dns ServiceAccount에 대한 정보를 제공하여 해당 권한을 부여합니다.
- 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