ETC

[kubernetes] Ingress - IngressController 설치

코린이s 2023. 9. 10. 13:20
728x90

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/

 

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

클라우드 서비스가 아니고 물리적 서버에서 사용하기에 우리는 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/

 

Ingress

Make your HTTP (or HTTPS) network service available using a protocol-aware configuration mechanism, that understands web concepts like URIs, hostnames, paths, and more. The Ingress concept lets you map traffic to different backends based on rules you defin

kubernetes.io

728x90