k8s ingress的实际使用分析

一、写在前面

1.1 Ingress参考文档

Ingress官方文档:
https://kubernetes.io/zh/docs/concepts/services-networking/ingress/
Ingress的实现
https://kubernetes.io/zh/docs/concepts/services-networking/ingress-controllers/
nginx-ingress实现:
https://kubernetes.github.io/ingress-nginx/deploy/
nginx-ingress github
https://github.com/kubernetes/ingress-nginx

1.2 Ingress是什么?

1、Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
2、你必须具有 Ingress 控制器 才能满足 Ingress 的要求。 仅创建 Ingress 资源本身没有任何效果。

  • 从上面两句话看出:
    1、Ingress实现nginx类似的功能,主要是用来反向代理Service
    2、Ingress必须选择一个实现,建议使用 nginx-ingress,不然k8s默认是没有Ingress功能的

请添加图片描述

1.3 总结(重要)

1、Ingress默认是不实现,官方推荐使用nginx-ingress进行实现,该案例也是使用nginx-ingress

2、Ingress从某种角度来看,就是用来维护nginx的nginx.conf文件

二、nginx-ingress部署

采用 yaml 进行部署

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/baremetal/deploy.yaml

采用 helm 进行部署

helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx --create-namespace

2.1 部署说明

Ingress实现,我们采用nginx的方式进行实现

因为我是采用IP+NodePort访问Ingress的,所以采用baremetal裸金属进行部署

查看Ingress暴露的端口

[root@mos-mdw-01 ~]# kubectl get svc -n ingress-nginx|grep ingress-nginx
ingress-nginx-controller             NodePort    10.233.6.205    <none>        80:31762/TCP,443:31763/TCP   22h
ingress-nginx-controller-admission   ClusterIP   10.233.56.46    <none>        443/TCP                      22h

可以看出,Ingress的80访问端口为:31762

同时记住 31762 给下文使用。

访问:http://10.51.13.13:30762/

请添加图片描述
从上图看出,Ingress是基于nginx实现的

2.2 部署注意

  • 1、nginx-ingress版本在部署方式存在一定差异,但是对于普通使用者来说,是没有区别的
  • 2、如果有条件,还是推荐使用helm部署,因为helm部署的参数比较多,修改起来也方便
  • 3、如果采用yaml清单的方式进行部署,修改命名空间,或者修改Ingress作用访问,就需要自己去修改。例如增加 --watch-namespace=xxx 来限制 Ingress作用那些命名空间

三、使用Ingress进行代理

3.1 创建一个测试的pod

k8s默认的测试—创建工作负载
kubectl create deployment demo --image=httpd --port=80
k8s默认的测试—创建service
kubectl expose deployment demo

[root@mos-mdw-01 ~]# kubectl get pods
NAME                                      READY   STATUS    RESTARTS   AGE
demo-54ff5d84db-4ksmq                     1/1     Running   0          7m23s
nfs-client-provisioner-6cf5846d5d-2nl6x   1/1     Running   0          28d

Ingress访问方式1

这个时候,我们创建一个Ingress来进行访问
采用域名进行访问

vi demo-ingress.yaml

其中 10.51.13.13 为物理机的地址

kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: demo-ingress
spec:
  rules:
    - host: 10.51.13.13.nip.io
      http:
        paths:
          - path: /
            pathType: ImplementationSpecific
            backend:
              service:
                name: demo
                port:
                  number: 80

kubectl apply -f demo-ingress.yaml

访问 http://10.51.13.13.nip.io:31762/

请添加图片描述

Ingress访问方式2

或者采用IP+NodePort和上下文的方式进行访问

vi demo-ingress2.yaml

kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: demo-ingress2
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - http:
        paths:
          - path: /testpath
            pathType: Prefix
            backend:
              service:
                name: demo
                port:
                  number: 80

kubectl apply -f demo-ingress2.yaml

访问 http://10.51.13.13:31762/testpath

请添加图片描述

3.2 Ingress相关介绍

1、Ingress 规则

可选的 host。在此示例中,未指定 host,因此该规则适用于通过指定 IP 地址的所有入站 HTTP 通信。 如果提供了 host(例如 foo.bar.com),则 rules 适用于该 host。

路径列表 paths(例如,/testpath),每个路径都有一个由 serviceName 和 servicePort 定义的关联后端。 在负载均衡器将流量定向到引用的服务之前,主机和路径都必须匹配传入请求的内容。

2、路径类型

Ingress 中的每个路径都需要有对应的路径类型(Path Type)。未明确设置 pathType 的路径无法通过合法性检查。当前支持的路径类型有三种:

ImplementationSpecific:对于这种路径类型,匹配方法取决于 IngressClass。 具体实现可以将其作为单独的 pathType 处理或者与 Prefix 或 Exact 类型作相同处理。

Exact:精确匹配 URL 路径,且区分大小写。

Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个完成。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。 如果每个 p 都是请求路径 p 的元素前缀,则请求与路径 p 匹配。

3.3 关于Ingress

Ingress从某种角度来看,就是用来维护nginx的nginx.conf文件。可以实现nginx的反向代理、负载均衡等功能

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes Ingress-Nginx是一个用于管理Kubernetes集群中的Ingress资源的工具。它支持使用Ingress Annotations来实现不同场景下的灰度发布和测试。其中,Nginx Annotations支持基于Cookie的切分流量来实现灰度发布。具体实现方式是通过判断用户请求中的Cookie是否存在灰度标识Cookie来确定是否为灰度用户,从而决定是否返回灰度版本的服务。 在配置中,可以使用以下Annotations来实现灰度发布: - `nginx.ingress.kubernetes.io/canary`:可选值为true/false,表示是否开启灰度功能。 - `nginx.ingress.kubernetes.io/canary-by-cookie`:灰度发布Cookie的键。当键的值等于"always"时,灰度触发生效;其他值则不会走灰度环境。 例如,如果请求的Cookie中包含名为"vip_user"的键,并且值为"always",则会生效灰度配置,访问灰度版本的服务。 要实际执行灰度发布配置,可以使用以下命令: ``` kubectl apply -f ingress-gray.yaml ``` 如果想查看服务并获取Ingress的外部端口,可以使用以下命令: ``` kubectl -n ingress-nginx get service ``` 这将显示Ingress-Nginx控制器的服务信息,包括集群IP、外部IP和端口等。 #### 引用[.reference_title] - *1* [【云原生 | Kubernetes 实战】20、K8s Ingress 实现业务灰度发布](https://blog.csdn.net/weixin_46560589/article/details/128505651)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【Kubernetes】第十篇 - 灰度发布的介绍与实现](https://blog.csdn.net/ABAP_Brave/article/details/129220116)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值