Helm을 통해 Nginx Ingress를 설치해보도록 하겠습니다.
Helm3를 설치해주시고, nginx-ingress namespace를 만들어주세요
그리고 아래와 같이 values.yaml을 만들어주도록 하겠습니다.
여기서 중요하게 봐야하는 부분이 ingressClass입니다. Nginx Ingress를 하나만 두지 않고 여러개를 두어 통신하게 구성할 수 있는데,
이때 ingressClass로 어떤 nginx ingress에서 트래픽을 받을 것인지 정하기 때문입니다.
저는 일단 외부에서 퍼블릭하게 할 수 있도록 구성할 것인데 ext-nginx-ingress라 칭하겠습니다.
만약 저 처럼, 특정 Node에 배포하실게 아니라면 affinity는 빼주시면 됩니다.
controller:
ingressClass: ext-nginx
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: nodegroup-type
operator: In
values:
- MANAGE
service:
annotations:
external-dns.alpha.kubernetes.io/hostname: yourdomain.com
service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
이제 아래와 같이 구성하여보도록 하겠습니다.
kubectl create ns ext-nginx-ingress
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install -f ./ext-values.yaml -n ext-nginx-ingress ext-nginx ingress-nginx/ingress-nginx
이제, annotation을 읽어서 자동으로 Route53에 도메인을 등록 할 수 있도록, External DNS를 아래 yaml을 통해 배포해주세요
apiVersion: v1
kind: ServiceAccount
metadata:
name: ext-external-dns
namespace: ext-nginx-ingress
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: ext-external-dns
rules:
- apiGroups: [""]
resources: ["services"]
verbs: ["get","watch","list"]
- apiGroups: [""]
resources: ["pods"]
verbs: ["get","watch","list"]
- apiGroups: ["extensions"]
resources: ["ingresses"]
verbs: ["get","watch","list"]
- apiGroups: [""]
resources: ["nodes"]
verbs: ["list"]
- apiGroups: ["networking.istio.io"]
resources: ["gateways"]
verbs: ["get","watch","list"]
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: ext-external-dns-viewer
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: ext-external-dns
subjects:
- kind: ServiceAccount
name: ext-external-dns
namespace: ext-nginx-ingress
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: external-dns
namespace: ext-nginx-ingress
spec:
selector:
matchLabels:
app: external-dns
strategy:
type: Recreate
template:
metadata:
labels:
app: external-dns
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: nodegroup-type
operator: In
values:
- MANAGE
serviceAccountName: ext-external-dns
containers:
- name: external-dns
image: registry.opensource.zalan.do/teapot/external-dns:v0.5.17
args:
- --source=service
- --source=ingress
- --domain-filter=yourdomain.com # 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=route53 id
nginx ingress가 다른 네임스페이스에 트래픽을 전달하기 위해서는
아래와 같이 externalName.yaml을 nginx ingress가 구성된 네임스페이스에 만들어 주어야합니다.
kind: Service
apiVersion: v1
metadata:
name: phh-fo
namespace: ext-nginx-ingress
spec:
type: ExternalName
externalName: phh-fo.phh-test-fo.svc.cluster.local
이렇게 하면,
해당 coredns를 통해서 다른 네임스페이스에 있는 서비스더라도 phh-fo라는 이름을 매핑시켜 트래픽을 전달할 수 있게 됩니다.
마지막으로 ingress는 아래와 같이 배포해주시면 됩니다.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ext-nginx-ingress
namespace: ext-nginx-ingress
annotations:
kubernetes.io/ingress.class: "ext-nginx"
spec:
rules:
- host: yourdomain.com
http:
paths:
- path: /
backend:
serviceName: phh-fo
servicePort: 9000
Nginx Ingress 설치 및 트래픽 전달을 할 수 있게하는 ingress에 대해서 간략하게 알아봤습니다.
'EKS > LoadBalancer & EXT DNS' 카테고리의 다른 글
EKS LoadBalancer - 3. Network LoadBalancer (0) | 2020.02.05 |
---|---|
EKS LoadBalancer - 2. Application LoadBalancer (0) | 2020.02.04 |
EKS LoadBalancer - 1. Classic LoadBalancer, External DNS (0) | 2020.02.04 |