Kubernetes Service & Ingress
1. Service
pod은 Controller에 의해 관리되기 때문에 한군데에 고정되어있지 않습니다.
서비스를 사용하게 되면 pod가 클러스터 내 어디에 있던지 상관없이 고정된 주소를 사용해서 접근이 가능하게 됩니다.
ClusterIP
- 가장 기본 타입
- 클러스터 내부의 노드에서 접근가능
- 클러스터 외부에서는 접근불가
NodePort
- 각 노드의 지정된 포트를 할당하는 방식
- 노드의 포트를 사용하기 때문에 클러스터 외부나 내부 모두 접근가능
- 특이점 : pod이 1번노드에 떠있다고 하더라도 2번노드의 ip로 접근가능
LoadBalancer
- 클라우드 서비스를 사용할 때 사용가능한 옵션
- pod을 클라우드에서 제공하는 로드밸런서와 연결해 해당 로드밸런서의 ip를 이용해 외부에서 접근할 수 있게 해줌
- EXTERNAL-IP에 IP가 표시됨
ExternalName
- 클러스터 내부에서 외부로 접근할 때 주로 사용
- 이 서비스로 접근하면 설정해둔 CNAME값으로 연결되어 클러스터 외부로 접근할 수 있음
kube-proxy란?
쿠버네티스 클러스터의 각 노드마다 실행되고 있으면서
클러스터 내부 IP로 연결되기 바라는 요청을 적절한 곳으로 전달해주는 역할을 합니다.
2. Ingress
클러스터 외부에서 내부로 접근하는 요청을 어떻게 처리할지 정리해둔 규칙들의 모음입니다.
- 외부에서 접근가능한 URL
- 트래픽 로드밸런싱
- SSL/TLS termination
- ip가아닌 이름기반 주소처리
등이 가능합니다.
이러한 설정들을 ingress라고 하고, 실제 행위자는 ingress controller입니다.
쿠버네티스에서 공식적으로 제공하는 ingress controller는 두개입니다.
- ingress-gce
- ingress-nginx
gce같은경우는 구글클라우드를 사용하면 자동으로 사용할 수 있고 직접 클러스터에 설치해서 사용할 수 있는것은 ingress-nginx입니다.
그럼 실습으로 좀 더 자세하게 알아보겠습니다.
실습
ingress 규칙 정의
$ vim ingress-controller.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
#- host: foo.bar.com # host를 명시하지 않으면 ip로 연결
- http:
paths: # 각 path는 백엔드와 연결됨
- path: /testpath
backend: # 연결될 서비스이름과 port
serviceName: test
servicePort: 80
Tip) Host를 지정해야 할 경우
spec: rules: - host: foo.bar.com http: paths: - path: /testpath backend:
위와 같이 host를 지정하였으면 밑의 http는 “-“을 빼주어야 합니다.
http도 “-“를 붙이게 되면 위의 host와는 별도의 블럭으로 취급되어 적용이 안됩니다.
ingress배포
$ kubectl apply -f ingress-controller.yaml
$ kubectl get ingress
상세 내용 확인
$ kubectl describe ingress test-ingress
/testpath로 접속하면 test서비스의 80포트로 연결된다는 규칙을 확인할 수 있습니다.
ingress controller(ingress-nginx) 생성
Nginx Ingress Controller/Deployment Guide
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.45.0/deploy/static/provider/baremetal/deploy.yaml
$ kubectl get deployment -A
ingress contoller에 접근하기 위한 서비스 생성
$ kubectl expose deploy nginx-ingress-controller --type=NodePort -n ingress-nginx
ip:port로 접근
아무 path를 설정하지 않았을 경우 default 페이지가 뜨게됩니다.
위에서 default로 설정을 하지 않았기 때문에 404에러가 뜹니다.
위의 ingress규칙대로 /testpath로 이동해봅시다.
설정은 있지만, 서비스가 뜨지 않았으므로 503에러가 발생합니다.
서비스 생성
/testpath와 이어질 서비스를 올려줍니다.
$ kubectl apply -f deployments-nginx.yaml
$ kubectl expose deploy nginx-deployment --name test
$ kubectl get svc
새로고침
ingress를 사용하지 않았다면 서비스타입이 ClusterIP니까 외부에서 접근이 안되어야 하는게 정상입니다.
하지만 다시 페이지로 돌아가서 새로고침을 하면 :
ingress controller에서 서비스로 연결을 시켜주는 것을 확인할 수 있습니다.
==================================================
$ kubectl get svc -n ingress-nginx
kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.99.184.25 <none> 80:30572/TCP,443:31912/TCP 15d
ingress-nginx-controller-admission ClusterIP 10.109.109.217 <none> 443/TCP 15d