五分钟k8s实战-使用Ingress

2023-09-15 08:08:10

cfceeb371b86371b8e2236560f6fe5e5.png

ingress.png

背景

前两章中我们将应用部署到了 k8s 中,同时不同的服务之间也可以通过 service 进行调用,现在还有一个步骤就是将我们的应用暴露到公网,并提供域名的访问。

这一步类似于我们以前配置 Nginx 和绑定域名,提供这个能力的服务在 k8s 中成为 Ingress。

通过这个描述其实也能看出 Ingress 是偏运维的工作,但也不妨碍我们作为研发去了解这部分的内容;了解整个系统是如何运转的也是研发应该掌握的技能。

安装 Ingress 控制器

在正式使用 Ingress 之前需要给 k8s 安装一个 Ingress 控制器,我们这里安装官方提供的 Ingress-nginx 控制器。

当然还有社区或者企业提供的各种控制器:e3d4bb0462cf7eacfb404313bf37bde8.png

有两种安装方式: helm 或者是直接 apply 一个资源文件。

关于 helm 我们会在后面的章节单独讲解。

这里就直接使用资源文件安装即可,我已经上传到 GitHub 可以在这里访问:https://github.com/crossoverJie/k8s-combat/blob/main/deployment/ingress-nginx.yaml

其实这个文件也是直接从官方提供的复制过来的,也可以直接使用这个路径进行安装:

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

yaml 文件的内容是一样的。

不过要注意安装之后可能容器状态一直处于 Pending 状态,查看容器的事件时会发现镜像拉取失败。

k describe pod ingress-nginx-controller-7cdfb9988c-lbcst -n ingress-nginx

describe 是一个用于查看 k8s 对象详细信息的命令。

在刚才那份 yaml 文件中可以看到有几个镜像需要拉取,我们可以先在本地手动拉取镜像:99ea8ea2cff129eaf9fa46c3707e1dd8.png

docker pull registry.k8s.io/ingress-nginx/controller:v1.8.2

如果依然无法拉取,可以尝试配置几个国内镜像源镜像拉取:

1db2079e91f0680f0adec119dfc55704.png
image.png

我这里使用的 docker-desktop 自带的 k8s,推荐读者朋友也使用这个工具。

创建 Ingress

使用刚才的 yaml 安装成功之后会在 ingress-nginx 命名空间下创建一个 Pod,通过 get 命令查看状态为 Running 即为安装成功。

$ k get pod -n ingress-nginx
NAME                            READY   STATUS    RESTARTS      AGE
ingress-nginx-controller-7cdf   1/1     Running   2 (35h ago)   3d

Namespace 也是 k8s 内置的一个对象,可以简单理解为对资源进行分组管理,我们通常可以使用它来区分各个不同的环境,比如 dev/test/prod 等,不同命名空间下的资源不会互相干扰,且相互独立。

之后便可以创建 Ingress 资源了:

apiVersion: networking.k8s.io/v1  
kind: Ingress  
metadata:  
  name: k8s-combat-ingress  
spec:  
  ingressClassName: nginx  
  rules:  
    - host: www.service1.io  
      http:  
        paths:  
          - backend:  
              service:  
                name: k8s-combat-service  
                port:  
                  number: 8081  
            path: /  
            pathType: Prefix  
    - host: www.service2.io  
      http:  
        paths:  
          - backend:  
              service:  
                name: k8s-combat-service-2  
                port:  
                  number: 8081  
            path: /  
            pathType: Prefix

看这个内容也很容易理解,创建了一个 Ingress 的对象,其中的重点就是这里的规则是如何定义的。

在 k8s 中今后还会接触到各种不同的 Kind

这里的 ingressClassName: nginx   也是在刚开始安装的控制器里定义的名字,由这个资源定义。

apiVersion: networking.k8s.io/v1  
kind: IngressClass  
metadata:  
  labels:  
    app.kubernetes.io/component: controller  
    app.kubernetes.io/instance: ingress-nginx  
    app.kubernetes.io/name: ingress-nginx  
    app.kubernetes.io/part-of: ingress-nginx  
    app.kubernetes.io/version: 1.8.2  
  name: nginx

咱们这个规则很简单,就是将两个不同的域名路由到两个不同的 service。

这里为了方便测试又创建了一个 k8s-combat-service-2 的 service,和 k8s-combat-service 是一样的,只是改了个名字而已。

测试

也是为了方便测试,我在应用镜像中新增了一个接口,用于返回当前 Pod 的 hostname。

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {  
   name, _ := os.Hostname()  
   fmt.Fprint(w, name)  
})

由于我实际并没有 www.service1.io/www.service2.io 这两个域名,所以只能在本地配置 host 进行模拟。

10.0.0.37 www.service1.io
10.0.0.37 www.service2.io

我测试所使用的 k8s 部署在我家里一台限制的 Mac 上,所以这里的 IP 它的地址。

当我们反复请求两次这个接口,会拿到两个不同的 hostname,也就是将我们的请求轮训负载到了这两个 service 所代理的两个 Pod 中。

❯ curl http://www.service1.io/
k8s-combat-service-79c5579587-b6nlj%
❯ curl http://www.service1.io/
k8s-combat-service-79c5579587-bk7nw%
❯ curl http://www.service2.io/
k8s-combat-service-2-7bbf56b4d9-dkj9b%
❯ curl http://www.service2.io/
k8s-combat-service-2-7bbf56b4d9-t5l4g

我们也可以直接使用 describe 查看我们的 ingress 定义以及路由规则:b48731e1365b4bb43a524a47f0cf4263.png

$ k describe ingress k8s-combat-ingress
Name:             k8s-combat-ingress
Labels:           <none>
Namespace:        default
Address:          localhost
Ingress Class:    nginx
Default backend:  <default>
Rules:
  Host             Path  Backends
  ----             ----  --------
  www.service1.io
                   /   k8s-combat-service:8081 (10.1.0.65:8081,10.1.0.67:8081)
  www.service2.io
                   /   k8s-combat-service-2:8081 (10.1.0.63:8081,10.1.0.64:8081)
Annotations:       <none>
Events:            <none>

如果我们手动新增一个域名解析:

10.0.0.37 www.service3.io
❯ curl http://www.service3.io/
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

会直接 404,这是因为没有找到这个域名的规则。

访问原理

2f0ae770aaa827168ca191be15cf6ac8.png整个的请求路径如上图所示,其实我们的 Ingress 本质上也是一个 service(所以它也可以启动多个副本来进行负载),只是他的类型是 LoadBalancer,通常这种类型的 service 会由云厂商绑定一个外部 IP,这样就可以通过这个外部 IP 访问 Ingress 了。

而我们应用的 service 是 ClusterIP,只能在应用内部访问

f5affa99eed7364c10f80bc2f497a4e8.png
image.png

通过 service 的信息也可以看到,我们 ingress 的 service 绑定的外部 IP 是 localhost(本地的原因)

总结

Ingress 通常是充当网关的作用,后续我们在使用 Istio 时,也可以使用 Istio 所提供的控制器来替换掉 Ingress-nginx,可以更方便的管理内外网流量。

本文的所有源码在这里可以访问:https://github.com/crossoverJie/k8s-combat

往期推荐

k8s入门到实战--跨服务调用

k8s 入门到实战--部署应用到 k8s

使用 SQL 的方式查询消息队列数据以及踩坑指南

VictoriaLogs:一款超低占用的 ElasticSearch 替代方案

新手如何快速参与开源项目

50bc215dbd90f9fd6e4b19c8694ecda0.gif

点分享

b563fd37d6debb48fa5c3d9738b52d7f.gif

点收藏

6a774f0c46ef4fb3fd59de76aa2c55dd.gif

点点赞

adca30785dd2493609c40a6f66660874.gif

点在看

更多推荐

《计算机视觉中的多视图几何》笔记(1)

1Introduction–aTourofMultipleViewGeometry本章介绍了本书的主要思想。1.1Introduction–theubiquitousprojectivegeometry为了了解为什么我们需要射影几何,我们从熟悉的欧几里得几何开始。欧几里得几何在二维中认为平行线是不会相交的,解决这个问题

【Linux网络编程】日志与守护进程

日志是网络服务器程序在后台以守护进程的形式运行时,处理情况的描述被打印到了日志文件里面,方便维护人员查看。1.前台进程与后台进程左边会话输入命令sleep10000&代表进程后台运行,右边会话输入命令sleep20000可以看到命令行解释器直接卡住了。STATS+就是前台进程的意思,STATS就是后台进程。可以看到后台

自动化控制系统的设计重点是什么?

要实现对选择性激光烧结系统预热温度的控制,需要找到合理的控制对象模型,但选择性激光烧结设备的预热温度场是一个复杂的非线性系统,很难找到合理的控制对象模型来实现预热温度场的温度控制。模糊控制不需要具体的控制模型,预热温度场的温度控制只能通过模糊推理来实现。模糊控制技术是现代控制理论中基于语言规则和模糊推理的先进控制策略和

狂神docker

狂神说docker参考文章-----docker概述docker为什么会出现?–环境部署麻烦,两套环境(开发-运维)我的电脑可以运行,到你那就不可用。开发即运维–开发打包部署上线一条龙环境配置十分麻烦,机器部署耗时间(redis,eshadoop费时费力)发布项目时,带上环境—引出docker–开发打包部署上线,一套流

ETL增量抽取模式实践与调优

在ETL(Extract,Transform,Load)流程中,增量抽取是一种重要的数据提取方式,允许从源系统中仅提取发生变化的数据,以提高处理效率和减少资源消耗。增量抽取模式有多种实现方式,包括时间戳增量、增量标记和增量查询。本文以ETLCloud为例,对这三种增量抽取模式进行深入研究,探讨它们的实践应用、调优技巧和

Centos7原生hadoop环境,搭建Impala集群和负载均衡配置

Centos7原生hadoop环境,搭建Impala集群和负载均衡配置impala介绍Impala集群包含一个CatalogServer(Catalogd)、一个StatestoreServer(Statestored)和若干个ImpalaDaemon(Impalad)。Catalogd主要负责元数据的获取和DDL的执

【K8S系列】深入解析K8S监控

序言做一件事并不难,难的是在于坚持。坚持一下也不难,难的是坚持到底。文章标记颜色说明:黄色:重要标题红色:用来标记结论绿色:用来标记论点蓝色:用来标记论点Kubernetes(k8s)是一个容器编排平台,允许在容器中运行应用程序和服务。今天学习一下k8s监控相关知识希望这篇文章能让你不仅有一定的收获,而且可以愉快的学习

剖析 Kubernetes 控制器:Deployment、ReplicaSet 和 StatefulSet 的功能与应用场景

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

【云原生】kubernetes关于存储(Volume)

目录1卷Volume2卷的类型3使用方式4常见类型5PV&PVC1卷Volume官网地址:卷|KubernetesContainer中的文件在磁盘上是临时存放的,这给Container中运行的较重要的应用程序带来一些问题。问题之一是当容器崩溃时文件丢失。kubelet会重新启动容器,但容器会以干净的状态重启。第二个问题

云原生之深入解析如何使用Devtron简化K8S应用开发

一、NeuVector简介①什么是NeuVector?NeuVector是业界首个端到端的开源容器安全平台,唯一为容器化工作负载提供企业级零信任安全的解决方案。NeuVector是业界领先的安全和合规解决方案,已被全球知名企业广泛采用;其代码库的开源不仅使NeuVector成为开源社区的首选技术,还为受严格监管的客户(

文举论金:黄金原油全面走势分析策略指导。

市场没有绝对,涨跌没有定势,所以,对市场行情的涨跌平衡判断就是你的制胜法宝。欲望!有句意大利谚语:让金钱成为我们忠心耿耿的仆人,否则,它就会成为一个专横跋扈的主人。空头,多头都能赚钱,唯有贪心不能赚。是你掌控欲望还是欲望掌控你?古人云:不积硅步无以至千里,不积小流无以成江海。希望这句话成为我们之间的共勉。自知!人贵自知

热文推荐