[kubernetes] Ingress - IngressController 설치
Ingress 는 API 이며 웹기반 서비스를 외부에서 접속 할 수 있도록 하며, 로드밸런싱 기능, ssl 인증서 처리, virtual host(한서버에 여러 도메인 사용) 해주는 기능을 가지고 있다.
Ingress의 동작 방식을 보자!
ingress 를 클라이언트가 호출하면 routing 규칙에 따라 서비스를 호출 하고 서비스에서는 파드를 호출하게 된다.
서비스가 만약 여러개 라면
Ingress 컨트롤러에 path 형태로 rules을 정의하여 여러 서비스를 목적에 맞게 호출 할 수 있으며
예를 들어 path 가 http://corin.com/A 이면 A서비스로 가고, http://corin.com/B 라면 B 서비스로 호출 하도록 하도록 할 수 있다.
추가로 http가 아닌 ssl 적용하여 https로 사용 가능하며 룰에 다수 도메인 등록하여 사용 가능하다.
ingress를 생성 하기 위해서는 controller를 설치 해야 하며
[kubernetes 홈페이지]를 가보면 여러 컨트롤러가 있으며 빨간색 박스 부분을 보면 쿠버네티스 프로젝트에서 지원하는거는 aws, gce, nginx ingress controller 이다.
우리는 이중에서 nginx ingress controller 를 설치 해보도록 하자!
설치 가이드 페이지를 가보면 여러 Content 중에 선택하면 되고
https://kubernetes.github.io/ingress-nginx/deploy/
클라우드 서비스가 아니고 물리적 서버에서 사용하기에 우리는 Bare-metal 을 선택한다.
가이드 상단에 나온 yaml 파일을 적용하는 부분이 먼저 나오는데 적용전에 yaml 파일을 받아서 확인해보자!
저자의 경우 k8s playground를 사용하고 있어 wget을 설치하고
$ yum install wget
해당 파일을 받아 본다.
$ wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/baremetal/deploy.yaml
전체적으로 보면 네임 스페이스를 만들고 인증을 위해 ServiceAccount 를 만들고 규칙, 서비스를 만든다.
서비스 부분을 보면 NodePort 형태, ClusterIP형태도 존재하는것을 확인 할 수 있다.
$ cat deploy.yaml
apiVersion: v1
kind: Namespace
metadata:
labels:
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
name: ingress-nginx
---
apiVersion: v1
automountServiceAccountToken: true
kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.8.2
name: ingress-nginx
namespace: ingress-nginx
..
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.8.2
name: ingress-nginx
namespace: ingress-nginx
..
---
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.8.2
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- appProtocol: http
name: http
port: 80
protocol: TCP
targetPort: http
- appProtocol: https
name: https
port: 443
protocol: TCP
targetPort: https
selector:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
type: NodePort
---
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.8.2
name: ingress-nginx-controller-admission
namespace: ingress-nginx
spec:
ports:
- appProtocol: https
name: https-webhook
port: 443
targetPort: webhook
selector:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
type: ClusterIP
...
이제 받은 yaml 파일을 적용 하도록 한다.
$kubectl create -f deploy.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
serviceaccount/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
configmap/ingress-nginx-controller created
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
deployment.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
ingressclass.networking.k8s.io/nginx created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created
해당 네임스페이스에 설치된 파드를 보면 3개가 떠있는것을 볼 수 있고
$ kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-nkfgv 0/1 Completed 0 19s
ingress-nginx-admission-patch-pxc6b 0/1 Completed 0 19s
ingress-nginx-controller-79bc9f5df8-lfxjj 0/1 Running 0 19s
서비스를 보면 위에서 확인한 nodeport 형태, cluster ip 형태를 볼 수있다.
$ kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.108.29.11 <none> 80:32447/TCP,443:30840/TCP 37s
ingress-nginx-controller-admission ClusterIP 10.97.164.52 <none> 443/TCP 37s
이제 다음 실습시간에 웹페이지를 만들면서 ingress에 대해 알아 보도록 하자!
끝!
- 이미지 출처 : https://kubernetes.io/docs/concepts/services-networking/ingress/