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