安装ingress-nginx
在github上搜索ingress-nginx
https://github.com/kubernetes/ingress-nginx
找到适合自己k8s版本的ingress-nginx版本
进入deploy
点击这个 /docs/deploy
找到这个deploy文件,注意不能直接执行这个文件,因为镜像源在国外,无法直接部署,需要先把这个文件下载下来,然后修改image的地址:
修改前
修改后
这里的仓库地址我个人阿里云的仓库。
然后修改如下部分:
externalTrafficPolicy: Cluster 由Local改为Cluster
type: LoadBalancer # 注意此处
改完就可以执行kubectl apply -f deploy.yaml部署了。
查看部署状态
这里看到两个 Completed 状态的 Pod:
ingress-nginx-admission-create-xxx
ingress-nginx-admission-patch-xxx
这是因为是 Job 类型的 Pod,它们在执行完自己的任务之后会自动退出,显示为 Completed 状态,这种行为是 正常的。
解释:
在安装 ingress-nginx 时,安装脚本会自动创建两个 Job:
ingress-nginx-admission-create
ingress-nginx-admission-patch
它们用于:
创建 Webhook 所需的 admission 资源。
给 webhook 配置证书(patch)。
这些是一次性执行的任务,执行成功后就终止,Pod 状态会变为 Completed,不会一直运行。
而这个 Pod:
ingress-nginx-controller-xxx
才是实际负责处理 Ingress 请求的 nginx controller,它是一个 Deployment 控制的长期运行服务,正常情况下状态是 Running。
总结:
Completed 状态的 Pod:Job 类型,用于初始化配置(如 Admission webhook)。
Running 状态的 Pod:实际的 nginx ingress controller,处理 Ingress 流量。
你现在可以创建 Ingress 资源测试流量转发了
这里创建一个测试的ingress
假设已经有一个部署在 nginx命名空间下、服务名为 my-nginx 的服务,监听的是 80 端口。
前提条件检查
ingress-nginx-controller 已正常运行
Cluster 中已有服务 my-app 可访问(你可以用 kubectl get svc 查看)
ingress class 配置为 nginx(默认是 nginx,继续用这个)
创建ingress资源的yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
namespace: nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: myapp.local # 域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-nginx
port:
number: 80
测试访问(本地测试)
如果你在本地测试,可以通过修改本机 /etc/hosts 文件,让 myapp.local 指向某个 Node IP,例如:
192.168.1.100 myapp.local
然后在浏览器或 curl 中访问:
http://myapp.local/
nginx.ingress.kubernetes.io/rewrite-target: / 是可选的,表示会把 /xxx 重写为 / 发给后端服务。
ingressClassName: nginx 是告诉 k8s 使用哪个 Ingress Controller(你的就是 nginx)。