본문 바로가기

IT 엔지니어/CLOUD

K8S - ingress

[Ingress]

  1. 정의 및 역할
기존의 서비스 거치지 않고 
API 확인 후 POD 에 직접 접근 가능

클러스터 밖에서 내부로 접근하는 요청 시 처리 방식

1. HTTP/HTTPS 통해 외부에서 내부 접근 가능 유도 
2. 클러스터 외부에서 접근 가능한 URL 제공
3. 트래픽 로드밸런싱
4. SSL/TLS 인증서 처리
5. 도메인 기반 가상 호스팅 제공

여러 서비스를 동일한 IP 주소 아래에서 운영 가능
접근 관리가 효율적인 API 객체 

 

2. 필요성

서비스의 한계 극복( 하나의 서비스에 하나의 포트 )
서비스 포트가 아닌 경로 기반 라우팅으로 컨테이너 접근 방식

 

3. 접근 방식

<http://www.test.com/>      -> svc1-webserver POD
<http://www.test.com/guest> -> svc2-webserver POD
<http://www.test.com/admin> -> svc3-webserver POD

 

4. 구성요소

Ingress Controller
		 |
Ingress resource
/     |     \
   svc1    svc2    svc3
 
 클러스터 외부에서 내부 서비스(Pod)에 접근하게 해주는 HTTP(S) 라우터 역할
 
	 호스트 10.6.1.4 -> 마스터 192.168.10.50 -> 서비스 10.233.10.100:30080 -> INGRESS CONTROLLER 80:80 -> ENDPOINT ->


5 . Ingress controller 설치 및 확인

cd /root/kubespray/inventory/mycluster/group_vars/k8s_cluster

vi addons.yml

100 ingress_nginx_enabled: true // TRUE 변경 


-------------------------------------------------------------------------------------------------------------------------------------
wget <https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.0/deploy/static/provider/baremetal/deploy.***yaml>

vi deploy.yaml

345 spec:
346   ports:
347   - appProtocol: http
348     name: http
349     port: 80
350     protocol: TCP
351     targetPort: http
			352     nodePort: 30080***          추가 입력
***353   - appProtocol: https
354     name: https
355     port: 443 
356     protocol: TCP
357     targetPort: https
			358     nodePort: 30443***          추가 입력
			***364   clusterIP: 10.233.10.100***   추가 입력

******

 

6. Deploy.yaml 적용

namespace / ingress-nginx-controller - service / deployment 생성

 

 

 

Ingress controller 설치 완료

 

7. Ingress  서비스 구성

Deployment / Service 생성

vi svc1.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy1-webserver
  **labels: 
    app: websrv**
    
spec:
  replicas: 1
  selector:
    matchLabels:
      app: websrv
  template:
    metadata:
      labels:
        app: websrv
    spec:
      containers:
      - name: pod-web
        image: nginx:1.14
        ports:
          - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: svc1-web
    
spec:
  type: ClusterIP
  clusterIP: 10.233.10.11
  selector:
    app: websrv
  ports:
    - name: web-port
      port: 9001
      targetPort: 80
vi svc2.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy2-guest

spec:
  replicas: 2
  selector:
    matchLabels:
      app: guestsrv
  template:
    metadata:
      labels:
        app: guestsrv
    spec:
      containers:
      - name: pod-guest
        **image: gcr.io/google-samples/kubernetes-bootcamp:v1**
        ports:
          - containerPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  name: svc2-web

spec:
  type: ClusterIP
  clusterIP: 10.233.10.12
  selector:
    app: guestsrv
  ports:
    - name: guest-port
      port: 9002
      targetPort: 8080
vi svc3.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy3-admin

spec:
  replicas: 3
  selector:
    matchLabels:
      app: adminsrv
  template:
    metadata:
      labels:
        app: adminsrv
    spec:
      containers:
      - name: pod-admin
        image: k8s.gcr.io/echoserver:1.5
        ports:
          - containerPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  name: svc3-admin

spec:
  type: ClusterIP
  clusterIP: 10.233.10.13
  selector:
    app: adminsrv
  ports:
    - name: admin-port
      port: 9003
      targetPort: 8080

 

 

8. Ingress 생성 (룰 생성)

kubectl describe ingressclasses

vi ingress,yml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  nginx.ingress.kunernetes.io/rewrite-target: /
	
spec:
  ingressClassName: nginx
  rules:
  - host:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: svc1-web
            port:
              number: 80
      - path: /guest
        pathType: Prefix
        backend:
          service:
            name: svc2-guest
            port:
              number: 8080
      - path: /admin
        pathType: Prefix
        backend:
          service:
            name: svc3-admin
            port:
              number: 8080

kubectl get ing

kubectl describe ing name

address 확인 후
해당 주소로 접근 가능

curl 192.168.10.200:30080/

curl <http://192.168.10.150:30080>
curl <http://192.168.10.150:30080/guest>
curl <http://192.168.10.150:30080/admin>

for i in {1..300}; do curl 192.168.10.100:30080/guest; done | sort | uniq -c | sort -nr

 for i in {1..300}; do curl 10.233.10.12:9002; done | sort | uniq -c | sort -nr

 

부하 분산 확인 가능

 

webhook

webhook 에러 발생 시 해결책

kubectl delete validatingwebhookconfiguration ingress-nginx-admission

 

클러스터 네트워크 문제인 경우 시 해결

'IT 엔지니어 > CLOUD' 카테고리의 다른 글

K8S - ConfigMap -1  (0) 2025.06.02
Labels/ Annotations  (1) 2025.06.01
K8S - Service  (0) 2025.05.30
K8S - STATEFULSET  (0) 2025.05.29
k8S - REPLICASET  (0) 2025.05.28