转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。

第一章:Docker与k8s的恩怨情仇(一)—成为PaaS前浪的Cloud Foundry

第二章:Docker与k8s的恩怨情仇(二)—用最简单的技术实现“容器”

第三章:Docker与k8s的恩怨情仇(三)—后浪Docker来势汹汹

第四章:Docker与k8s的恩怨情仇(四)-云原生时代的闭源落幕

第五章:Docker与k8s的恩怨情仇(五)——Kubernetes的创新

第六章:Docker与k8s的恩怨情仇(六)—— “容器编排”上演“终结者”大片

在上节中我们介绍了活字格公有云版在k8s上部署,以及如何实现容器之间的编排与管理控制。为了进一步实现内外交互调用,则需要实现服务发现的功能。也就是我们前面提到“人与狗”之间的关系。

做过微服务的同学可能了解过什么叫服务发现,spring cloud项目中的Eureka框架就是完成这个功能的,其主要工作就是注册内部的服务,以供其他集群的服务可以调用、访问这个服务。

我们合理猜测Kubernetes的存在很有可能激发了各种微服务框架产生服务发现机制。

在Kubernetes中服务发现对应的模块是Service与Ingress,接下来,我们分别来说说这两个功能。

Service与Ingress

Service类似于服务的注册功能。

其逻辑很简单,在kubernetes声明一个服务,从而生成一个VIP(虚拟网络),所有Kubernetes集群中的其他组件,都可以通过这个VIP来访问这个服务,并且这个服务是不会随Service的改变而改变的,只要创建就是终生存在。

Service

而服务的内容是什么呢?这部分和上述的Deployment一样,是通过selector选择器确定的。我们可以通过下述yaml来创建一个服务:

apiVersion: v1

kind: Service

metadata:

  name: hostnames

spec:

  selector:

    app: hostnames

  ports:

  - name: default

    protocol: TCP

    port: 80

    targetPort: 9376

通过上一篇的介绍,我们可以了解这个服务所需要代理的内容是app==hostnames的Pod。同时这里也有一个新的字段ports,这个字段是说明该代理的服务的请求方式(protocol)、对外暴露的端口(port)、内部的端口(targetPort)分别是什么。

我们可以通过这个sample-service.yaml的文件创建一个Service并且查看一个Service:


# 创建 kubectl apply -f sample-service.yaml   # 查看 kubectl get services hostnames

在这个service中存在一个ClusterIP,这个IP就是这个Service生成的VIP,在集群内部的其他成员,都可以通过这个VIP来访问这个Service。但是由于我们现在没有任何的具体服务让这个Service代理,因此现在请求这个IP是不会成功的。

那么,我们需要为这个Service创建一个具体实现:以下的sample-deployment.yaml文件是创建一个多副本的Pod,其Pod的功能是返回自己的podname:


apiVersion: apps/v1 kind: Deployment metadata:   name: hostnames spec:   selector:     matchLabels:       app: hostnames   replicas: 3   template:     metadata:       labels:         app: hostnames     spec:       containers:       - name: hostnames         image: k8s.gcr.io/serve_hostname         ports:         - containerPort: 9376           protocol: TCP ~

在这段代码中,我们把容器的9376端口暴露的出来,因为这个Pod是通过这个端口与外部通行的。同样我们执行以下命令创建和查看这个pod副本:

# 创建

kubectl apply -f sample-deployment.yaml

 

# 查看

kubectl get pods -l app=hostnames

在这部分内容中可以看到这个pod副本已经创建成功了。此时,根据我上一节所说的控制器模式,Service也有对应的处理Service的控制器,其内部发现了有满足app==hostnames的服务,即将这个服务和Service进行了绑定 。此时,我们就可以通过任意一台集群内的主机来请求刚才上文中的ClusterIP:

在这一部分可以看到,我们进行了很多次请求,但是每次返回的结果都不同,这是因为Service在其内部通过网络插件(CNI)做了负载均衡处理,所以我们可以通过Service来实现的负载均衡功能。

学习过程中的“误入歧路”

在学习了解这部分内容的时候,我一直有一个误解:认为Service是必须对应Deployment这种Pod的编排控制器对象才能工作的,所以把Service --> Deployment --> Pods这条逻辑关系熟记于心,但这种理解其实是错误的。

在Kubernetes中,每个功能组件各司其职,他们只会处理自己该做的事,比如这里,Service绑定Pod所依赖的是选择器中的app==hostnames,而这个定义是出现在Deployment中定义在Pod中的,因此Service和Deployment完全没有关系,它们俩谁也不认识谁,关系可以用下图来描述:

并且,在之前的学习中还错误地认为负载均衡服务是由Deployment提供的,其实这个功能是Service中的网络插件来处理的,并且用户同样也可以自定义使用的网络查件或者负载均衡算法是什么,Kubernetes给了用户足够大的自由度。

Ingress

有了Service之后,我们的服务就可以在集群中随意访问达到服务之间的交流关系了, 但是要想让我们的服务让最终的用户访问到,我们还需要最后一个组件Ingress。

Ingress是Kubernetes中的反向代理服务,它可以解析配置的域名指向到我们内部的Service中,其定义可以通过下述的yaml来实现:

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

  name: sample-ingress

spec:

  rules:

  - host: hostname.sample.com

    http:

      paths:

      - path: /

        backend:

          serviceName: hostnames

          servicePort: 80

上述代码中,我们将hostname.sample.com这个域名指向了刚才定义的hostnames这个Service。通过这样的操作,我们的服务便就可以通过定义域名配置供外部的服务进行访问了。而Ingress的创建命令,也和前面所说的一样:

kubectl apply -f sample-ingress.yaml

有了这部分配置,我们的功能原则上就能够让外部访问了。但在实际应用中我们本地没有可供测试的环境,本地的Kubernetes环境是通过kindD生成的,其核心是多个Docker Container而不是多台机器。上述内容在Container内部运行,是使用Docker模拟Kubernetes的功能,因此这也是本文中唯一无法验证成功的一个功能模块。

完整部署一个活字格应用

通过上节我们一起学习了Pod间的编排控制器的使用,本节中实现了内外交互调用,进一步实现服务发现的功能,我们现在就可以再次回到之前提出的问题: 究竟如何成功部署一个活字格应用。

通过介绍整个Kubernetes的基础使用的流程,我们可以看到一个服务在Kubernetes变成Pod,通过Deployment部署,通过Service服务发现,通过Ingress反向代理的全过程,经过这些模块的协力配合之后,我们的活字格应用终于可以部署在这个Kubernetes集群中了。

希望这张图片展示,能够为大家带来更加直观的感觉。

总结

截止到本章,我们已经完整介绍了活字格公有云版做k8s部署的全过程。下一节将会为大家带来本系列文章的最后一篇——Kubernetes总览,让大家对Kubernetes集群内容部分有一个整体性印象,对一些深层次功能做一个总结。

感兴趣的小伙伴不要错过~我们下篇接着聊。

Docker与k8s的恩怨情仇(七)—— “服务发现”大法让你的内外交互原地起飞的更多相关文章

  1. Docker与k8s的恩怨情仇(四)-云原生时代的闭源落幕

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 在本系列前几篇文章中,我们介绍了从Cloud Foundry到Docker等PaaS平台的发展迭代过程.今天 ...

  2. Docker与k8s的恩怨情仇(六)—— “容器编排”上演“终结者”大片

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 在上节中,我们为大家介绍了Pod的基础内容,Kubernetes如何站在上帝视角上处理容器和容器之间的关系. ...

  3. Docker与k8s的恩怨情仇(八)——蓦然回首总览Kubernetes

    在系统介绍了如何实际部署一个K8S项目后,作为本系列文章的最后一篇,我们一起来看看Kubernetes集群内容总览,再对一些更深层次的功能进行总结. Kubernetes总览 下图是一个k8s的总览结 ...

  4. Docker与k8s的恩怨情仇(一)—成为PaaS前浪的Cloud Foundry

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 大家在工作中或许或多或少都接触过Docker,那你知道Docker以及容器化背后的原理到底是什么吗? 容器化 ...

  5. Docker与k8s的恩怨情仇(二)—用最简单的技术实现“容器”

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 上次我们说到PaaS的发展历史,从Cloud Foundry黯然退场,到Docker加冕,正是Docker& ...

  6. Docker与k8s的恩怨情仇(三)—后浪Docker来势汹汹

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 上一节我们为大家介绍了Cloud Foundry等最初的PaaS平台如何解决容器问题,本文将为大家展示Doc ...

  7. Docker与k8s的恩怨情仇(五)——Kubernetes的创新

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 上节中我们提到了社区生态的发展使得Kubernetes得到了良性的发展和传播.比起相对封闭的Docker社区 ...

  8. Docker 与 K8S学习笔记(七)—— 容器的网络

    本节我们来看看Docker网络,我们这里主要讨论单机docker上的网络.当docker安装后,会自动在服务器中创建三种网络:none.host和bridge,接下来我们分别了解下这三种网络: $ s ...

  9. k8s之服务发现

    一.概述 k8s中支持两种服务发现方法: 环境变量和DNS 二.环境变量 当Pod被创建的时候,k8s将为Pod设置每一个Service的相关环境变量,这些环境变量包括两种类型: k8s Servic ...

随机推荐

  1. 《MySQL面试小抄》索引考点二面总结

    <MySQL面试小抄>索引考点二面总结 我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统,自己无法快速定位到关键问题点 ...

  2. 通过AI识图判断图片是否为小票

    先在百度智能云中创建一个应用加入以下标记功能(没有智能云账号可以去创建一个,创建应用也都是些基本操作) 本次只用到标记的功能. 此功能在图像识别下面. 创建应用后,页面会出现平台分配的密钥:API K ...

  3. 安聊服务端Netty的应用

    Netty简介 Netty是一个面向网络编程的Java基础框架,它基于异步的事件驱动,并且内置多种网络协议的支持,可以快速地开发可维护的高性能的面向协议的服务器和客户端. 安聊简介 安聊是一个即时聊天 ...

  4. ceph-csi源码分析(6)-rbd driver-nodeserver分析(下)

    更多 ceph-csi 其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi源码分析(6)-rbd driver-nodeserver分析(下) 当c ...

  5. 配置中心之Nacos简介,使用及Go简单集成

    简介 为什么需要配置中心 ​ 我们现在有一个项目, 使用Gin进行开发的, 配置文件我们知道是一个config.yaml的文件, 也知道这个配置文件在项目启动时会被加载到内存中使用; 考虑三种情况: ...

  6. 使用远程Docker进行集成测试

    目录 需求背景 使用docker进行环境搭建 以中心化的docker server改进集成测试 Docker Server远程链接配置 Testcontainers 框架 Testcontainers ...

  7. 6. QT国际化 translate QT语言家 翻译

    main. QTranslator *qtTranslator = new QTranslator(); if (IsChinese()) { qtTranslator->load(" ...

  8. 22、部署drdb

    22.1.heartbeat部署规划: 本文的实验环境是虚拟机设备: 名称 接口 ip 用途 master-db(主) eth0 10.0.0.16/24 用于服务器之间的数据同步(直连) eth1 ...

  9. 利用C语言判别用户输入数的奇偶性和正负性

    要求:利用C语言判别用户输入数的奇偶性和正负性 提示:可以利用%求余数来判别 由题可知 我们需要if..else的结构来实现区分奇偶和正负 区分奇偶我们可以用: if (a % 2 == 0) { p ...

  10. Object 中的默认方法

    1.public final native Class<?> getClass() getClass方法,返回该实例的java.lang.Class类,例如 Object obj = ne ...