코알못

[kubernetes] Ingress - IngressController 설치 본문

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
Comments