티스토리 뷰
안녕하세요. CloudNet@ K8S Study를 진행하며 해당 내용을 이해하고 공유하기 위해 작성한 글입니다. DevOps 이정훈님의 도서 ‘24단계 실습으로 정복하는 쿠버네티스’ 의 내용을 바탕으로 스터디를 하며 어떻게 k8s에 적용할지 고민하며 정리해봤습니다.
[Kube DNS]
- k8s는 Kube DNS를 내부 DNS 서버로 활용합니다.
각 노드에서 실행되는 kubelet은 kube-dns 서비스의 ClusterIP를 사용하도록 Pod의 etc/resolv.conf를 구성합니다. kube-dns는 클러스터 도메인(cluster.local)의 권한 있는 네임서버이며 외부 이름을 재귀적으로 확인합니다.
kube-dns의 ConfigMap을 수정하여 클러스터 내에서 DNS 인프라에 속한 Stub 도메인을 설정할 수 있습니다.
apiVersion: v1
kind: ConfigMap
metadata:
labels:
addonmanager.kubernetes.io/mode: EnsureExists
name: kube-dns
namespace: kube-system
data:
stubDomains: |
{
"example.com": [
"8.8.8.8",
"8.8.4.4",
"1.1.1.1",
"1.0.0.1"
]
}
[참고] Kube DNS
[External DNS]
Route53(AWS), Cloud DNS(GCP) 등 같은 다른 DNS 공급자를 사용하기 위해서는 external dns를 추가적으로 설치해 사용합니다.
[External DNS 실행 방법]
ExternalDNS를 실행하는 두 가지 방법은 다음과 같습니다.
- 클러스터에 배포
- 로컬에서 실행
클러스터 내 External DNS Addon 설치 방법에 대해 설명합니다.
# 모니터링
$ watch -d kubectl get pod -A
# 정책 생성 -> 마스터/워커노드에 정책 연결
$ curl -s -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/AKOS/externaldns/externaldns-aws-r53-policy.json
$ aws iam create-policy --policy-name AllowExternalDNSUpdates --policy-document file://externaldns-aws-r53-policy.json
# ACCOUNT_ID 변수 지정
$ export ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
# EC2 instance profiles 에 IAM Policy 추가(attach)
$ aws iam attach-role-policy --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AllowExternalDNSUpdates --role-name masters.$KOPS_CLUSTER_NAME
$ aws iam attach-role-policy --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AllowExternalDNSUpdates --role-name nodes.$KOPS_CLUSTER_NAME
# 설치
$ kops edit cluster
--------------------------
spec:
certManager:
enabled: true
externalDns:
provider: external-dns
--------------------------
# 업데이트 적용
$ kops update cluster --yes && echo && sleep 3 && kops rolling-update cluster
# externalDns 컨트롤러 파드 확인
$ kubectl get pod -n kube-system -l k8s-app=external-dns
NAME READY STATUS RESTARTS AGE
external-dns-797c59bcbc-l8b85 0/1 Running 0 16s
[Mario 서비스에 도메인 연결 실습]
- 미리 Mario 게임 service/pod를 띄웁니다.
# 수퍼마리오 디플로이먼트 배포
$ curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/1/mario.yaml
$ kubectl apply -f mario.yaml
# 배포 확인 : CLB 배포 확인 >> 5분 이상 소요
$ kubectl get deploy,svc,ep mario
$ watch kubectl get svc mario
# 마리오 게임 접속 : CLB 주소로 웹 접속
$ kubectl get svc mario -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print "Maria URL = http://"$1 }'
[ Mario 서비스에 도메인 연결 실습]
# CLB에 ExternanDNS 로 도메인 연결
$ kubectl annotate service mario "external-dns.alpha.kubernetes.io/hostname=mario.$KOPS_CLUSTER_NAME"
CLUSTER_NAME"
service/mario annotated
# 확인
$ dig +short mario.$KOPS_CLUSTER_NAME
$ kubectl logs -n kube-system -l k8s-app=external-dns
time="2023-03-06T13:02:24Z" level=info msg="All records are already up to date"
time="2023-03-06T13:03:24Z" level=info msg="Applying provider record filter for domains: [wellbeconnected.com. .wellbeconnected.com.]"
time="2023-03-06T13:03:24Z" level=info msg="All records are already up to date"
time="2023-03-06T13:04:24Z" level=info msg="Applying provider record filter for domains: [wellbeconnected.com. .wellbeconnected.com.]"
time="2023-03-06T13:04:24Z" level=info msg="All records are already up to date"
time="2023-03-06T13:04:55Z" level=info msg="Applying provider record filter for domains: [wellbeconnected.com. .wellbeconnected.com.]"
time="2023-03-06T13:04:55Z" level=info msg="Desired change: CREATE cname-mario.wellbeconnected.com TXT [Id: /hostedzone/Z06204681HPKV2R55I4OR]"
time="2023-03-06T13:04:55Z" level=info msg="Desired change: CREATE mario.wellbeconnected.com A [Id: /hostedzone/Z06204681HPKV2R55I4OR]"
time="2023-03-06T13:04:55Z" level=info msg="Desired change: CREATE mario.wellbeconnected.com TXT [Id: /hostedzone/Z06204681HPKV2R55I4OR]"
time="2023-03-06T13:04:55Z" level=info msg="3 record(s) in zone wellbeconnected.com. [Id: /hostedzone/Z06204681HPKV2R55I4OR] were successfully updated"
# 웹 접속 주소 확인 및 접속
$ echo -e "Maria Game URL = http://mario.$KOPS_CLUSTER_NAME"
Maria Game URL = http://mario.wellbeconnected.com
# 도메인 체크
$ echo -e "My Domain Checker = https://www.whatsmydns.net/#A/mario.$KOPS_CLUSTER_NAME"
My Domain Checker = https://www.whatsmydns.net/#A/mario.wellbeconnected.com
자, 이제 마리오 게임을 즐깁니다(네버엔딩 마리오)
blog migration project
written in 2023.3.6
https://medium.com/techblog-hayleyshim/k8s-kube-dns-external-dns-2ad6c7409f38
'IT > Container&k8s' 카테고리의 다른 글
[k8s] Storage (0) | 2023.10.29 |
---|---|
[k8s] Network (0) | 2023.10.29 |
[k8s] Kubernetes Operations (kOps) Install in AWS (0) | 2023.10.29 |
[k8s] OpenInfra & Cloud Native Day Korea 2022 (0) | 2023.10.29 |
[k8s] Network Resources (0) | 2023.10.29 |
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- gcp serverless
- NW
- NFT
- 혼공파
- operator
- k8s cni
- k8s
- AI
- 혼공챌린지
- S3
- terraform
- IaC
- EKS
- controltower
- VPN
- 파이썬
- GCP
- cni
- 혼공단
- 도서
- handson
- 국제 개발 협력
- security
- OS
- GKE
- k8s calico
- SDWAN
- AWS
- cloud
- PYTHON
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함