본문 바로가기
서버인프라/kubernetes

[제 9강] Ingress

by techwold ted 2023. 1. 5.

안녕하세요. 오늘은 Ingress 에 대해서 얘기해 보려 합니다.

저도 쿠버네티스를 공부하며, 기록 할겸 이렇게 계속 쿠버네티스 강의를 쓰고 있습니다. 하면서 보니 적용할 수 있는 곳과 적용하기 힘든 곳이 구분이 되더라구요 같이 글 보시는 여러분들도 많은 것들을 느끼면서 공부하는데 제 글이 도움이 되셨으면 합니다.

 

쿠버네티스에서 ingress로 사용할 수 있는 것들이 많은 것으로 알고 있습니다. 그중 쿠버네티스에서는 AWS와 GCE 그리고 Nginx를 지원합니다. 그 중에서 우리는 단돈서버에서 설치했으니 Nginx ingress 컨트롤러를 사용해 보도록 하겠습니다.

 

ingress 부분을 공부하면서 많은 실수가 있어서 삽질즘 했는데 그 부분 역시 내용을 공유 하도록 하겠습니다.

 

우선 nginx ingress 를 설치합니다.

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.5.1/deploy/static/provider/baremetal/deploy.yaml

https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal-clusters

 

Installation Guide - NGINX Ingress Controller

Installation Guide There are multiple ways to install the NGINX ingress 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

자세한 사항은 위 Nginx Ingress Controller 에 가셔서 확인 하실 수 있습니다.

 

이제 설치가 되셨다면 다음과 같이 확인해 보실 수 있습니다.

kubectl get namespaces
NAME              STATUS   AGE
default           Active   17h
ingress-nginx     Active   14h
kube-node-lease   Active   17h
kube-public       Active   17h
kube-system       Active   17h

ingress-nginx 가 생성 되신 것을 볼 수 있습니다. 그리고 아래와 같이 확인하시면 ingress controller가 생성 되신 것을 알 수 있습니다.

 kubectl get pod -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-hpjqv        0/1     Completed   0          14h
ingress-nginx-admission-patch-4l8fz         0/1     Completed   0          14h
ingress-nginx-controller-64f79ddbcc-8vtxv   1/1     Running     0          14h

그리고 우리는 이제 기본 namespace를 ingress-nginx로 변경해 줍니다.

kubectl config set-context --current --namespace='ingress-nginx'

이제 테스트를 위해서 Deployment replicas 3 으로 생성해 줍니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

그럼 위와 같이 pod를 확인 할 수 있습니다. 저렇게 나온 분들은 정상인거에요^^

자 이제 이전 시간에 했던 단일 진입점을 만들어 줄겁니다.

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: ClusterIP
  clusterIP: 10.100.200.200
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

우리가 배웠던 모든 것들을 했습니다.

이제 외부에서 진입하기 위해서 ingress를 적용해 볼겁니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
spec:
  defaultBackend:
    service:
      name: nginx
      port:
        number: 80
  ingressClassName: nginx
kubectl create -f ingress.yaml

다들 잘 만들어 주셨으면. 다음과 같이 다시한번 확인 해 주세요

root@master:~/install/yaml/ingress# kubectl get service -o wide
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE   SELECTOR
ingress-nginx-controller             NodePort    10.107.111.166   <none>        80:31554/TCP,443:30298/TCP   18h   app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
ingress-nginx-controller-admission   ClusterIP   10.107.217.23    <none>        443/TCP                      18h   app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
nginx                                ClusterIP   10.100.200.200   <none>        80/TCP                       17h   app=nginx

80:31554 / 443:30298 이런식으로 포트 포워딩 되어 있는데. 외부에서 31554로 들어가면 이제 우리는 외부 웹 페이지에서 확인 되실겁니다.

저는 3개 nginx pod의 index.html 을 저런 식으로 변경 했습니다. R/R 로드벨런싱되어 실행 됩니다.

다들 잘 되나요?

그리고 저는 처음에 ingress yaml 부분에 ingressClassName 을 넣지 않아 아래와 같이 ADDRESS 가 생성 되지 않았습니다.

여러분은 이러 고충을 격지 않으셨으면 좋겠습니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
spec:
  defaultBackend:
    service:
      name: nginx
      port:
        number: 80
root@master:~/install/yaml/ingress# kubectl get ingress
NAME           CLASS    HOSTS   ADDRESS   PORTS   AGE
test-ingress   <none>   *                 80      9s

https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/

 

Ingress Controllers

In order for an [Ingress](/docs/concepts/services-networking/ingress/) to work in your cluster, there must be an _ingress controller_ running. You need to select at least one ingress controller and make sure it is set up in your cluster. This page lists co

kubernetes.io

부족한 내용은 kubernetes에서 확인하시어 찾아가길 바랍니다.^^

'서버인프라 > kubernetes' 카테고리의 다른 글

K8S 리셋  (30) 2023.12.24
[제 10강] Labels 사용  (0) 2023.01.12
[제 8강] Service  (2) 2023.01.04
[제 7강] NameSapace  (4) 2022.12.29
[제 6강] Updating a Deployment  (1) 2022.12.27

댓글