# 설치
사실 난 이미 다 설치해놨는데 실제로 설치할때 경로찾는게 중요할것 같아서 조금 자세하게 적어볼거다.
k8s공식문서에서 ingress controller를 검색하고 저 링크로 들어간다.
그리고 저기에 쿠버네티스가 서포트 하고 있따는 aws,gce,nginx중 선택해야하는데
우리는 온프레미스 환경에서 텍스트할거니까 nginx를 선택하자.
그럼 깃헙 페이지가 뜨고 저기서 getting started를 누르면
Installation Guide - Ingress-Nginx Controller
Installation Guide There are multiple ways to install the Ingress-Nginx Controller: with Helm, using the project repository chart; with kubectl apply, using YAML manifests; with specific addons (e.g. for minikube or MicroK8s). On most Kubernetes clusters,
kubernetes.github.io
가이드 웹사이트로 이동하는데,
contents에서
베어메탈을 선택하면,
베어메탈 클러스터를 설치할 명령어가 뜬다.
마스터 노드에서
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/baremetal/deploy.yaml
저기 제공된걸 복붙해서 바로 apply해서 ingress controller를 설치해버리거나,
그냥 저기 github링크를 wget으로 받아서 설치해줘도 된다.
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/baremetal/deploy.yaml
kubectl create -f deploy.yaml
파일 받고 kubectl create 명령어로 설치해주면 된다.
# ingress controller도 k8s환경에서 여러 리소스들로 운영된다.
vi deploy.yaml
wget으로 받은yaml파일을 대충 훝어보면,
보다싶이 여러 리소스들을 생성해버린다.
이게 바로 ingress controller를 운영하는 리소스들이다.
# ingress controller가 작동하는건지 확인
kubectl get all --all-namespaces | grep ingress
해당 명령어로 ingress라는 스트링을 포함한 리소스들을 확인해보면,
뭐 이것저것 ingress리소스들이 보인다.
# 개념
공식문서에서 가져온 사진인데, 인그레스로 클라이언트 요청이 들어오고 이 요청에 따라 서비스를 따로 배치해놓을 수 있다. 내가 직접 그린 그림을 보면,
ingress controller가 있고 이곳이 단일진입점이 된다. 외부에서 접속하는것이기때문에 서비스 타입은 NodePort이며, pod는 그림과 달리 다른 노드에도 있을 수 있으나, 이해를 쉽게하기 위해 마스터노드에 그렸다.
여기서 도메인:노드포트/api으로 요청을 할때, 요청하는 api에 따라 서비스를 각각 선택 할 수 있다. /muzzi로 요청이 들어오면, muzzi서비스에 가서 muzzi-deployment로 요청을 보내주고 응답받고, /dori로 요청이 들어오면 dori 서비스에 가서 dori-deployment로 요청을 보내고 받는다.
실제로 저렇게 환경을 만들어서 보면,
pod정보인데 ingress-nginx-controller가 worker1노드에서 running중이고
서비스들을 보면, ingress-nginx-controller가 단일진입점으로 작동하고, dori와 muzzi서비스가 각각 있어서 ingress-nginx-controller로부터 api에 따라 선택받는다.
# 그럼 worker1노드가 단일진입점이 되는거야? ->아닌듯
난 각각
master node : 211.183.3.10
worker1 node : 211.183.3.20
worker2 node : 211.183.3.30
으로 클러스터를 구축했는데, 이렇게 dog.com을 호스트로 ingress controller를 구성해서 테스트 해봤다.
맨처음 ingress controller가 /dori요청으로 잘 작동한다. 이 당시에는 dog.com이 worker1 node의 아이피였다.
그다음 worker2노드, master노드 모두 dog.com으로 호스트를 지정해주고 똑같이 테스트해봤으나 모두 작동했다.
즉 모든 노드들에 인그레스 컨트롤러 노드포트로 진입하면 동작한다는거다.
# ingress controller의 여러 기능들.
1. service에 외부 URL제공
난 service와 ingress controller를 연결할때 host로 테스트해봤다. 강의내용처럼 아이피로 접속하는건 안되길래 ㅠ
뭐 이런말같다.
2. 트래픽 로드밸런싱
이건 뭐 /muzzi로 요청하거나 /dori로 요청하거나등이 다르니까 로드밸런싱을 해준다는건지,
공식문서 이 그림에서 인그레스,매니지드 로드 밸런서가 인그레스 앞단에서 클라이언트 요청을 받는데, 아까 테스트해봤던것처럼 클러스터를 구성한 각각의 vm들 혹은 인스턴스들에게 각각 로드밸런싱 해준다는건지 잘 모르겠지만 아마 후자같다. 강의내용에선 전자라고했는데.. 후자같음.
3. SSL인증서 처리
이건 편할것 같다. 요청들어오면 모드 ssl인증서처리해주고 80포트로 넘겨주는데 쓸만할듯. nginx가 웹서버 기반이라 이런건 기똥차게 설정해주니까 매우 편할것같다.
4. virtual hosting지정
난 도메인을 하나만 설정해서 api요청만 다르게 해서 테스트해봤지만, 실제로는 여러 도메인으로 한 클러스터에서 여러 서비스를 구성 할 수도 있다. ingress.yaml파일 손을 좀 봐야할듯하다.
뭐 도메인 두개를 한 웹사이트 클러스터에 연결한다거나, 도메인 두 개이상을 한 클러스터에 연결한다거나 등등 뭐 여러가지 있을수 있을듯하다.
# 왜 ingress controller는 k8s에서 기본적으로 제공해주지 않을까?
ingress는 이전에 배웠던것마냥 단순히 yaml파일만 생성하여 k8s에서 기본적으로 제공해주는 엔진으로 생성되지 않는다.
때문에 우리는 ingress controller를 설치했던 것인데 그 이유를 좀 알고 싶었다.
근데 모르겠으니 gpt한테 물어보았다..
- 다양성과 확장성: Kubernetes는 다양한 환경에서 사용되며, 각각의 클러스터가 다른 요구 사항을 가집니다. Ingress의 사용 사례와 설정이 클러스터 간에 다르기 때문에 특정 Ingress Controller를 기본으로 제공하는 것은 일반적인 사용 사례를 충족하지 못할 수 있습니다. Kubernetes는 다양한 Ingress Controller 옵션을 허용하여 사용자가 자신의 요구 사항에 맞게 선택할 수 있도록 합니다.
- 커뮤니티 참여: Kubernetes는 큰 개방형 소스 커뮤니티에 기반하고 있으며, 다양한 Ingress Controller 프로젝트들이 활발하게 개발되고 있습니다. 이러한 다양성은 사용자들이 자신의 환경에 맞게 선택할 수 있도록 하는데 도움이 됩니다. 각 Ingress Controller는 자체적으로 특정 기능, 설정 및 통합을 제공하며, 이는 클러스터의 목적이나 보안 요구 사항에 따라 다를 수 있습니다.
- 플러그인 아키텍처: Kubernetes는 플러그인 아키텍처를 강조하고 있습니다. 이는 필요에 따라 사용자가 원하는 Ingress Controller를 선택하고 통합할 수 있는 유연성을 제공합니다. 플러그인 아키텍처를 통해 클러스터의 기능을 확장하고 커뮤니티가 다양한 Ingress Controller를 개발하고 공유할 수 있습니다.
- 코어 기능의 간결성: Kubernetes는 코어 기능을 간결하게 유지하고, 필요에 따라 클러스터를 확장할 수 있는 플러그인 및 확장 기능을 지원하는 것이 중요하게 여겨집니다. 기본적인 기능을 유지하면서 클러스터의 복잡성을 최소화하는 것이 목표입니다.
뭐이렇대
'k8s > concept' 카테고리의 다른 글
labels (0) | 2023.12.12 |
---|---|
ingress/ test (0) | 2023.12.11 |
service/ headless service (0) | 2023.12.07 |
service/ k8s의 dns구성, service type> externalName (0) | 2023.12.06 |
service/ service type > ClueterIP & NodePort & LoadBalancer (0) | 2023.12.05 |