第一讲《初识Kubernetes》

一.部署的演进

1.传统部署时代:

早期,各个组织是在物理服务器上运行应用程序。由于无法限制在物理服务器中运行的应用程序资源使用,因此会导致资源分配问题。例如,如果在同一台物理服务器上运行多个应用程序, 则可能会出现一个应用程序占用大部分资源的情况,而导致其他应用程序的性能下降。一种解决方案是将每个应用程序都运行在不同的物理服务器上, 但是当某个应用程序资源利用率不高时,剩余资源无法被分配给其他应用程式, 而且维护许多物理服务器的成本很高。

2.虚拟化部署时代:

因此,虚拟化技术被引入了。虚拟化技术允许你在单个物理服务器的 CPU 上运行多台虚拟机(VM)。 虚拟化能使应用程序在不同 VM 之间被彼此隔离,且能提供一定程度的安全性, 因为一个应用程序的信息不能被另一应用程序随意访问。

虚拟化技术能够更好地利用物理服务器的资源,并且因为可轻松地添加或更新应用程序, 而因此可以具有更高的可扩缩性,以及降低硬件成本等等的好处。 通过虚拟化,你可以将一组物理资源呈现为可丢弃的虚拟机集群。

每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。

3.容器部署时代:

容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操作系统(OS)。 因此,容器比起 VM 被认为是更轻量级的。且与 VM 类似,每个容器都具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。

容器因具有许多优势而变得流行起来,例如:

•敏捷应用程序的创建和部署

•持续开发、集成和部署

•关注开发与运维的分离

•可观察性

•跨云和操作系统发行版本的可移植性

•跨开发、测试和生产的环境一致性

•以应用程序为中心的管理

•松散耦合、分布式、弹性、解放的微服务

•资源隔离

•资源利用

那kubernetes是什么?为什么要用它?

二、Kubernetes概述

1.概述

kubernetes,简称k8s,是用8代替名字中间的8个字符“ubernete”而成的缩写。是Google开源的一个容器编排引擎,使用go语言编写。它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。

在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问、扩展、自愈,而这些细节都不需要运维人员去进行复杂的手工配置和处理。

k8s是容器编排系统

2.特性

Ø服务发现和负载均衡

Kubernetes 可以使用 DNS 名称或自己的 IP 地址来曝露容器。 如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。

Ø存储编排

Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。

Ø自动部署和回滚

你可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。 例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。

Ø自动完成装箱计算

你为 Kubernetes 提供许多节点组成的集群,在这个集群上运行容器化的任务。 你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。 Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。

Ø自我修复

Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。

Ø密钥与配置管理

Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

3.边界

Kubernetes不是一个传统意义的、保罗万象的 PaaS(Platform as a Service)系统。Kubernetes在容器层面工作,而不是硬件层面,它提供了与 PaaS 平台相似的通用特性,例如:部署、伸缩、负载均衡、日志、监控等。然而,Kubernetes并不是一个单一整体,这些特性都是可选、可插拔的。Kubernetes提供用于搭建开发平台的基础模块,同时为用户提供了不同模块的选择性和多样性。

Ø不限制应用程序的类型。Kubernetes的目标是广泛支持不同类型的工作负载,包括:有状态、无状态、数据处理等类型的应用。只要应用可以在容器中运行,就能够非常好地在 Kubernetes 上运行。

Ø不部署源码、不编译或构建应用程序。持续集成、分发、部署(CI/CD)的工作流极大程度上取决于组织的文化、偏好以及技术要求。Kubernetes可以作为部署平台参与到 CI/CD 流程,但是不涉及镜像构建和分发的过程。

Ø不提供应用程序级别的服务,包括:中间件(例如,消息总线)、数据处理框架(例如,Spark)、数据库(例如,mysql)、缓存(例如,Redis),或者分布式存储(例如,Ceph)。此类组件可以在 Kubernetes 上运行,或者可以被运行在 Kubernetes 上的应用程序访问。

Ø不限定日志、监控、报警的解决方案。Kubernetes 提供一些样例展示如何与日志、监控、报警等组件集成,同时提供收集、导出监控度量(metrics)的一套机制。您可以根据自己的需要选择日志、监控、报警组件。

Ø不提供或者限定配置语言。Kubernetes提供一组声明式的 API,您可以按照自己的方式定义部署信息。

Ø不提供或限定任何机器的配置、维护、管理或自愈的系统。

三、Kubernetes集群

1.集群及组件

Etcd:保存了整个集群的状态

Apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;

controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;

Scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;

kubelet:主要负责监视指派到它所在Node上的Pod,包括创建、修改、监控、删除等;

kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡;

2.Pod创建流

1.运维人员向 apiserver发出指令,可以通过API Server的REST API,也可用Kubectl命令行工具

2.apiserver 响应命令,通过一系列认证授权,把 pod 数据存储到 etcd,创建 deployment 资源并初始化 (期望状态)

3.controller-manager 通过 list-watch 机制,监测发现新的 deployment,将该资源加入到内部工作队列,发现该资源没有关联的 pod 和 replicaset,启用 deployment controller 创建 replicaset资源,再启用 replicaset controller 创建 pod

4.创建完成后,将 deployment,replicaset,pod 资源更新存储到 etcd

5.scheduler 通过 list-watch 机制,监测发现新的 pod,经过主机过滤、主机打分规则,将 pod 绑定 (binding) 到合适的主机

6.将绑定结果存储到 etcd

7.kubelet 每隔 20s (可以自定义) 向 apiserver通过 NodeName获取自身 Node 上所要运行的 pod 清单,通过与自己的内部缓存进行比较,新增加 pod

8.kubelet 调用 Docker API 创建并启动 pod

9.kube-proxy 为新创建的 pod 注册动态 DNS 到 CoreOS。给 pod 的 service 添加 iptables/ipvs规则,用于服务发现和负载均衡

10.controller-manager 通过 control loop(控制循环)将当前 pod 状态与用户所期望的状态做对比,如果当前状态与用户期望状态不同,则 controller 会将 pod 修改为用户期望状态,实在不行会将此 pod 删掉,然后重新创建pod

四、Kubernetes资源类型

1.基础概念

kubernetes容器编排系统

Pod:k8s中的最小调度单位。一个pod可以封装一个或多个应用容器

Container实际工作者。应用容器引擎,常见的有docker、containerd,k8s提供CRI接口,docker shimk8s1.24中被弃用

Namespace命名空间。做逻辑隔离,默认是无策略的。

Label对象之间的弱关联。Label可以在创建对象时指定,也可以在后期修改,每个对象可以拥有多个标签,但key值必须是唯一。必须遵循以下规则:

键:可选的前缀和名称,用斜杠(/)分隔。名称段是必需的,必须小于等于 63 个字符,以字母数字字符([a-z0-9A-Z])开头和结尾, 带有破折号(-),下划线(_),点( .)和之间的字母数字。前缀是可选的。如果指定,前缀必须是 DNS 子域:由点(.)分隔的一系列 DNS 标签,总共不超过 253 个字符, 后跟斜杠(/)

值:必须为 63 个字符或更少(可以为空);除非标签值为空,必须以字母数字字符([a-z0-9A-Z])开头和结尾;包含破折号(-)、下划线(_)、点(.)和字母或数字

2.常见资源类型

Service(svc):将运行在一组pod上的应用程序公开为网络服务的抽象方法。

Ingressing:对集群中服务的外部访问进行管理的 API 对象

Configmapcm:用来将非加密数据保存到键值对中。可以用作环境变量、命令行参数或者存储卷中的配置文件。

Deploymentdeploy:一个Deployment为pod和replicaset提供声明式的更新能力。

Daemonsetds:守护进程,k8s会自动给每个node都部署一个,用于日志采集、监控、网络插件。

Namespacens:命名空间,逻辑隔离,如果在yaml文件不加此配置,默认是default空间。

Persistentvolumepv:静态存储,持久卷。

PersistentVolumeClaimpvc:持久卷的申领。

Storageclasssc:动态存储,NFS,k8s的CSI接口,provisioner。

Networkpolicy(netpol):网络策略,作用于namespace,默认是没有的。

Job:任务

Cronjobcj:定时任务

Role:角色

Clusterrole:集群角色

Rolebinding:单个命名空间的角色绑定

Clusterrolebinding:集群角色绑定

Serviceaccount:服务内部账号

Secret:敏感数据,base64编码

3.资源查看

kubectl api-resources | grep resourcesname

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值