kubernetes(K8S) 基础原理及腾讯云TKE实践

kubernetes(K8S)

概念

Kubernetes是什么?

Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。

通过Kubernetes你可以:

  • 快速部署应用

  • 快速扩展应用

  • 无缝对接新的应用功能

  • 节省资源,优化硬件资源的使用

Kubernetes的特点
  • 可移植: 支持公有云,私有云,混合云,多重云

  • 可扩展: 模块化, 插件化, 可挂载, 可组合

  • 自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展

Kubernetes是Google 2014年创建管理的,是Google 10多年大规模容器管理技术Borg的开源版本。

为什么使用容器(container)

如下图:

image-20210511152450223

传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,不利于应用的升级更新/回滚等操作,当然也可以通过创建虚机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。

新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。

容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,使用容器可以在build或release 的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚机轻量、更“透明”,这更便于监控和管理。

容器优势总结:

  • **快速创建/部署应用:**与VM虚拟机相比,容器镜像的创建更加容易。

  • **持续开发、集成和部署:**提供可靠且频繁的容器镜像构建/部署,并使用快速和简单的回滚(由于镜像不可变性)。

  • **开发和运行相分离:**在build或者release阶段创建容器镜像,使得应用和基础设施解耦。

  • **开发,测试和生产环境一致性:**在本地或外网(生产环境)运行的一致性。

  • **云平台或其他操作系统:**可以在 Ubuntu、RHEL、 CoreOS、on-prem、Google Container Engine或其它任何环境中运行。

  • **Loosely coupled,分布式,弹性,微服务化:**应用程序分为更小的、独立的部件,可以动态部署和管理。

  • 资源隔离: 互相间CPU和内存资源相互不影响

  • **资源利用:**更高效

K8S作用

可以在物理或虚拟机的Kubernetes集群上运行容器化应用,Kubernetes能提供一个以“容器为中心的基础架构”,满足在生产环境中运行应用的一些常见需求,如:

  • 多个进程(作为容器运行)协同工作。(Pod)
  • 存储系统挂载
  • Distributing secrets
  • 应用健康检测
  • 应用实例的复制
  • Pod自动伸缩/扩展
  • Naming and discovering
  • 负载均衡
  • 滚动更新
  • 资源监控
  • 日志访问
  • 调试应用程序
  • 提供认证和授权

Pod

Pod介绍

Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程。

一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。Pod代表部署的一个单位:Kubernetes中单个应用的实例,它可能由单个容器或多个容器共享组成的资源。

Docker是Kubernetes Pod中最常见的runtime ,Pods也支持其他容器runtimes。

Kubernetes中的Pod使用可分两种主要方式:

  • Pod中运行一个容器。“one-container-per-Pod”模式是Kubernetes最常见的用法; 在这种情况下,你可以将Pod视为单个封装的容器,但是Kubernetes是直接管理Pod而不是容器。
  • Pods中运行多个需要一起工作的容器。Pod可以封装紧密耦合的应用,它们需要由多个容器组成,它们之间能够共享资源,这些容器可以形成一个单一的内部service单位 - 一个容器共享文件,另一个“sidecar”容器来更新这些文件。Pod将这些容器的存储资源作为一个实体来管理。

每个Pod都是运行应用的单个实例,如果需要水平扩展应用(例如,运行多个实例),则应该使用多个Pods,每个实例一个Pod。在Kubernetes中,这样通常称为Replication。Replication的Pod通常由Controller创建和管理。

Pods如何管理多个容器

Pods的设计可用于支持多进程的协同工作(作为容器),形成一个cohesive的Service单位。Pod中的容器在集群中Node上被自动分配,容器之间可以共享资源、网络和相互依赖关系,并同时被调度使用。

请注意,在单个Pod中共同管理多个容器是一个相对高级的用法,应该只有在容器紧密耦合的特殊实例中使用此模式。例如,有一个容器被用作WEB服务器,用于共享volume,以及一个单独“sidecar”容器需要从远程获取资源来更新这些文件。

网络

每个Pod被分配一个独立的IP地址,Pod中的每个容器共享网络命名空间,包括IP地址和网络端口。Pod内的容器可以使用localhost相互通信。当Pod中的容器与Pod 外部通信时,他们必须协调如何使用共享网络资源(如端口)。

存储

Pod可以指定一组共享存储volumes。Pod中的所有容器都可以访问共享volumes,允许这些容器共享数据。volumes 还用于Pod中的数据持久化,以防其中一个容器需要重新启动而丢失数据。有关Kubernetes如何在Pod中实现共享存储的更多信息,请参考Volumes。

Labels 和 Selectors

Labels其实就一对 key/value ,被关联到对象上,标签的使用我们倾向于能够标示对象的特殊特点,并且对用户而言是有意义的(就是一眼就看出了这个Pod是什么),但是标签对内核系统是没有直接意义的。标签可以用来划分特定组的对象(比如,所有女的),标签可以在创建一个对象的时候直接给与,也可以在后期随时修改,每一个对象可以拥有多个标签,但是,key值必须是唯一的。

"labels": {
  "key1" : "value1",
  "key2" : "value2"
}

最终索引并且反向索引(reverse-index)labels,以获得更高效的查询和监视,把他们用到UI或者CLI中用来排序或者分组等等。我们不想用那些不具有指认效果的label来污染label,特别是那些体积较大和结构型的的数据。不具有指认效果的信息应该使用annotation来记录。

Labels选择器

与Name和UID 不同,标签不需要有唯一性。一般来说,我们期望许多对象具有相同的标签。

通过标签选择器(Labels Selectors),客户端/用户 能方便辨识出一组对象。标签选择器是kubernetes中核心的组成部分。

API目前支持两种选择器:equality-based(基于平等)和set-based(基于集合)的。标签选择器可以由逗号分隔的多个requirements 组成。在多重需求的情况下,必须满足所有要求,因此逗号分隔符作为AND逻辑运算符。

  • 一个为空的标签选择器(即有0个必须条件的选择器)会选择集合中的每一个对象。

  • 一个null型标签选择器(仅对于可选的选择器字段才可能)不会返回任何对象。

注意:两个控制器的标签选择器不能在命名空间中重叠。

Replica Sets

  • ReplicaSet(RS)是Replication Controller(RC)的升级版本。ReplicaSet 和 Replication Controller之间的唯一区别是对选择器的支持。ReplicaSet支持labels user guide中描述的set-based选择器要求, 而Replication Controller仅支持equality-based的选择器要求。

  • ReplicaSet能确保运行指定数量的pod。然而,Deployment 是一个更高层次的概念,它能管理ReplicaSets,并提供对pod的更新等功能。因此,我们建议你使用Deployment来管理ReplicaSets,除非你需要自定义更新编排。

这意味着不需要操作ReplicaSet对象,而是使用Deployment替代管理 。

Deployment

Deployment控制RS,RS控制Pod,这一整套,向外提供稳定可靠的Service。

Deployment支持创建,更新,回退,扩容等操作。并且能够实时查看当前状态。

  • Deployment拥有更加灵活强大的升级、回滚功能,并且支持滚动更新
  • 使用Deployment升级Pod只需要定义Pod的最终状态,k8s会为你执行必要的操作(RC要自己定义如何操作)

image-20210511152519666

Deployment实例

apiVersion: apps/v1beta2                                       
kind: Deployment                                                   
metadata:
  annotations:
    deployment.kubernetes.io/revision: "150"
    description: 直播开发环境                                        # 镜像描述
  creationTimestamp: "2020-09-29T03:31:18Z"                        # 创建时间
  generation: 151
  labels:                                                          # 容器的标签 可和service关联
    k8s-app: dev-live
    qcloud-app: dev-live
  name: dev-live                                                    # 对应Pod的名称
  namespace: dev-cloud-exhibition                                   # 命名空间,默认为default             
  resourceVersion: "11525695063"
  selfLink: /apis/apps/v1beta2/namespaces/dev-cloud-exhibition/deployments/dev-live
  uid: 243be7fe-bc44-4537-9c23-4cbddb205daf
spec:
  progressDeadlineSeconds: 600
  replicas: 1                                                       # 镜像副本数量
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: dev-live
      qcloud-app: dev-live
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      annotations:
        eks.tke.cloud.tencent.com/cpu-type: intel
        eks.tke.cloud.tencent.com/security-group-id: sg-qfz98car
      creationTimestamp: null
      labels:
        k8s-app: dev-live
        qcloud-app: dev-live
        qcloud-redeploy-timestamp: "160914
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值