k8s部署IngressController
ingress概念
Ingress: Service的统一网关入口.
ingress工作原理
参考: https://www.toutiao.com/a6939101056643203587/?log_from=8fbeb3d56fe36_1646033531592

k8s部署IngressController
下载ingress-nginx资源清单
项目地址: https://kubernetes.github.io/ingress-nginx/deploy/#quick-start
如果不是云主机,请下载裸金属配置: https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal-clusters
# 下载ingress-nginx资源清单
wget https://ghproxy.com/https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.6.4/deploy/static/provider/baremetal/deploy.yaml
编辑ingress-nginx资源清单(裸金属配置不用修改)
!!!注意: nodePort大小写敏感
在services中添加http和httpt的NodePort,默认是随机端口
type修改为NodePort
http的端口修改为30080
https的端口修改为30443

修改ingress默认端口
参考: https://blog.csdn.net/catoop/article/details/121447317
如果ingress已经部署好,就使用下面的方法进行修改
# 编辑nginx-ingress-controller
kubectl edit daemonset nginx-ingress-controller -n ingress-nginx
编辑nginx-ingress-controller的yaml资源清单
containers:
- args:
- /nginx-ingress-controller
- --default-backend-service=$(POD_NAMESPACE)/default-http-backend
- --configmap=$(POD_NAMESPACE)/nginx-configuration
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
- --annotations-prefix=nginx.ingress.kubernetes.io
# 增加以下两个参数参数(一个是http端口,一个是https端口)
- --http-port=80
- --https-port=443
删除原来的nginx-ingress-controller这个 pod,k8s重建pod后端口会生效.
apply后查看ingress
# apply这个ingress资源清单
kubectl apply -f deploy.yaml
# 查看ingress
kubectl get ingress -A
# 查看ingress详情
kubectl desrice ingress ing名
修改ingress-nginx的网络模式为hostNetwork
开启hostNetwork后可以直接使用域名访问,不需要加端口,性能也更好.
控制器类型必需使用DaemonSet,否则pod暴露的host端口会冲突
参考: https://blog.csdn.net/weixin_41535316/article/details/121873795
修改下载好的ingress-nginx资源清单文件中的网路配置为hostNetwork
# 将Deployment修改为DaemonSet
apiVersion: apps/v1
#kind: Deployment
kind: DaemonSet #这里把Deployment改成DaemonSet
metadata:
# 在DaemonSet的下方的容器选择中添加一行
spec:
dnsPolicy: ClusterFirst
hostNetwork: true #这里加一句,开启hostNetwork
containers:
- name: controller
# 修改NodePort为ClusterIP(非必须)
# type: NodePort
type: ClusterIP

pathType路径类型
-
Exact:精确匹配 URL 路径,且区分大小写。 -
Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个完成。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。 如果每个 p 都是请求路径 p 的元素前缀,则请求与路径 p 匹配。
ingress如果要访问路径,在path 要填写//路径,注意是两个/;
如果访问的是根路径,1个/就好
ingress暴露的两种方式
NodePorthostnetwork

k8s发布一个应用
1. 创建deployment
# 创建一个deployment
kubectl create deployment edu --image=nginx
2. 为deployment创建services
# 创建一个svc
kubectl expose deployment edu --port=80 --target-port=80
3. 为services创建ingress
# 通过命令行创建yaml
kubectl create ingress edu --rule=web.edu.cn/=edu:80 --dry-run=client -o yaml > ing.yaml
ingress-yaml资源清单示例
!!!注意: k8s1.22及以上版本的ingress必须声明控制器
# 定义 Kubernetes Ingress 资源,用于配置外部访问集群服务的路由规则
apiVersion: networking.k8s.io/v1
## apiVersion: 使用 networking.k8s.io/v1 版本的 Ingress API(Kubernetes 1.19+ 推荐)
kind: Ingress
## kind: 资源类型为 Ingress,用于管理外部 HTTP/HTTPS 访问
metadata:
name: edu
## name: Ingress 资源的名称,在命名空间内唯一
annotations:
# 指定使用的 Ingress 控制器类型,确保由 NGINX Ingress Controller 处理此规则
# 如果集群中部署了多个 Ingress Controller(如 nginx、traefik、alb),必须指定
kubernetes.io/ingress.class: "nginx"
## kubernetes.io/ingress.class: 指定 Ingress 的控制器类别
## "nginx": 表示该 Ingress 应由 NGINX Ingress Controller 处理
## 若不设置,可能被错误的控制器忽略,导致域名无法访问
spec:
## spec: Ingress 的规格定义,描述期望状态
rules:
## rules: 定义一组基于主机和路径的路由规则
## 支持多个规则,每个规则对应一个 host
- host: web.edu.cn
## host: 指定客户端访问的域名
## 当 HTTP 请求的 Host 头为 web.edu.cn 时,匹配此规则
## 若省略 host,则匹配所有域名(通配)
http:
## http: 定义 HTTP 路由规则(Ingress 也支持 https/tls)
paths:
## paths: 定义该 host 下的路径匹配规则列表
- path: /
## path: URL 路径匹配前缀
## "/" 表示匹配所有路径(如 /, /api, /static 等)
## 支持前缀匹配(Prefix)或精确匹配(Exact)
pathType: Prefix
## pathType: 路径匹配类型
## Prefix: 前缀匹配,请求路径以 path 开头即匹配
## Exact: 精确匹配,请求路径必须完全一致
backend:
## backend: 定义匹配成功后的后端服务
service:
## service: 指定后端为 Kubernetes Service
name: edu
## name: 目标 Service 的名称
## 必须与集群中已存在的 Service 名称一致
port:
## port: 指定 Service 的端口
number: 80
## number: Service 开放的端口号
## 流量将被转发到名为 edu 的 Service 的 80 端口
## Service 再将流量转发到后端 Pod 的 targetPort
通过命令行创建ingress(命令创建的域名无法访问,未解决)
访问/目录时要填写两个//
# 创建名为 edu 的 Ingress,将 web.edu.cn/ 路由到 edu 服务的 80 端口
## kubectl create ingress: 创建 Ingress 资源
## edu: Ingress 名称
## --rule=host/path=service:port: 规则格式
## web.edu.cn/: 主机名 + 路径(路径不能省略,至少为 /)
### 访问/目录时要填写两个//
## edu:80: 目标 Service 名称和端口
kubectl creste ingress ${ing名称} --rule="${域名}=${svc名}:${svc端口}"
kubectl create ingress edu --rule="web.edu.cn/=edu:80"
4. apply这个ingress
# apply这个ingress
kubectl apply -f ing.yaml
# 查看ingress
kubectl get ingress
5. 验证这个ingress
本地修改hosts绑定对应域名
!!!注意:<Ingress Controler Pod所在Node IP> 域名
# 查看Ingress Controler Pod所在node
kubectl get po -A -owide|grep ingress-nginx-controller
# # 查看Ingress Controler Pod所在node
kubectl get pods,svc -owide -n ingress-nginx

ingress配置规则https
参考: 将 HTTPS 负载平衡中的多个 SSL 证书与 Ingress 搭配使用

创建证书文件(自签名)
https://blog.csdn.net/omaidb/article/details/121188674
# 创建key
openssl genrsa -out qftest.com.tls.key 2048
# 创建crt
openssl req new -x509 -key tls.key -out tls.crt -subj
/C=CN/ST=Beijing/L=Beijing/O=DevOps/CN=myapp.tls-ingress.com
# 将key和crt文件合并成pem证书文件
#cat my_site.pem ca_chain.pem my_site.key > combined_cert.pem
# 将证书保存到Secret
kubectl create secret tls 证书名 --cert=tls.crt --key=tls.key
创建https的ingress规则
# 将证书保存到Secret
kubectl create secret tls 证书名 --cert=tls.crt --key=tls.key
# 创建https的ingress规则
## 访问/目录时要填写两个//
kubectl create ingress edu --rule=web.edu.cn//=edu:80,tls=证书名secret --dry-run=client -o yaml > https-ing.yaml
ingress-yaml资源清单示例
!!!注意: k8s1.22及以上版本的ingress必须声明控制器
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: edu
annotations:
# 指定下ingress控制器,不然域名访问不了
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- host: web.edu.cn
secretName: 证书名 # 这里填写secret中对应的证书名
rules:
- host: web.edu.cn
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: edu
port:
number: 443
部署backend应用
通常在 Ingress 控制器中会配置 defaultBackend(默认后端),以服务于任何不符合规约中 path 的请求.
参考:
k8s-doc配置默认后端
查看ing详情时会提示: Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
这是没有部署默认backend应用.

创建ingress报错
参考: https://blog.csdn.net/qq_39218530/article/details/115372879
错误提示如下:
Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": Post https://ingress-nginx-controller-admission.kube-system.svc:443/networking/v1beta1/ingresses? timeout=10s: dial tcp 10.0.0.5:8443: connect: connection refused
解决办法
参考办法: https://stackoverflow.com/questions/61616203/nginx-ingress-controller-failed-calling-webhook
# 使用下面的命令查看 webhook
kubectl get validatingwebhookconfigurations
# 打印ingress-nginx-admission
# 删除ingress-nginx-admission
kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission
# 再创建ingress就不报错了
ingress没有adress,域名访问404
参考: 解决 Kubernetes NGINX Ingress Controller v1.0.0-Yamasa of the World 的 404 错误问题
老版本的ingress可以域名访问,且有address,新版本的ingress访问404且没有adress
发生错误的版本: controller-v1.1.2
解决办法: 声明ingressClass(指定ingress控制器)
必须声明ingressClass(指定ingress控制器)
# 创建ingress时声明IngressClass就会有address,也不会404
annotations:
kubernetes.io/ingress.class: "nginx"

本文介绍如何在Kubernetes中部署Ingress Controller,并详细讲解Ingress的工作原理及常见配置方法,包括使用Ingress暴露服务、配置HTTPS等。
4097

被折叠的 条评论
为什么被折叠?



