Kubernetes Ingress NGINX 安装教程

Kubernetes Ingress Controller 允许我们以统一的方式暴露 HTTP 和 HTTPS 服务。本教程将指导你如何在 Kubernetes 集群中部署并配置 NGINX 类型的 Ingress Controller。

一、环境准备

确保你已经有一个正常运行的 Kubernetes 集群,并安装了以下工具:

kubectl

helm(推荐方式安装)

kubeconfig 配置已正确连接到集群

检查是否连接正常:

kubectl get nodes

二、添加 Helm 仓库

我们使用官方的 ingress-nginx Helm Chart 仓库进行安装:

1
2
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

三、安装 Ingress NGINX 控制器

使用 Helm 安装 Ingress NGINX:

1
2
helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace kube-system

若联网有些问题,也可以先下载再本地安装

1
2
3
4
5
6
helm pull ingress-nginx/ingress-nginx
helm upgrade --install ingress-nginx ./ingress-nginx-4.12.2.tgz   \
--set controller.service.type=NodePort   \
--set controller.service.nodePorts.http=30080   \
--set controller.service.nodePorts.https=30443 \
-n kube-system

等待 Pod 启动完成:

1
kubectl get pods -n kube-system -w

你也可以通过以下命令查看部署的 Service:

1
kubectl get svc -n kube-system

四、验证部署

检查控制器是否成功运行:

1
kubectl get deployment ingress-nginx-controller -n kube-system

验证是否有 LoadBalancer(适用于云环境)或 NodePort/HostPort(适用于本地环境):

1
kubectl get svc ingress-nginx-controller -n kube-system

五、创建 Ingress 资源

以下是一个简单的示例 Ingress 资源:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: devops-demo
  namespace: dev  # 修改为 abc-api 服务所在的命名空间
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "false"  # 如需启用 HTTPS,请设置为 "true"
spec:
  ingressClassName: nginx  # 如果你用的是 nginx-ingress,确认类名是否为 nginx
  rules:
    - host: dev-ci.demo.itseek.dev
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: devops-ci
                port:
                  number: 80  # 替换为 abc-api 服务实际对外暴露的端口

使用https相关的配置如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: devops-k8sui
  namespace: dev  # 修改为 abc-api 服务所在的命名空间
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "false"  # 如需启用 HTTPS,请设置为 "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  ingressClassName: nginx  # 如果你用的是 nginx-ingress,确认类名是否为 nginx
  rules:
    - host: dev-k8sui.demo.itseek.dev
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: devops-k8sui
                port:
                  number: 443  # 替换为 abc-api 服务实际对外暴露的端口

若服务在k8s集群外部,或者不同的命名空间下,通过创建service以及endpoints等方式以实现加入ingress

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
### service.yaml
apiVersion: v1
kind: Service
metadata:
  name: devops-ci
  namespace: dev
spec:
  ports:
    - port: 80
      targetPort: 80
  clusterIP:  # 或 ClusterIP(默认)

---
# endpoints.yaml
apiVersion: v1
kind: Endpoints
metadata:
  name: devops-ci
  namespace: dev
subsets:
  - addresses:
      - ip: 172.20.1.2  # 目标后端服务 IP
    ports:
      - port: 8080

部署资源:

1
kubectl apply -f ingress-app.yaml

六、本地测试

如果你使用的是本地集群(如 kind、minikube 等),可将域名绑定到本地:

编辑 /etc/hosts 添加:

127.0.0.1 dev-ci.demo.itseek.dev

然后访问 http://dev-ci.demo.itseek.dev 以验证配置是否生效。

七. 若外层有nginx以实现负载均衡,相关配置如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
upstream wxyx {
    server 172.20.1.2:30080;
}

server {
   listen 80;
   server_name demo.itseek.dev *.demo.itseek.dev itseek.dev *.itseek.dev;
   root /usr/share/nginx/html;
   index index.html index.htm;
   include ext/accesslog.conf;
#    location /robots.txt { return 403; }

   location / {
        client_max_body_size 1000m;
        #Proxy Settings
        proxy_pass http://wxyx;
        include ext/proxy.conf;
 }

}

server {
    listen       443 ssl;
    server_name  demo.itseek.dev *.demo.itseek.dev;
    ssl_certificate /opt/ssl/demo.itseek.dev.pem;
    ssl_certificate_key /opt/ssl/demo.itseek.dev.key;
   root /usr/share/nginx/html;
   index index.html index.htm;
   include ext/accesslog.conf;
#    location /robots.txt { return 403; }

   location / {
	client_max_body_size 1000m;
        #Proxy Settings
	proxy_pass http://wxyx;
	include ext/proxy.conf;
 }
}