前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >七层调度:ingress 资源及 Ingress Controller 控制器

七层调度:ingress 资源及 Ingress Controller 控制器

原创
作者头像
懒人的小脑
修改2020-11-30 18:11:41
1.7K0
修改2020-11-30 18:11:41
举报

使用 Service NodePort 可以实现 IP:端口 对外访问,通过任意 Node 节点可访问对应的资源,这意味着每个端口只能使用一次,一个端口对应一个应用。

实际场景中,业务是通过域名访问的,根据不同的域名跳转到不同端口服务。

**ingress 和 Pod 的关系**

pod 和 ingress 通过 service 进行关联,ingress 作为统一入口,由 service 关联一组 Pod。

ingress 工作流程
ingress 工作流程

ingress 由两部分组成:

  • ingress controller:将新加入的 Ingress 转化成 Nginx 的配置文件并使之生效
  • ingress 服务:将 Nginx 的配置抽象成一个 Ingress 对象,每添加一个新的服务只需写一个新的 Ingress 的 yaml 文件即可

ingress controller 目前主要有两种:

  • 基于 nginx 服务的 ingress controller
  • 基于 traefik 的 ingress controlle

基于 nginx 服务的 ingress controller 根据不同的开发公司,又分为 k8s 社区的 ingres-nginx 和 nginx 公司的 nginx-ingress。

# k8s社区提供的ingress

https://github.com/kubernetes/ingress-nginx

# nginx社区提供的ingress

https://github.com/nginxinc/kubernetes-ingress

ingress 的工作原理

  1. ingress controller 通过与 k8s api 进行交互,动态感知 k8s 集群中 ingress 服务规则的变化,然后读取它,并按照定义的 ingress 规则,转发到 k8s 集群中对应的 service。
  2. ingress 规则写明了哪个域名对应 k8s 集群中的哪个 service,然后再根据 ingress-controller 中的 nginx 配置模板,生成一段对应的 nginx 配置。
  3. 然后再把该配置动态的写到 ingress-controller 的 pod 里,该 ingress-controller 的 pod 里面运行着一个 nginx 服务,控制器会把生成的 nginx 配置写入到 nginx 的配置文件中,然后 reload 一下,使其配置生效, 以此来达到域名配置及动态更新的效果。

ingress 的优势

  • 动态配置服务
  • 减少不必要的端口暴露

部署 ingress-nginx (deployment)

准备配置文件

#https://github.com/kubernetes/ingress-nginx/blob/nginx-0.30.0/deploy/static/mandatory.yaml

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml

#https://github.com/kubernetes/ingress-nginx/blob/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

调整配置文件

因为 ingress-controller 的 pod 需要使用node 节点的 80/443端口,所以网络需要配置为 hostNetwork 模式。

sed -i '/nodeSelector:/i\      hostNetwork: true' mandatory.yaml

由于镜像在 quay.io,所有需要替换国内可以访问的镜像地址。

sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/' mandatory.yaml

创建相关资源

kubectl apply -f mandatory.yaml

kubectl apply -f service-nodeport.yaml

绑定 node 节点 (可选)

目前 ingress-controller 会被调度器分配到某一个节点,如果需要指定一台独立的 node 节点运行 ingress-controller,就需要 node 节点打标签。

# 获取节点标签

kubectl get nodes --show-labels

# 给指定的节点打标签

kubectl label nodes 节点\_IP nginx=nginx

调整 deployment 中节点选择器的标签

-w1029
-w1029

更新配置

kubectl apply -f mandatory.yaml

检查

kubectl get pods -n ingress-nginx

NAME                                        READY   STATUS    RESTARTS   AGE

nginx-ingress-controller-56bcc7fc88-v6c8f   1/1     Running   0          77m

创建 ingress 规则

首先先创建一个 nginx 应用并且对外暴露端口(nodeport)

# 创建

kubectl create deployment web --image=nginx

# 检查

kubectl get pods
# 创建

kubectl expose deployment web --port=80 --target-port=80 --type=NodePort

# 检查

kubectl get svc

然后创建 nginx 规则:

apiVersion: networking.k8s.io/v1beta1

kind: Ingress

metadata:

  name: traffic-route

spec: 

  rules:

    - host: example.ingressdemo.com

      http:

        paths:

          - path: /

            backend:

              serviceName: web

              servicePort: 80
➜  ~ kubectl apply -f ingress-http.yaml    

ingress.extensions/traffic-router created

➜  ~ kubectl get pods -n ingress-nginx -o wide

➜  ~ kubectl get ingress [-o yaml]

配置 host 并验证 (略)

部署 ingress(DaemonSet 的方式)

https://raw.githubusercontent.com/Simontage/k8s/main/ingress-nginx-demo/ingress-nginx-daemonset.yaml

官方原始文件使用的是 deployment,replicate 为 1,这样将会在某一台节点上启动对应的 nginx-ingress-controller pod。外部流量访问至该节点,由该节点负载分担至内部的 service。测试环境考虑防止单点故障,改为 DaemonSet 然后删掉 replicate ,配合亲和性部署在指定节点上启动 nginx-ingress-controller pod,确保有多个节点启动 nginx-ingress-controller pod,后续将这些节点加入到外部硬件负载均衡组实现高可用性。

1)添加 hostNetwork

true:添加该字段,暴露 nginx-ingress-controller pod 的服务端口(80)

2)添加亲和性属性

增加亲和性部署,有 custom/ingress-controller-ready 标签的节点才会部署该 DaemonSet

3)设置节点的 label

kubectl label nodes 节点\_IP custom/ingress-controller-ready=true

kubectl label nodes 节点\_IP custom/ingress-controller-ready=true

kubectl label nodes 节点\_IP custom/ingress-controller-ready=true

4) 修改 yaml 文件

参考链接

https://www.jianshu.com/p/52889bc8571d

https://blog.csdn.net/weixin_44729138/article/details/105978555

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ingress 的工作原理
  • ingress 的优势
  • 部署 ingress-nginx (deployment)
    • 准备配置文件
      • 调整配置文件
        • 创建相关资源
          • 绑定 node 节点 (可选)
            • 检查
              • 创建 ingress 规则
                • 配置 host 并验证 (略)
                • 部署 ingress(DaemonSet 的方式)
                • 参考链接
                相关产品与服务
                容器服务
                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档