开发 k8s 管理平台 - k8sailor 20. 为 Deployment 创建 Ingress

简介: 开发 k8s 管理平台 - k8sailor 20. 为 Deployment 创建 Ingress

开发 k8s 管理平台 - k8sailor 20. 为 Deployment 创建 Ingress

原文地址: https://tangx.in/posts/books/k8sailor/chapter02/01-install-k3s-cluster/

tag: https://github.com/tangx/k8sailor/tree/feat/20-create-ingress

k8s ingress

https://kubernetes.io/zh/docs/concepts/services-networking/ingress/
  # Create an ingress with a default backend
  kubectl create ingress ingdefault --class=default \
  --default-backend=defaultsvc:http \
  --rule="foo.com/*=svc:8080,tls=secret1" --dry-run -o yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  creationTimestamp: null
  name: ingdefault
spec:
  defaultBackend:
    service:
      name: defaultsvc
      port:
        name: http
  ingressClassName: default
  rules:
  - host: foo.com
    http:
      paths:
      - backend:
          service:
            name: svc
            port:
              number: 8080
        path: /
        pathType: Prefix   # 匹配方式
  tls:
  - hosts:
    - foo.com
    secretName: secret1
status:
  loadBalancer: {}

路径类型

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

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

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

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

说明: 如果路径的最后一个元素是请求路径中最后一个元素的子字符串,则不会匹配 (例如:/foo/bar 匹配 /foo/bar/baz, 但不匹配 /foo/barbaz)。

不建议使用 ImplementationSpecific,因为这个参数实现的功能取决于 IngressClass / IngressController , 对用户 1. 或不可控2. 或认知盲点。 如果后期换了一个 Controller 或换了一个人维护则可能出现异常。

事实上, 在 kubectl create ingress 的时候, 也是通过判断 rule 中的 uri 最后一个字符是否为 * 号确定使用使用哪种规则。 有 * 使用 prefix, 没有使用 exact 。

API 请求体设计

endpoint 传递方式

因此我们采用 k8s 的规则, 使用 * 座位 PathType 的描述符。

### Post ingress
POST http://127.0.0.1:8088/k8sailor/v0/ingresses/my-nginx-5?namespace=default
Content-Type: application/json

{
    "endpoints":[
        "http://www.baidu.com/v0",
        "http://www.baidu.com/v1/api/*?backend=svc-google:443&tls=google-tls"
    ]
}

在 ingress 参数设计的时候, 考虑到 URL 的可读性

  1. 直接将多个字段合并成了一个整体, 可以通过转换成 url.URL 进行解构,获取其中的关键字段。
  2. 在规则参数的传递上,为了更符合一个 RFC 3986 URI 规定, 所以使用 query 进行参数传递。
http://www.example.com:20080/v1/api/*?backend=svc-google:443&tls=google-tls
  1. host 不支持 IP 地址, 也就是说 http://192.168.100.100/v1/api 是不合法的。
  2. 在 IngressRule 规则中, 不支持 显式 指定端口, 目前是通过 http / https 协议 隐式 实现的的 80 / 443 端口。
  3. host 可以为 将转发所有请求。 host 为域名时只转发匹配域名的请求。
https://pkg.go.dev/k8s.io/api@v0.21.4/networking/v1#IngressRule

这里的 port 其实并没有用, 保留设计只是为了 标识 外部入口使用的端口。 这种情况在云上遇到的不多, 但在一些实施项目上由于可能会遇到,例如域名没有备案。

ingress 非标准端口转发

backend service 默认值

除此之外, 在实现的时候 query 参数 backend=svc-google:port 进行了一些默认值处理

  1. 如果不传递 backend, 将默认使用 ingressName 作为 serviceName。 这个主要是为了服务名称的统一性。 ingress -> service -> workloads 使用相同名字, 更具有识别性。
  2. port 如果不传递, 默认是 80
注意: 在创建 service 的时候, port 是可以 具名的, 这个 port 名字 也是能被使用的。 因此 portName 最好不要使用 纯数字, 避免造成混淆。

以下是对 ServiceBackendPort 的定义, 支持 string 的 nameint32 的 Number

// k8s.io/api@v0.21.4/networking/v1/types.go
// ServiceBackendPort is the service port being referenced.
type ServiceBackendPort struct {
    // Name is the name of the port on the Service.
    // This is a mutually exclusive setting with "Number".
    // +optional
    Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"`

    // Number is the numerical port number (e.g. 80) on the Service.
    // This is a mutually exclusive setting with "Name".
    // +optional
    Number int32 `json:"number,omitempty" protobuf:"bytes,2,opt,name=number"`
}
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
28天前
|
Kubernetes 应用服务中间件 nginx
【赵渝强老师】K8s中的Deployment控制器
Kubernetes中的Deployment用于部署无状态应用程序,管理Pod的数量、更新方式和资源限制。通过创建和管理ReplicaSet,Deployment可以实现Pod的自动扩缩容、滚动更新和回滚。本文介绍了Deployment的基本概念,并通过一个具体的示例演示了如何使用Deployment创建、更新和管理Pod。
|
1月前
|
存储 运维 Kubernetes
云端迁移:备份中心助力企业跨云迁移K8s容器服务平台
本文将简要介绍阿里云容器服务ACK的备份中心,并以某科技公司在其实际的迁移过程中遇到具体挑战为例,阐述如何有效地利用备份中心来助力企业的容器服务平台迁移项目。
|
28天前
|
存储 Kubernetes 调度
【赵渝强老师】K8s中Deployment控制器与StatefulSet控制器的区别
K8s中的Deployment控制器用于管理无状态应用程序,关注Pod数量、更新方式等;而StatefulSets控制器则管理有状态应用程序,提供持久存储和唯一标识符,适用于需要稳定网络标识符和持久化存储的场景。两者的主要区别在于是否维护状态和顺序。
|
2月前
|
Kubernetes Docker 微服务
微服务实践k8s&dapr开发部署实验(1)服务调用(一)
微服务实践k8s&dapr开发部署实验(1)服务调用(一)
49 2
|
2月前
|
Kubernetes JavaScript 前端开发
k8s学习--chart包开发(创建chart包)
k8s学习--chart包开发(创建chart包)
111 1
|
2月前
|
Kubernetes 负载均衡 应用服务中间件
k8s学习--ingress详细解释与应用(nginx ingress controller))
k8s学习--ingress详细解释与应用(nginx ingress controller))
294 0
|
3月前
|
Kubernetes 应用服务中间件 nginx
Kubernetes上安装Metallb和Ingress并部署应用程序
Kubernetes上安装Metallb和Ingress并部署nginx应用程序,使用LoadBalancer类型的KubernetesService
190 7
|
2月前
|
缓存 Kubernetes 负载均衡
在K8S中,ingress 有何作用?
在K8S中,ingress 有何作用?
|
2月前
|
Kubernetes Docker 微服务
微服务实践k8s&dapr开发部署实验(1)服务调用(二)
微服务实践k8s&dapr开发部署实验(1)服务调用(二)
56 0
|
4月前
|
Kubernetes 应用服务中间件 API
【Ingress 秘籍】集群进出流量的总管:揭秘 Kubernetes 中 Ingress 的终极奥秘!
【8月更文挑战第25天】Ingress是Kubernetes中用于管理HTTP与HTTPS流量进入集群的核心功能。作为集群内外通信的桥梁,Ingress通过定义规则将外部请求导向内部服务。本文详细介绍了Ingress的基本概念、配置方法及其实现方式。通过使用不同的Ingress控制器(如Nginx、Traefik等),用户可以根据需要选择最适合的方案。文中还提供了示例代码展示如何创建服务、部署应用及配置Ingress规则。
174 6