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;
 }
}
  |