专栏首页Java艺术开发也需了解的运维知识之Kubernetes

开发也需了解的运维知识之Kubernetes

DockerKubernetes是什么关系?这可能是我们刚接触Kubernetes时都有的一个疑问。那么Kubernetes是什么?

Kubernetes是一个容器集群编排管理系统,用于实现容器集群的自动化部署、自动扩缩容等功能。Docker提供用于运行应用程序的容器技术,而Kubernetes本身并不提供用于运行应用程序的容器,而是负责管理容器。

了解DockerKubernetes的关系之后,就能理解为什么我们要先学习Docker再学习Kubernetes,这与先学习Spring框架才能更好地学习Spring BootSpring Cloud是一样的。

作为开发,我们为什么要了解容器技术,这不是运维该学习的吗?作为开发者,只有足够了解容器技术,才能做好技术选型,以及开发部署在Kubernetes容器服务之上的应用应该要注意哪些问题。如果运维不了解代码,开发也不了解Kubernetes,谁能解决将服务迁移到Kubernetes上遇到的各种问题呢?

关于Kubernetes

笔者学习Kubernetes的路线,分享给大家:

  • 官方学习文档:http://docs.kubernetes.org.cn/
  • 阅读书籍:《Kubernetes in Action中文版》
  • 极客时间视频教程:《Spring CloudKubernetes云原生微服务实战》

学习Kubernetes首先要了解Kubernetes的架构,了解一些“概念”,再了解配置文件。配置文件这块对初学者来说是最难理解的,因此推荐大家阅读《Kubernetes in Action中文版》这本书,跟着例子一步步掌握一些配置文件中每种kind的作用,每个配置项的作用是什么。

Kubernetes管理所有可用的物理机,以阿里云容器服务Kubernetes为例,Kubernetes负责管理一堆ECS实例,这需要我们在创建Kubernetes集群时,购买足够的ECS实例,至少两台。后续也可将新购买的ECS实例加到Kubernetes集群,由Kubernetes管理。

开发者和运维都不需要知道一个应用程序部署在哪个ECS实例上,只需要指定运行应用程序所需要的cpu、内存等资源,Kubernetes会根据要求计算出满足条件的节点(ECS),并在节点(ECS)上从镜像仓库拉取应用程序的镜像创建容器并运行容器,并且监控容器的整个生命周期。我们可以把Kubernetes管理的所有节点(ECS)看成一个大的物理机,这台大的物理机的cpu、内存是所有节点(ECS)的总和。

(图片来之《Kubernetes in Action》)

如上图所示,开发者只需要将应用构造成镜像,并将镜像push到远程镜像仓库,然后编写一个配置文件,在配置文件中描述应用程序镜像运行所需要的资源、镜像从哪拉取等,使用kubectl调用Kubernetes提供的API就能将应用程序部署到Kubernetes

Kubernetes由两种类型的节点组成。

(图片来自《Kubernetes in Action》)

一种是主节点Master,负责控制和管理整个集群,为实现高可用,主节点也要求部署集群。主节点上会部署一些组件,这些组件可以运行在单个主节点上,或者通过副本分别部署在多个主节点上,实现高可用。如基于Reft协议实现的数据强一致性存储服务etcd、提供给我们使用的Kubernetes API服务、调度应用部署的Scheculer组件、执行集群功能的Controller Manager组件。这些组件我们可以先这么简单了解,暂时不用过于深究。

另一种是工作节点,运行用户实际部署的应用。

假设我们在阿里云购买了托管的Kubernetes服务,那么主节点就由阿里云托管,而工作节点就是我们购买的ECS实例,一个集群中有多少个ECS实例就是有多少个工作节点。

工作节点就是运行容器的机器,除了运行用于运行我们部署的应用程序的容器外,每个工作节点上还会运行一些组件,这些组件负责运行、监控和管理应用服务。如DockerKubeletKube-proxyDocker我们已经很熟悉了;Kubelet负责与主节点的Kubernetes API服务通信,并管理它所在的工作节点的容器;Kube-proxy负责组件之间的负载均衡网络流量。

上图是根据到目前为止我们对Kubernetes的了解所画出的一个应用部署流程图。

  • 1、开发者在本地机器构建应用程序镜像;
  • 2、开发者将本地应用程序镜像psuh到镜像仓库;
  • 3、开发者为运行应用程序编写描述文件(yaml配置文件);
  • 4、开发者使用kubectl调用Kubernetes API将应用程序描述文件提交给Kubernetes
  • 5、Scheduler组件根据描述文件调度工作节点部署应用程序;
  • 6、在工作节点上由Container runtime负责从镜像仓库拉取镜像、创建容器并运行容器;

在实际项目部署时,我们可能最关系也最难理解就是网络和容器这部分内容。比如,在不使用Kubernetes时,我们部署一个需要SSD资源的应用程序时,先购买SSD挂载在该服务器上,而使用Kubernetes时,我们要告诉Kubernetes只在具有SSD的节点中选择节点部署应用。网络和容器卷的内容还是很多很复杂的,本篇就不过多介绍,后续文章中再介绍,当然也只是简单的理解和怎么去用,因为笔者目前理解的也不多。

需要了解的一些概念

namespaces:用于区分不同的资源,如测试环境资源、生产环境资源;当然也可以使用labels区分。不指定namespaces则默认使用default,如果使用非defalut名称空间,则在使用kubectl创建secret、创建ServiceAccount等都需要明确指定namespaces

节点(Node):节点就是实际的机器或者虚拟机,例如阿里云ECS

PodPodKubernetes创建或部署的最小基本单位,一个Pod封装一个或多个应用容器,存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。

(图片来自《Kubernetes in Action》)

如上图所示,当一个Pod包含多个容器时,这些容器总是运行于同一个工作节点上,不会跨越多个工作节点。例如我们部署一个java程序,可以在一个Pod中运行多个该java程序的容器。Pod可以封装紧密耦合的应用,它们需要由多个容器组成,它们之间能够共享资源,例如前后端部署在一起(这个例子不恰当)。而对于我们开发java微服务应用来说,一般一个Pod只会运行一个容器,因此初学时可以不用过多去纠结这些概念。

ServiceService抽象的概念,是Pod的逻辑分组,这一组Pod能够被Service访问到,通常是通过LabelSelector实现。例如:

apiVersion: v1
kind: Service
metadata:
  name: demo-srv-service
  namespace: sit
spec:
  selector:
    app: demo-srv
    env: sit
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

通过selector匹配appdemo-srvenvsit的一组Pod,这组Pod对应demo-srv-service这个Service。更简单一点理解,假设我们部署一个java程序,一个Pod只启动一个该java程序的容器,那么启动多个该java程序就对应多个Pod,而这组Pod对应同一个Service

ReplicationControllerReplicationController(简称RC)是确保用户定义的Pod副本数保持不变。在用户定义范围内,如指定一个java程序部署的集群数量为3,如果Pod超过3(例如手动启动),则RC会终止额外的Pod,如果少于3(例如内存溢出导致),RC会创建新的Pod,始终保持在定义范围。

ReplicaSetReplicaSet简称RS,是RC的升级版本。RSRC之间的唯一区别是对选择器(Selector)的支持,这里不做过多介绍。

DeploymentsDeploymentPodReplicaSet提供声明式更新。你只需要在Deployment中描述你想要的目标状态是什么,Deployment Controller就会帮你将PodReplicaSet的实际状态改变到你的目标状态。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-srv-deployment
  namespace: sit
spec:
  # 副本数,运行多少个`Pod`
  replicas: 3
  # 选择器,使用标签匹配
  selector:
    matchLabels:
      app: demo-srv
  template:
    metadata:
      # 标签
      labels:
        app: demo-srv
        env: sit
    spec:
      # 容器,指定多个容器就会在一个`Pod`内运行多个容器
      containers:
        - name: demo-srv
          image: registry.cn-shenzhen.aliyuncs.com/wujiuye/demo-srv

DaemonSet:确保每个节点(物理机器或者虚拟机)上只运行一个该应用的Pod。如阿里云的实现的日记收集,就是在每个节点上运行一个用于收集日记的应用程序容器,对应一个Pod

网络通信

Pod之间的网络通信:

Kubernetes集群中的所有Pod都在同一个共享网络地址空间中,这意味着每个Pod都可以通过其他PodIP地址来实现相互访问。这也表示它们之间没有NAT网关。当两个Pod彼此之间发送网络数据包时,它们都会将对方的实际IP地址看作数据包中的源IP

无论是将两个Pod安排在单一的还是不同的工作节点上,同时不管实际节点间的网络拓扑结构如何,这些Pod内的容器都能够像在局域网上的计算机一样通信。

Service之间的网络通信:

Kubernetes Service为一组功能相同的Pod提供单一不变的接入点。当服务存在时,它的IP地址和端口不会改变。客户端通过IP地址和端口号建立连接,这些连接会被路由到提供该服务的任意一个Pod上,会实现负载均衡。通过这种方式,客户端不需要知道每个单独的提供服务的Pod的地址,这样这些Pod就可以在集群中随时被创建或移除。

假设现有一个项目,该项目有两个微服务,分别是demo-srvdemo-cap。现在将这两个服务部署到阿里云容器服务Kubernetes上,在控制台的服务列表页可以看到,这两个服务都有一个集群IP,不管这个两个服务部署多少个Pod,也不管Pod怎么变,其它服务都可以通过这个集群IP访问背后的Pod,当然访问背后Pod也是实现负载均衡的。

也是因为如此,我们开发微服务实现的服务发现都是基于Service的,那么在应用程序中实现负载均衡就显得多余了。

类型:

  • ClusterIP:通过集群的内部IP暴露服务,选择该值,服务只能够在Kubernetes集群内部可以访问。
  • NodePort:通过每个Node上的IP和静态端口(NodePort)暴露服务。NodePort服务会路由到ClusterIP服务,这个ClusterIP服务会自动创建。通过请求<NodeIP>:<NodePort>,可以从集群的外部访问一个NodePort服务。
  • LoadBalancer:如使用阿里云提供的负载均衡器,可以向外部暴露服务。外部的负载均衡器可以路由到NodePort服务和ClusterIP服务。

本篇就介绍到这,Kubernetes要学的知识点很多,但作为开发,我们可能不会去过多的关注一些细节,本篇介绍的知识点是笔者认为作为开发应掌握的知识的。网络、容器卷这部署建议多了解一些,网络有关服务间的调用,而容器卷有关日记的打印、文件存储,如果使用阿里云容器服务,那么日记这块我们可以不输出到文件,使用阿里提供的日记服务收集日记。但如果需要持久化存储的服务,就必须要了解容器卷Volume

不懂的概念可以查阅官方文档:http://docs.kubernetes.org.cn

想要深入学习还是推荐阅读《Kubernetes in Action》中文版

本文分享自微信公众号 - Java艺术(javaskill),作者:wujiuye

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • OpenFeign整合Sentinel实现熔断降级

    常用于实现熔断降级的框架有Hystrix、Sentinel,我们常说的Spring Cloud项目说的其实是Spring Cloud Netflix,Hystr...

    Java艺术
  • Sentinel源码分析,了解Sentinel的整个工作流程

    从上一篇《Sentinel限流的核心功能QPS统计的实现原理》我们了解到,Sentinel统计QPS使用的是时间窗口+Bucket,并且通过循环复用Bucket...

    Java艺术
  • 访问者模式在ASM框架中的使用

    访问者模式的定义是:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

    Java艺术
  • 七张图了解Kubernetes内部的架构

    Kubernetes是用于管理容器化应用程序集群的工具。在计算机领域中,此过程通常称为编排。

    KevinYan
  • 结合Kubernetes解读微服务的12要素

    如果你在使用容器来构建应用的话,一定听过什么是“12要素原则”。“12要素”为开发微服务提供了一组明确的指引。人们相信只要遵循这些原则,就可以更容易的运行、扩展...

    yuanyi928
  • Kubernetes的前世今生和未来

    有人认为自动化,云计算和人工智能是第四次工业革命。如果你开始感受到IT领域自动化率的飙升,特别是在应用程序部署和管理领域(我觉得还不是无缝的自插拔式),那么不用...

    企鹅号小编
  • Android技术栈(二)组件化改造

    国内都比较流行开发超级APP,也就是我全都要,什么功能都想加进去,这导致业务逻辑变得越来越复杂.

    Android技术干货分享
  • CSS3随机背景图片切换特效

    看大家扒我的幻想领域二次元限定版扒的比较累,扒了大半个小时的,抽空整理一下发出来

    阿珏
  • CSS3随机背景图片切换特效

    Youngxj
  • 支付宝提现收费,移动支付大战正式落幕

    在今年上半年微信宣布提现不再免费之后,支付宝曾在微博表示提现不收费,不过这种“福利”并未坚持多久。今天支付宝宣布提现将收取0.1%的手续费,每个用户终身拥有2万...

    罗超频道

扫码关注云+社区

领取腾讯云代金券