千家信息网

Kubernetes中Ingress介绍

发表于:2025-02-19 作者:千家信息网编辑
千家信息网最后更新 2025年02月19日,如何暴露您Kubernetes集群内部 "应用服务" 并向外(互联网)提供访问服务!!!通常情况下集群内部Service和Pod仅可在集群内部网络中通过IP地址访问。所有到达边界路由器的流量或被丢弃或
千家信息网最后更新 2025年02月19日Kubernetes中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/v1beta1kind: Ingressmetadata:  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-nginxhttps://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
[root@node1 ~]# kubectl explain ingress.spec[root@node1 ~]# kubectl explain ingress.spec.rules
  • 下载安装nginx-ingress-controller
    需提前下载镜像到本地,或者改用阿里云镜像
[root@node1 ingress]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/mandatory.yaml[root@node1 ingress]# kubectl apply -f mandatory.yaml[root@node1 ingress]# kubectl get pods -n ingress-nginxNAME                                       READY   STATUS    RESTARTS   AGEnginx-ingress-controller-948ffd8cc-9nd4c   1/1     Running   0          10m[root@node1 ingress]# [root@node1 ingress]# kubectl describe pods -n ingress-nginx
  • 创建一个Pod类型为NodePort的service用来接入互联网请求
    修改yaml文件可添加nodePort来指定端口,这里采用默认
[root@node1 ingress]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/provider/baremetal/service-nodeport.yaml[root@node1 ingress]# kubectl apply -f service-nodeport.yaml service/ingress-nginx created[root@node1 ingress]# [root@node1 ingress]# kubectl get svc -n ingress-nginxNAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGEingress-nginx   NodePort   10.99.146.223           80:32116/TCP,443:30771/TCP   17s[root@node1 ingress]# 
  • 通过互联网测试访问,看nginx的调度器是否配置成功
    任意集群地址访问
[root@node1 ingress]# curl 172.12.0.10:32116404 Not Found

404 Not Found


nginx/1.17.7
[root@node1 ingress]#

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

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

  • NodePort类型的Tomcat创建
    把资源都写在一个yaml文件内,使用三条横线进行分割
[root@node1 pod]# cat tomcat-nodeport.yaml apiVersion: v1kind: Servicemetadata:  name: tomcat  namespace: defaultspec:  selector:     app: tomcat    release: canary  type: NodePort  ports:  - port: 8080    targetPort: 8080    nodePort: 30080---apiVersion: apps/v1kind: Deploymentmetadata:  name: tomcat-demo  namespace: defaultspec:  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[root@node1 pod]# 

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

  • 通过Ingress形式发布Tomcat至外部
    提前下载好tomcat镜像到本地,service资源和deploy资源写在一个yaml文件内
[root@node1 pod]# cat deploy-svc-tomcat.yaml apiVersion: v1kind: Servicemetadata:  name: tomcatspec:  selector:    app: tomcat    release: canary  ports:  - name: http    targetPort: 8080    port: 8080---apiVersion: apps/v1kind: Deploymentmetadata:  name: tomcat-demospec:  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[root@node1 pod]# 

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

  • 为ingress类型的tomcat创建ingress服务
    您也可以创建带ssl认证证书类型的tomcat服务,只需要购买ssl证书或只为了测试自建证书也可
[root@node1 pod]# cat tomcat-ingress.yaml apiVersion: extensions/v1beta1kind: Ingressmetadata:  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[root@node1 pod]# 

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

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


控制器 控制 调度 资源 服务 集群 空间 类型 端口 配置 名称 文件 流量 工作 应用 测试 主机 互联网 命令 地址 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 python字典保存到数据库 无锡品牌软件开发活动简介 嵌入式搞软件开发吗 网络安全技术的现状 吉林通信软件开发服务品质保障 购买图书数据库是无形资产 人渣租服务器最新教程 打捞服务器 手机 数据库 工具有哪些 数据库数据统计分析图表 网络安全推动世界多极化发展 服务器电源驱动怎么安装 手机怎么给卡添加服务器 云南ai边缘计算服务器虚拟主机 内网linux服务器设置域名 qt数据库怎么添加变量 郑州市网络安全教育直播 剑网三电五双梦是哪个服务器 厦门大合网络技术晨胜 数据库in么使用 士官网络安全 互联网科技创新素质教育绘画 企业数据管理硬盘服务器群晖 如何将聊天记录同步至服务器 网络安全有趣的图片 三星平板连接数据服务器异常 sql数据库无日志不能附加 重庆财经学院有软件开发专业吗 水晶石效果图软件开发 国内常用四大医学数据库
0