Kubernetes Ingress API 对象

Ingress 它是什么

如何暴露您Kubernetes集群内部 "应用服务" 并向外(互联网)提供访问服务!!!

  • 通常情况下集群内部Service和Pod仅可在集群内部网络中通过IP地址访问。所有到达边界路由器的流量或被丢弃或被转发到其它地方。(Ingress 的存在即是完成以上之目的)
  • 不直接使用Ingress资源,也可有多种方法暴露Service。
    • 使用 Service.Type=LoadBalancer
    • 使用 Service.Type=NodePort
    • 有几个是废弃的
  • 未定义Ingress的情况下,外部请求访问内部服务时可能这样
Internet ---------> Service
  • 定义Ingress授权请求服务入站连接到达集群的规访问则可能这样
Internet ------> Ingress ------> Service

Ingress 它能做什么

  • 可以将 Ingress 配置为提供服务外部可访问的 URL、负载均衡流量、终止 SSL / TLS 并提供基于名称的虚拟主机。Ingress 控制器通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。
  • Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePort 或者 Service.Type=LoadBalancer 类型的服务,典型的访问方式是 "HTTP"。
  • 先决条件:
    • 您必须具有 ingress 控制器才能满足 Ingress 的要求。仅创建 Ingress 资源无效,比如ingress-nginx。
    • 一定要检查一下控制器的 beta 限制。 在 GCE/GKE 之外的环境中,需要将控制器部署 为 Pod。
  • 默认后段:
    • 如果没有主机或路径与 Ingress 对象中的 HTTP 请求匹配,则流量将路由到您的默认后端。
    • 默认后端通常是 Ingress 控制器的配置选项,并且未在 Ingress 资源中指定。
    • 更多更详细的Ingress描述及使用方法 参考中文官方 Ingress 文档

Ingress 控制器

  • 想让Ingress资源工作您单独部署个Ingress没有用,您得部署一个Ingress Controller来实现Ingress。
  • 与作为 kube-controller-manager 可执行文件的一部分运行的其他类型的控制器不同,Ingress 控制器不是随集群自动启动的。 基于此页面,您可选择最适合您的集群的 Ingress 控制器实现。
  • Kubernetes 作为一个项目,目前支持和维护 GCE 和 nginx 控制器。
  • 您可以在集群中部署和使用多个 Ingress 控制器,创建Ingress时使用 "ingress.class" 进行注释。
  • 更多更详细的控制器使用可 参考中文官方 Ingress controller 描述

多个Ingress控制器并存的示例
多个控制器切换使用,修改红色字体即可

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  tls:
  - secretName: tls-secret
  backend:
    serviceName: echoheaders-https
    servicePort: 80

haproxy-ingress参考 haproxy-ingress in github

在使用kubeadm工具部署的集群下部署Ingress-nginx

  • Github站点:
https://github.com/kubernetes/ingress-nginx
https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md
  • Kubernetes站点:
https://kubernetes.github.io/ingress-nginx/
https://kubernetes.github.io/ingress-nginx/deploy/
  • 命令帮助
    rules:规则的对象列表,谁调度到谁那里去(路径调度、主机调度)
    backend:调度到后端相关pod资源,关联后段Pod,serviceName、servicePort
[[email protected] ~]# kubectl explain ingress.spec
[[email protected] ~]# kubectl explain ingress.spec.rules
  • 下载安装nginx-ingress-controller
    需提前下载镜像到本地,或者改用阿里云镜像
[[email protected] ingress]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/mandatory.yaml
[[email protected] ingress]# kubectl apply -f mandatory.yaml
[[email protected] ingress]# kubectl get pods -n ingress-nginx
NAME                                       READY   STATUS    RESTARTS   AGE
nginx-ingress-controller-948ffd8cc-9nd4c   1/1     Running   0          10m
[[email protected] ingress]#
[[email protected] ingress]# kubectl describe pods -n ingress-nginx
  • 创建一个Pod类型为NodePort的service用来接入互联网请求
    修改yaml文件可添加nodePort来指定端口,这里采用默认
[[email protected] ingress]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/provider/baremetal/service-nodeport.yaml
[[email protected] ingress]# kubectl apply -f service-nodeport.yaml
service/ingress-nginx created
[[email protected] ingress]#
[[email protected] ingress]# kubectl get svc -n ingress-nginx
NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   NodePort   10.99.146.223   <none>        80:32116/TCP,443:30771/TCP   17s
[[email protected] ingress]# 
  • 通过互联网测试访问,看nginx的调度器是否配置成功
    任意集群地址访问
[[email protected] ingress]# curl 172.12.0.10:32116
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.17.7</center>
</body>
</html>
[[email protected] ingress]# 

Nginx调度器本身调度已经可以正常工作了!!!
Nginx调度器本身调度已经可以正常工作了!!!
Nginx调度器本身调度已经可以正常工作了!!!
接下来就可以手动部署个应用,并通过nginx的调度器发布出去

手动部署tomcat应用服务,通过nginx调度器发布出去

  • NodePort类型的Tomcat创建
    把资源都写在一个yaml文件内,使用三条横线进行分割
[[email protected] pod]# cat tomcat-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
  name: tomcat
  namespace: default
spec:
  selector:
    app: tomcat
    release: canary
  type: NodePort
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 30080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-demo
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tomcat
      release: canary
  template:
    metadata:
      labels:
        app: tomcat
        release: canary
    spec:
      containers:
      - name: tomcat
        image: tomcat
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 8080
        - name: ajp
          containerPort: 8009
[[email protected] pod]# 

直接使用集群内部任意IP地址加30080端口进行访问即可。

  • 通过Ingress形式发布Tomcat至外部
    提前下载好tomcat镜像到本地,service资源和deploy资源写在一个yaml文件内
[[email protected] pod]# cat deploy-svc-tomcat.yaml
apiVersion: v1
kind: Service
metadata:
  name: tomcat
spec:
  selector:
    app: tomcat
    release: canary
  ports:
  - name: http
    targetPort: 8080
    port: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tomcat
      release: canary
  template:
    metadata:
      labels:
        app: tomcat
        release: canary
    spec:
      containers:
      - name: tomcat8
        image: tomcat
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 8080
[[email protected] pod]# 

创建完成后,接下来就可以为刚刚部署的tomcat制作一个ingress服务了

  • 为ingress类型的tomcat创建ingress服务
    您也可以创建带ssl认证证书类型的tomcat服务,只需要购买ssl证书或只为了测试自建证书也可
[[email protected] pod]# cat tomcat-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-tomcat
  namespace: default
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: tomcat.siyou.com
    http:
      paths:
      - path:
        backend:
          serviceName: tomcat
          servicePort: 8080
[[email protected] pod]# 

测试吧。配置好"tomcat.siyou.com"的解析,访问的时候通过ingress调度器映射出去的端口访问即可

  • 为了测试会用到的相关命令
    kubectl 的相关资源使用帮助 # kubectl explain pods or kubectl explain pods.spec
# 获取默认空间下的pods资源详情
[[email protected] pod]# kubectl get pods -o wide
# 描述默认空间下某个pods资源
[[email protected] pod]# kubectl describe pods tomcat-demo-655c78c49-ctd66
# 查看某个tomcat的日志,实时查看
[[email protected] pod]# kubectl logs tomcat-demo-655c78c49-ctd66 -f
# 查看默认空间下tomcat应用端口监听状态
[[email protected] pod]# kubectl exec tomcat-demo-655c78c49-ctd66 -- ss -tnl
# 进入到一个tomcat内部
[[email protected] pod]# kubectl exec -it tomcat-demo-655c78c49-ctd66 -- /bin/sh
# 查看默认名称空间下的service详情
[[email protected] pod]# kubectl get svc -o wide
# 获取名称空间为ingress-nginx下的pod资源情况
[[email protected] pod]# kubectl get pods -n ingress-nginx
# 查看ingress-nginx空间下pod详情
[[email protected] pod]# kubectl describe pods -n ingress-nginx nginx-ingress-controller-948ffd8cc-9nd4c
# 查看默认名称空间下的ingress
[[email protected] pod]# kubectl get ingress

更多 kubectl 命令的使用,"kubectl --help" 或者官方文档 k8s kubectl overview

原文地址:https://blog.51cto.com/51eat/2475768

时间: 2024-07-31 10:04:10

Kubernetes Ingress API 对象的相关文章

Kubernetes之核?技术概念和API对象

目录 Kubernetes之核?技术概念和API对象 Pod 副本控制器(Replication Controller,RC) 副本集(Replica Set,RS) 部署(Deployment) 服务(Service) 任务(Job) 后台?撑服务集(DaemonSet) 有状态服务集(StatefulSet) 存储卷(Volume) 持久存储卷(Persistent Volume,PV)和持久存储生命(Persistent Volume Claim,PVC) 节点(Node) 密钥对象(Se

Kubernetes Ingress Controller的使用及高可用落地

Kubernetes Ingress Controller的使用及高可用落地 看懂本文要具备一下知识点: Service实现原理和会应用 知道反向代理原理,了解nginx和apache的vhost概念 了解service的几种类型(Nodeport.clusterip.LB) 四层和七层区别(不明白就这样去理解,七层最常见就是应用层的http,也就是url,四层是传输层,为tcp/udp端口) 域名解析,/etc/hosts等基础知识 Ingress Controller介绍 Ingress C

(八)Kubernetes Ingress资源

前言 Kubernetes提供了两种内建的云端负载均衡机制(cloud load balancing)用于发布公共应用,一种是工作于传输层的Service资源,它实现的是“TCP负载均衡器”,另一种是Ingress资源,它实现的是“HTTP(S)负载均衡器”. TCP负载均衡器 无论是iptables还是ipvs模型的Service资源都配置于Linux内核中的Netfilter之上进行四层调度,是一种类型更为通用的调度器,支持调度HTTP.MySQL等应用层服务.不过,也正是由于工作于传输层从

TF+K8s轻松上手丨通过Kubernetes Ingress进行高级外部应用程序连接

本文所有相关链接pdf:https://tungstenfabric.org.cn/assets/uploads/files/tf-ceg-case-2.pdf Kubernetes的Ingress文档页面将其描述为: "用于管理对集群中服务的外部访问的API对象,通常是HTTP.Ingress可以提供负载均衡.SSL终结和基于名称的虚拟主机." CNI不提供Ingress功能.这意味着Kubernetes集群管理者通常要为其集群安装.管理和支持单独的Ingress控制器解决方案. 对

深入了解Kubernetes REST API的工作方式

关于Kubernetes REST API的工作方式: 在哪里以及如何定义从REST路径到处理REST调用的函数的映射? 与etcd的交互发生在哪里? 从客户端发出请求到保存在etcd中对象的端到端路径是怎样的?Kubernetes REST框架 Kubernetes REST实现可大致分为三个部分,如下图所示. 客户端/服务器功能通过k8s.io包中的各种库实现.服务器端实现分布在多个包中. 服务器端的根目录包是apiserver, 其包含有endpoints,server,registry和

kubernetes ingress(一) 简介

背景: kubernetes集群内部有三种方式暴露服务:nodeport,loadbalancer,ingress,其中loadbalancer需要云厂商提供对应公网负载均衡,维护成本,费用高. 采用nodeport这种方式的弊端: 1.开通过多端口,对主机安全性存在一定风险(内网环境,问题不大),多端口的管理过于复杂,混乱 2.nginx upstream配置nodeport,当后端服务出现异常,探针未及时检测到时,有可能因为nginx 的健康检测机制,导致所有服务都被摘除. 对于ingres

Kubernetes Ingress with AWS ALB Ingress Controller

Kubernetes Ingress with AWS ALB Ingress Controller by Nishi Davidson | on 20 NOV 2018 | in Amazon Elastic Kubernetes Service, Open Source | Permalink | Comments | Share 中文版 – Kubernetes Ingress is an api object that allows you manage external (or) in

java:Hibernate框架(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态)

1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件  准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configurati

kubernetes Ingress 之 Traefik

关于traefik 参考之前写的一篇文档:https://blog.51cto.com/michaelkang/1918192 版本介绍 traefik:v1.7 k8s:v1.15.1 Ingress Ingress是自kubernetes1.1版本后引入的资源类型.必须要部署Ingress controller才能创建Ingress资源,Ingress controller是以一种插件的形式提供. 使用 Ingress 时一般会有三个组件: 反向代理负载均衡器 Ingress Control