-
Kubernetes Nginx Ingress 알아보기Kubernetes 2023. 12. 16. 00:39728x90반응형
- 목차
소개.
Ingress 는 Kubernetes 환경을 외부 네트워크와 연결하는 창구역할을 합니다.
Kubernetes 내부의 Pod 들은 서로의 IP 를 기반으로 통신을 수행하는데요.
Kubernetes 외부에서 특정 Pod 와의 연결은 불가능합니다.
Ingress 는 이러한 소통을 가능하게 하는 Kubernetes 리소스이며,
이번 글에서 Nginx 을 기반으로하는 Nginx Ingress 에 대해서 설명하려고 합니다.Ingress 란 ?
Ingress 는 Kubernetes 외부에서 Kubernetes 내부로의 통신을 가능하게 도와주는 Kubernetes Resource 입니다.
네트워크 관점에서 Ingress 와 Egress 라는 개념이 존재합니다.
Ingress 는 Inbound Network Traffic 을 수용하는 개념이고, egress 는 그 반대입니다.
Kubernetes 의 Pod 들은 Egress Network 는 가능합니다.
반면 Ingress Network 는 단절되어있어 불가능하죠.
그래서 Ingress 라는 Kubernetes Resource 는 이름 그대로 Ingress Network Traffic 을 관리하는 Kubernetes Resource 입니다.
Ingress 는 여러가지 종류가 존재합니다.
흔히 사용되는 Nginx 기반의 Ingress 가 존재하고, 그외에 Traefik, HAProxy Ingress, Contour 등이 있습니다.
Kubernetes 의 Resource 들은 반드시 Controller 가 필요한데요.
이 Controller 의 Reconcile Loop 을 통해서 Self-Healing 또는 Auto-Scaling 등을 가능하게 합니다.
그래서 Deployment, ReplicaSet 등은 Kubernetes Built-in Controller 가 존재합니다.
반면, Ingress 는 Built-in Controller 가 존재하지 않습니다.
왜냐하면 사용가능한 종류가 많습니다. ( Nginx, Traefik, HAProxy Ingress, Contour )
그래서 사용자의 선택에 맡겨집니다.
Ingress Controller 가 생성된다면 본격적으로 Ingress 라는 Kubernetes Resource 를 사용할 수 있게 됩니다.Kubernetes Version Compatibility.
아래는 쿠버네티스와 Ingress Controller 의 버전 호환테이블입니다.
Ingress 를 적용하기 위해서는 Ingress Controller 와 Custon Resource Definition 의 설치가 선행되어야합니다.https://docs.nginx.com/nginx-ingress-controller/technical-specifications/
https://github.com/kubernetes/ingress-nginx
그리고 Kubernetes 와 호환되는 버전의 nginx-controller 를 선택하시면 됩니다.
저는 Kubernetes 1.24 환경과 호환되는 1.8.4 버전의 nginx-controller 를 사용할 예정입니다.
https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.4/docs/examples/static-ip/nginx-ingress-controller.yamlNginx Ingress 적용하기.
아래의 내용은 Local Kubernetes 에서 Ingress 를 생성하는 내용입니다.
참고한 KinD-Ingress 문서 또한 함께 공유드립니다.
https://kind.sigs.k8s.io/docs/user/ingress/#ingress-nginx
KinD Kubernetes 클러스터 생성.
cat <<EOF> /tmp/k8s-cluster.yaml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane kubeadmConfigPatches: - | kind: InitConfiguration nodeRegistration: kubeletExtraArgs: node-labels: "ingress-ready=true" extraPortMappings: - containerPort: 80 hostPort: 80 protocol: TCP - containerPort: 443 hostPort: 443 protocol: TCP - role: worker - role: worker - role: worker EOF
kind create cluster \ --name test-cluster \ --image kindest/node:v1.24.0 \ --config /tmp/k8s-cluster.yaml
Nginx Ingress Controller 생성.
먼저 nginx-ingress Namespace 를 생성합니다.
그리고 nginx-ingress-controller 를 생성합니다.
nginx-ingress-controller 는 Deployment 로 관리됩니다.
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
kubectl wait --namespace ingress-nginx \ --for=condition=ready pod \ --selector=app.kubernetes.io/component=controller \ --timeout=90s
Pod, Service, Nginx 생성하기.
cat <<EOF> /tmp/node.yaml kind: Pod apiVersion: v1 metadata: name: node labels: app: node spec: containers: - command: - /agnhost - netexec - --http-port - "8080" image: registry.k8s.io/e2e-test-images/agnhost:2.39 name: node --- kind: Service apiVersion: v1 metadata: name: node-service spec: selector: app: node ports: - port: 8080 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: node-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - http: paths: - pathType: Prefix path: / backend: service: name: node-service port: number: 8080 --- EOF kubectl apply -f /tmp/node.yaml
아래와 같이 확인이 가능합니다.
반응형'Kubernetes' 카테고리의 다른 글
ArgoWorkflow Parallel Nested Dag 구현하기 ( with Kubernetes ) (0) 2024.01.03 [Kubernetes] Argo Workflows 시작하기 (0) 2023.12.28 Helm 알아보기 (2) 2023.12.11 Kubernetes Custom Resource 알아보기 (0) 2023.12.11 Kubernetes Certificate 알아보기 (0) 2023.12.11