< 과정 >
1 . AWS Route53을 이용하여 도메인을 등록하고 호스팅영역을 설정한다
2 . EKS에서 External DNS을 이용하여 Route 53을 통해 등록한 도메인과 연결한다.
Public한 도메인서버를 사용하여 쿠버네티스의 리소스를 쿼리할 수 있게 해주는 오픈소스 솔루션입니다. 도메인서버에 종속되지 않고 쿠버네티스 리소스를 통해 DNS레코드를 동적으로 관리할 수 있는 장점이 있다.
📒 External DNS 배포 참조 1 - AWS공식문서
📒 External DNS 배포 참조 2
1 . Route53 도메인 등록
호스팅영역은 특정 도메인과 하위 도메인의 트래픽을 라우팅하는 방식에 대한 정보를 나타낸다. 쉽게 말해, DNS서버에 도메인이 입력되었을 때 DNS쿼리로 해당 도메인에 대한 결과를 얻게 되는데 , 이 결과에 대한 종류라고 생각하면 된다.
2 . IAM 정책 생성
eksctl utils associate-iam-oidc-provider --cluster {cluster name} --approve
kubectl create namespace external-dns # 논리적인 분리를 위해 external-dns를 위한 네임스페이스 생성
vi AllowExternalDNSUpdates.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"route53:ChangeResourceRecordSets"
],
"Resource": [
"arn:aws:route53:::hostedzone/*"
]
},
{
"Effect": "Allow",
"Action": [
"route53:ListHostedZones",
"route53:ListResourceRecordSets"
],
"Resource": [
"*"
]
}
]
}
aws iam create-policy --policy-name AllowExternalDNSUpdates --policy-document file://AllowExternalDNSUpdates.json
3 . IAM 롤 생성
eksctl create iamserviceaccount --name external-dns --namespace external-dns --cluster finalproject --attach-policy-arn arn:aws:iam::<Account ID>:policy/<IAM정책이름> --approve --role-name route53_external_dns
4 . EKS에 External-DNS 파드 배포
kubectl api-versions | grep rbac.authorization.k8s.io # RBAC 활성여부 확인
vi external-dns.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: external-dns
namespace: external-dns
# If you're using Amazon EKS with IAM Roles for Service Accounts, specify the following annotation.
# Otherwise, you may safely omit it.
annotations:
# Substitute your account ID and IAM service role name below.
eks.amazonaws.com/role-arn: arn:aws:iam::<Account ID>:role/<생성한 Role>
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: external-dns
namespace: external-dns
rules:
- apiGroups: [""]
resources: ["services","endpoints","pods"]
verbs: ["get","watch","list"]
- apiGroups: ["extensions","networking.k8s.io"]
resources: ["ingresses"]
verbs: ["get","watch","list"]
- apiGroups: [""]
resources: ["nodes"]
verbs: ["list","watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: external-dns-viewer
namespace: external-dns
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: external-dns
subjects:
- kind: ServiceAccount
name: external-dns
namespace: external-dns
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: external-dns
namespace: external-dns
spec:
strategy:
type: Recreate
selector:
matchLabels:
app: external-dns
template:
metadata:
labels:
app: external-dns
spec:
serviceAccountName: external-dns
containers:
- name: external-dns
image: k8s.gcr.io/external-dns/external-dns:v0.10.2 # external-dns를 가능하게 하는 파드를 생성하는 이미지, 버전이 지속적으로 바뀌기때문에 고려해서 지정
args:
- --source=service
- --source=ingress
- --domain-filter= # 등록한 도메인 입력
- --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레코드도 추가
- --txt-owner-id= # Route53 호스팅영역 ID입력
securityContext:
fsGroup: 65534 # For ExternalDNS to be able to read Kubernetes and AWS token files
kubectl create -f external-dns.yaml # yaml파일 api-server에 전송
5 . Ingress수정 및 결과 테스트
한마디로, External-DNS를 가능하게 하는 파드를 띄웠고 이를 통해 프론트엔드 파드를 외부에 노출시키는 Ingress(=ALB)를 도메인에 연결한다. 따라서 아래와 같이 수정한다.
vi front-ing.yaml
. . .
spec:
rules:
- host: "k8s-finalproject.com" # 도메인 추가
http:
. . .
1 . TLS인증서 발급받기
2 . Frontend - Ingress 수정
vi front-ing.yaml
. . .
annotations:
. . .
alb.ingress.kubernetes.io/certificate-arn: # 위에서 식별한 인증서의 arn값 입력
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
alb.ingress.kubernetes.io/tls-redirect: '443'
. . .