Kubernetes (K8S): Object - 5. Ingress
Cluster 내의 서비스에 대한 외부 접근을 관리하는 API 오브젝트이며, 일반적으로 HTTP를 관리함.
Ingress 는 LoadBalancer, SSL Terminated, Named 기반의 가상 호스팅을 제공할 수 있다.
1. 정의
1.1. Cluster 외부에서 Cluster 내부 서비스로 HTTP와 HTTPS 경로 노출.
1.2. 구성요소
1.2.1. Ingress Resource
1.2.2. Ingress Controller
1.3. 단일 POD 노출의 경우 Kubectl expose 와 비슷한 효과
1.4. 복잡한 상황시 Ingress가 더 많은 기능 제공
1.5. Ingress Controller 종류
1.5.1. GCE용 : ingress-gce
1.5.2. NGINX용 : ingress-nginx
2. 실습 구성도
3. ingress-nginx 설치
3.1. ingress-download
https://kubernetes.github.io/ingress-nginx/deploy/
사이트에서 baremetal 용 다운로드
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.5.1/deploy/static/provider/aws/deploy.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.0/deploy/static/provider/baremetal/deploy.yaml
위의 방법은 다운로드 후 바로 설치가 되서 파일이 남지 않게 됩니다.
# wget kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.0/deploy/static/provider/baremetal/deploy.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0-beta.0/deploy/static/provider/baremetal/deploy.yaml
deploy.yaml 파일 다운로드 후
# kubectl apply -f deploy.yaml 로 설치 하실 것을 권장합니다.
3.2. 설치 확인
# kubectl get namespace
# kubectl get all -n ingress-nginx
4. 설정
4.1. ingess 파일 설정
4.1.1. # vi ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- path: /foo
pathType: Prefix
backend:
service:
name: svc1
port:
number: 80
- path: /bar
pathType: Prefix
backend:
service:
name: svc2
port:
number: 80
4.2. deployment 및 service 생성
4.2.1. nginx 1 deployment 생성 -> replicas 3으로 변경시 구성도와 동일하게 됨.
4.2.2. svc1 Service 생성
4.2.3. 동일하게 nginx deployment와 Service 생성
# kubectl create deployment nginx1 --image nginx --replicas 1 --namespace ingress-nginx
# kubectl expose deployment nginx1 --name svc1 --port 80 --namespace ingress-nginx
# kubectl create deployment nginx2 --image nginx --replicas=1 --namespace ingress-nginx
# kubectl expose deployment nginx2 --name svc2 --port 80 --namespace ingress-nginx
4.3. pod, service, deployment, replicas 확인
4.3.1. 특히 ingress-nginx-controller의 port 확인
# kubectl get all -n ingress-nginx
5. Test
5.1. http://모든nodeip:ingress-nginx-controllerport/foo
5.2. http://모든nodeip:ingress-nginx-controllerport/foo
5.3. 설정 변경 후 Test
5.3.1. /foo pod 편집 후 테스트 하기
5.3.2. /foo pod NAME 확인, 접속, index.html 편집
# kubectl -n ingress-nginx exec nginx1-7565df6456-5rwwp -it -- bash
# cat > /usr/share/nginx/html/index.html << EOF
> <html>
> <body>
> <h1>K8S-WEBSERVER-/foo</h1>
> </body>
> </html>
> EOF
5.4. 설정 변경 후 테스트
/bar pod은 여러분이 직접 수정해 보세요.
명령어만 된 부분은 반드시 yml 파일로 수정해서 테스트 해보시기 바랍니다.
완전히 실습이 끝났으면 resource 들을 삭제하시기 바랍니다.
# kubectl delete deployment nginx1 nginx2 -n ingress-nginx
# kubectl delete svc svc1 svc2 -n ingress-nginx
# kubectl delete -f ingress.yml -n ingress-nginx
ㅎㅎ 아마도 못해서 몇날 몇일 괴로워하시던 분들 많으실 겁니다.
Have a nice day!