---
id: kubernetes-ingress
title: "Ingress"
shortTitle: "Ingress"
track: kubernetes
trackTitle: "Kubernetes"
order: 9
level: important
status: published
estimatedMinutes: 30
prerequisites:
  - kubernetes-helm
next: kubernetes-managed
reviewedAgainst: 2026-10-12
sources:
  - title: "Ingress"
    url: https://kubernetes.io/docs/concepts/services-networking/ingress/
  - title: "Ingress controllers"
    url: https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/
---

# Ingress

Ingress là object Kubernetes mô tả HTTP đi vào cluster theo host và path. Controller là process nghe cổng và route theo object đó. Có object mà không có controller thì không có traffic.

## Để làm gì

Viết một Ingress trỏ host về một Service, và biết `ingressClassName` phải khớp controller đang chạy.

## Gồm những gì

- `Ingress`, rule host và path, backend là Service.
- Ingress controller, khác object Ingress.
- Gateway API chỉ nhắc qua: đó là thế hệ sau, lab không viết.

Không gồm cài NGINX Ingress và không apply lên cluster.

## Dùng khi nào

Nhiều Service cần một địa chỉ HTTP, phân theo tên miền. Một Service đã có `type: LoadBalancer` thì mỗi Service một địa chỉ, tốn và không có host rule.

Đừng khai Ingress rồi tưởng TLS tự có. Bạn vẫn cần Secret certificate hoặc một cơ chế cấp phát mà controller hỗ trợ.

## Kiến thức cốt lõi

Spec có `ingressClassName`. Controller chỉ xử lý Ingress thuộc class của nó. Thiếu class, hoặc sai tên, object nằm yên và không bao giờ có địa chỉ.

Rule có host, path, và backend `service.name` cùng `service.port`. Port là port của Service, không phải port container, trừ khi chúng trùng số. Path `/` gửi mọi thứ của host đó tới Service.

Nhiều controller cùng cluster thì phải chỉ class, không thì hai controller cùng giành hoặc không controller nào nhận.

Gateway API là bộ object khác (`Gateway`, `HTTPRoute`). Bài này không dùng. Đọc Ingress trong repo cũ vẫn là Ingress.

## Lệnh và code mẫu

`ingress.yaml`:

```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: lab
spec:
  ingressClassName: nginx
  rules:
    - host: lab.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: lab-web
                port:
                  number: 80
```

Nếu có kubectl và không cần cluster:

```bash
kubectl apply --dry-run=client -f ingress.yaml
```

`--dry-run=client` không gửi lên API. Không có kubectl thì chỉ đọc YAML.

## Thực hành

1. Đọc YAML và chỉ ra Service cùng port của backend.
2. Chỉ ra `ingressClassName`.
3. Dry-run nếu có kubectl. Không apply thật.

## Kết quả mong đợi

Backend `lab-web` port 80, class `nginx`. Dry-run in object và không báo lỗi schema.

## Checklist

- [ ] Cluster có đúng một controller cho class đó, hoặc bạn cố ý tách class.
- [ ] Host trong Ingress là tên DNS bạn đã trỏ, không phải tên tưởng tượng trên production.
- [ ] TLS có Secret hoặc issuer, không để HTTP cho site cần mật khẩu.

## Lỗi thường gặp

**Port backend ghi nhầm port container.** Service đang map 80 tới container 8080. Ingress phải ghi 80. Ghi 8080 thì controller nối sai cổng Service.

**Không có controller.** `kubectl get ingress` không có ADDRESS. Cài controller hoặc dùng lớp load balancer ngoài cluster, đừng tạo thêm object Ingress cùng class.

## Nguồn

1. [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/) — rule, path, TLS.
2. [Ingress controllers](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/) — object khác controller.

## Tiếp theo

[AKS, EKS và GKE](./06-managed.md)
