Ingress
- Service 主要用于集群内部的通信和负载均衡,而 Ingress 则是用于将服务暴露到集群外部,并提供灵活的 HTTP 路由规则。在实际应用中,它们通常结合使用,Service 提供内部通信和负载均衡,Ingress 提供外部访问和路由。
基本概述与传统的对比
-
nginx是ingress的实现之一,ingress是一个抽象的概念,也就是,可以不仅仅实现nginx,需要安装ingress-nginx
-
下图为对比图:
安装ingress-nginx
1.先安装helm,下载二进制文件
https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gz
2.解压(tar -zxvf helm-v3.10.2-linux-amd64.tar.gz)
tar: 用于处理 tar 文件的命令。
-zxvf: 参数用于指定解压缩的选项,具体含义如下:
z: 表示要使用 gzip 解压缩。
x: 表示解压缩。
v: 表示详细输出,显示解压缩的过程。
f: 后面紧跟着要解压的文件名。
3.将解压目录下的 helm 程序移动到 usr/local/bin/helm
进入linux-amd64,然后复制过去 cp helm /usr/local/bin/
4.下载ingress包
# 添加仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
这个命令的目的是将指定的 URL https://kubernetes.github.io/ingress-nginx 添加到你的 Helm 仓库列表中,并为该仓库取名为 ingress-nginx。
Helm 是一个用于简化和管理 Kubernetes 应用部署的工具。它允许你定义、安装和升级 Kubernetes 应用,称为 charts。Charts 是预定义的 Kubernetes 资源的打包方式,包括 Deployment、Service、ConfigMap 等,使得应用的部署和管理变得更加方便。
# 查看仓库列表
helm repo list
# 搜索 ingress-nginx
helm search repo ingress-nginx
执行 helm search repo ingress-nginx 的命令将在你已添加的所有 Helm 仓库中搜索包含关键字 "ingress-nginx" 的 Charts。这使你能够快速找到与 Ingress 相关的 Charts,并可以通过 Helm 安装它们到你的 Kubernetes 集群中。
# 下载安装包
helm pull ingress-nginx/ingress-nginx
# 解压缩
tar -xf ingress-nginx-4.9.1.tgz
5.配置参数
# 解压后,进入解压完成的目录
cd ingress-nginx
# 修改 values.yaml
镜像地址:修改为国内镜像
搜索image,找到对应的地方换
registry: registry.cn-hangzhou.aliyuncs.com
image: google_containers/nginx-ingress-controller
image: google_containers/kube-webhook-certgen
tag: v1.3.0
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
修改部署配置的 kind: DaemonSet
nodeSelector:
ingress: "true" # 增加选择器,如果 node 上有 ingress=true 就部署
将 admissionWebhooks.enabled 修改为 false
将 service 中的 type 由 LoadBalancer 修改为 ClusterIP,如果服务器是云平台才用 LoadBalancer
6.安装ingress
# 为 ingress 专门创建一个 namespace
kubectl create ns ingress-nginx
# 为需要部署 ingress 的节点上加标签
kubectl label node k8s-node1 ingress=true
# 安装 ingress-nginx
helm install ingress-nginx -n ingress-nginx .
- 注意:我这里遇见了一些问题,就是
root@master:~/k8s/helm/ingress-nginx# helm install ingress-nginx -n ingress-nginx .
Error: template: ingress-nginx/templates/controller-role.yaml:48:9: executing "ingress-nginx/templates/controller-role.yaml" at <ne (index .Values.controller.extraArgs "update-status") "false">: error calling ne: invalid type for comparison
# 这里说我的values.yaml文件里面controller.extraArgs "update-status"这个参数没有,于是我在values.yaml中加上了,如下图
-
然后好像就成功了
-
查看也有
-
另一个注意的点是,好像无法部署到master上,因为有污点,后面再说。
路径匹配和虚拟主机匹配
- 配置文件如下:
apiVersion: networking.k8s.io/v1
kind: Ingress # 资源类型为 Ingress
metadata:
name: wolfcode-nginx-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: / #也可以使用正则
spec:
rules: # ingress 规则配置,可以配置多个
- host: k8s.wolfcode.cn # 域名配置,可以使用通配符 *
http:
paths: # 相当于 nginx 的 location 配置,可以配置多个
- pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配,URL需要与path完全匹配上,
且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
backend:
service:
name: nginx-svc # 代理到哪个 service
port:
number: 80 # service 的端口
path: /api # 等价于 nginx 中的 location 的路径前缀匹配,这里也可以用正则
- 然后创建
# 查看运行的node
kubectl get po -n ingress-nginx -o wide
# 本质就是在这个node上开了个nginx服务
netstat -ntlp
-
这个是没有符合前缀匹配,因为ingress本身就是nginx,所以在ingress这个地方就报错了,都没有到service,即nginx这个service。
-
这里是符合前缀规则,找到了是nginx的service,也符合版本号,这里是加了nginx.ingress.kubernetes.io/rewrite-target: /的重写策略,要不然也会报错。因为是前面的nginx-svc服务,而这个服务的工作路径是/usr/share/nginx/html,所以访问http://k8s.wolfcode.cn/api时会找到/usr/share/nginx/html/api,而这个html目录里面没有api,所以会报错,于是要重写,但是也会有一定的问题,比如http://k8s.wolfcode.cn/api?i=1,这里也会直接到nginx-svc服务的根目录/处,参数也没了
-
多域名配置时:
apiVersion: networking.k8s.io/v1
kind: Ingress # 资源类型为 Ingress
metadata:
name: wolfcode-nginx-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules: # ingress 规则配置,可以配置多个
- host: k8s.wolfcode.cn # 域名配置,可以使用通配符 *
http:
paths: # 相当于 nginx 的 location 配置,可以配置多个
- pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
backend:
service:
name: nginx-svc # 代理到哪个 service
port:
number: 80 # service 的端口
path: /api # 等价于 nginx 中的 location 的路径前缀匹配
- pathType: Exec # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配>,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
backend:
service:
name: nginx-svc # 代理到哪个 service
port:
number: 80 # service 的端口
path: /
- host: api.wolfcode.cn # 域名配置,可以使用通配符 *
http:
paths: # 相当于 nginx 的 location 配置,可以配置多个
- pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配>,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
backend:
service:
name: nginx-svc # 代理到哪个 service
port:
number: 80 # service 的端口
path: /
# 也就是在基础配置上,在是列表的地方,可以多加几份就行了