[Tech]/[Tech]kubernetes
ingress controller and ingress
써니블루(SunnyBlue)
2021. 3. 22. 23:37
"kubernetes에서 ingress는 왜 필요한가?"
kubernetes에서 서비스를 배포(deployment)하고 나면, 클러스터 내에서만 접속이 가능하다. 딱 여기까지이다.
즉, 외부(클러스터 밖)에서는 해당 서비스가 보이지 않기 때문에 접속도 되지 않는다.
만약, 클러스터 바깥에서도 해당 서비스로 접속을 하고싶다면, 이때 필요한 컴포넌트가 "ingress controller"이다.
ingress controller 설치
ingress controller는 여러가지 있지만 주로 "ingress-nginx controller"를 많이 사용하는것 같다.
간단한 커맨드로 설치가 쉽다.
- 아래 예제는 baremetal에 설치 기준이다.
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.43.0/deploy/static/provider/baremetal/deploy.yaml
Tips
- 클러스터내 특정 노드에만 controller를 배포하고 싶을때 node selector를 사용하면 편리하다
- ingress를 자동 배포하게 되면 클러스터 내 어떤 노드에도 생성될 수 있다.
- 경우에 따라서는 ingress controller 용 host ip가 변경될 수 있다는 뜻이다.
- 만약 여러 사람이 ingress ip를 공유해야하는 상황이라면 사전에 ingress controller로 사용할 host와 ip를 정해놓고 이곳에만 배포하여 사용하는것이 낫다.
- 아래 코드를 deployment에 추가하면 된다.
spec:
template:
spec:
hostNetwork: true
nodeSelector:
node-role.kubernetes.io/ingress: "true"
- 미리 ingress node로 사용할 호스트에는 node label을 지정해야 한다.
kubectl label node my-host-ingress node-role.kubernetes.io/ingress=true
- master node에 ingress controller를 배포하는 방법이다.
- master 노드에는 ingress controller 배포가 기본으로 되지 않는다.
- 그런데 서버가 부족해서 master서버를 ingress로 사용할 때 유용하다.
- 방법은 간단하다. ingress로 사용하려는 master node를 untainted 하면 ingress controller 배포가 가능하다.(물론 노드 label을 지정해야한다. <Tip 1 참조>
kubectl taint node my-host-master01 node-role.kubernetes.io/master:NoSchedule-
- 배포가 잘 됐는지 확인해본다.
kubectl get pods -n ingress-nginx \
-l app.kubernetes.io/name=ingress-nginx --watch
여기까지 하고나면 ingress 서버 구성은 끝났다.
외부에서 서비스 접속이 가능하도록 서비스를 위한 ingress 설정(ingress object) 생성만 해주면 된다.
서비스를 위한 ingress 설정 방법
- kubernetes ingress 참조 https://kubernetes.io/ko/docs/concepts/services-networking/ingress/
인그레스(Ingress)
FEATURE STATE: Kubernetes v1.19 [stable] 클러스터 내의 서비스에 대한 외부 접근을 관리하는 API 오브젝트이며, 일반적으로 HTTP를 관리함. 인그레스는 부하 분산, SSL 종료, 명칭 기반의 가상 호스팅을 제공
kubernetes.io