K8s学习

Posted 分享录

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了K8s学习相关的知识,希望对你有一定的参考价值。

一、基础概念

1.1 简介

Kubemetes 抽象了数据中心的硬件基础设施,使得对外暴露的只是 一个巨大的资源地 。它让我们在部署和运行组件时,不用关注底层的服务器。使用 Kubemetes 部署多组件应用时,它会为每个组件都选择 一个合适的服务器,部署之后它能够保 证每个组件可以轻易地发现其他组件,并彼此之间实现通信。

  • master节点:用于控制集群,主要包含k8s API服务器用于用户和其他master节点组件的通信、scheduler用于调度应用、Controller用于执行集群级别的功能(例如复制组件、处理失败节点等)、etcd用于持久化存储集群配置。

  • worker节点:用于运行用户的程序,主要包括容器、kubelet(用于和master的api通信并管理它所在节点的容器)、kube-proxy(负责组件之间的负载均衡)

k8s是如何将描述信息转换为一个运行中的容器的?

  • master Api服务处理描述信息,调度器调度分配工作节点

  • 每个worker节点上的kublet拉取指定的容器并运行

  • 应用运行起来之后,k8s会不断确认应用的部署状态是否符合描述信息,如果不符合,k8s会及时调整。

K8s学习

1.2 Pod

pod:一组紧密相关的容器,这组容器总是运行在同一个节点上的同一个linux命名空间下,每个pod就像一台独立的逻辑机器,拥有自己的ip、主机名、进程。pod中的容器共享网络、IPC、UTS,文件系统则不共享。

pod是扩缩容的基本单位。

pod分为自主式pod和控制器管理pod。(pod中的容器绝不可能是跨容器的)

为什么会有pod,而不是一个容器运行多个进程?

  • 因为如果一个容器中运行多个不相关的进程,我们就需要额外的去管理这些进程的生命周期。而如果每个容器只运行一个进程,那么我们直接管理容器的生命周期即可,所以使用pod来管理多个容器比一个容器管理多个进程更好。

pod拥有一个名为pause的root容器,其他容器都公用pause的网络栈和存储卷,且基于pause容器的其他容器相互隔离,但是进程不隔离。

K8s学习

pod的yaml描述

pod的yaml描述文件主要包含以下几部分:

  1. k8s版本、资源类型

  2. metadata:包括名称、命名空间、标签、关于该容器的其他信息

  3. spec:pod内容的实际说明,例如pod的容器、卷

  4. status:包含运行中的pod的当前信息,例如pod所处的条件、每个容器的描述和状态、内部ip和其他基本信息。(创建时不需要提供,这个是查看pod的yaml格式信息时,系统根据pod的运行时数据生成的)

一个简单的例子:
K8s学习
kind:pod/namespace/其他,指定要创建的资源的类型
metadata:

  • labels:xx:yy,为当前的pod添加xx标签,值为yy

  • annotations:一些额外的说明信息

  • namespace:指定目前要创建的资源所属的命名空间

spec:

  • node selector:xx:“yy”,使用标签选择器,选择将pod放到xx标签值为yy的node

存活探针

k8s通过存活探针检查容器是否还在运行。可以为pod中的容器单独指定存活探针,k8s会定期执行探针,如果失败,k8s会重启容器。

  • tcp套接字探针,尝试与容器指定端口建立TCP链接

  • Exec探针,在容器内执行任意命令,并检查命令的退出状态码

K8s学习
定义了一个http get探针,让k8s定期对该pod的端口8080的/路径执行http get请求,确定容器是否健康。当容器不健康时,k8s会终止容器,并创建一个新的容器。

还可以为探针设置一些额外的属性:

  • initialDelaySeconds:第一次检测前的等待时间。

就绪探针

判断容器是否已经就绪,确定pod是否可以接受客户端请求。,如果容器未通过准备检 ,则不会被终止或重新启动 这是
存活探针与就绪探针之间的重要区别。

  • Exec探针

  • Http get探针

  • tcp socket探针K8s学习

卷是 pod 的一个组成部分, 因此像容器一样在 pod 的规范中就定义了。它们不是独立的 Kubernetes 对象, 也不能单独创建或删除。pod 中的所有容器都可以使用卷, 但必须先将它挂载在每个需要访问它的容器中。在每个容器中, 都可以在其文件系统的任意位置挂载卷。

卷的作用是同一个Pod之间各个容器之间的文件共享。

卷依赖于Pod的生命周期,普通的卷如果pod消失了,那么卷也就消失了,但有的卷创建的文件即使pod和卷消失之后,卷的文件也可能保持原样,并挂载到新的卷中。

K8s学习
卷的类型:

  • emptyDir:用于存储临时数据的简单空目录

  • hostPath:用于将目录从工作节点的文件系统挂载到pod中

  • gitRepo:通过检出git仓库的内容来初始化卷

  • nfs:挂载到pod中的nfs共享卷

  • persistentVolumeClaim:使用预置或者动态配置的持久存储类型

  • configMap,secret,downwardAPI:用于将k8s部分资源和集群信息公开给pod的特殊类型的卷。
    创建emptyDir
    K8s学习
    还可以为volumes指定类型,决定该卷是创建在硬盘上还是内存中:
    默认是创建在本机硬盘上的。
    K8s学习
    创建gitRepo
    gitRepo 卷基本上也是 一 个 emptyDir 卷,它通过克隆 Git 仓库并在 pod 启动时(但在创建容器之前 )检出特定版本来填充数据。但是它并不能和对应repo保持同步。当向Git仓 库推送新增的提交时, 卷中的文件也不会被更新。如果所用的pod是由 ReplicationController 管理的,删除这个 pod 将触发新建一个新的 pod,而这个新 pod 的卷中将包含最新的提交 。(每当pod创建时,才会拉取git仓库一次)
    K8s学习

二、k8s的其他资源

ReplicationController

rc是一种k8s资源,可确保它的pod始终保持在运行状态,如果pod因任何原因消失,rc会注意到缺少了某个pod而创建一个新的代替。ReplicationController会持续监控正在运行的pod列表, 并保证相应 ” 类型” 的 pod的数目与期望相符。rc根据pod是否匹配某个标签选择器来确定pod的数量

K8s学习

rc的组成:

  • label selector:用于确定rc作用域下有哪些pod

  • replica count:指定要运行的pod数量

  • pod template:用于创建新的pod的模板

如何创建一个rc?
K8s学习
如果不指定选择器,在这种情况下,k8s会自动根据pod模板中的 标签自动配置。

ReplicaSet

替换rc,rc最终会被弃用。

比较

rs相比rc,其选择器表达能力更强,不仅可以匹配包含某个标签的pod,还支持匹配缺少某个标签的pod以及包含特定标签名的pod,不管value是多少。例如,rc不能同时匹配标签env = devel 和env = production的pod,但rs可以,因为它可以只匹配包含env这个标签名的pod。

创建

K8s学习

rs具有更丰富的标签选择:

K8s学习
每个表达式必须包含一个key、一个operator,可能还需要一个values列表,视操作符而定。

  • In:Label的值必须与其中一个指定的values匹配

  • NotIn:Label的值与任何指定的values不匹配

  • Exists:pod必须包含一个指定的名称的标签,不需要values字段

  • DoesNotExist:pod不得包含指定名称的标签

如果指定了多个表达式,则需要所有表达式都为true。

DaemonSet

可以使得集群中的所有节点都运行一个pod。

DaemonSet也可以将pod部署到某些特定的节点上,这是通过DaemonSet的pod模板的nodeselector实现的。

K8s学习
蓝色方框内的啥意思呢?

Job

创建一种pod,该pod在内部进程成功结束后,不重启容器。
K8s学习

CronJob

定时任务
K8s学习
K8s学习

service

K8s学习
这个名为kubia的服务,将对外暴露80端口,并将收到的请求路由到具有标签 app=kubia的pod的8080端口上。

内部的pod如何感知服务呢?

  • 通过环境变量

  • 通过dns服务

注意,创建的服务只要确定ip+端口号的时候才有意义,如果ping(端口号不匹配)则是无法访问的。

外部的应用如何访问服务?

  • 将服务的类型设置成NodePort,主要通过spec的type字段设置为NodePort创建,集群所有节点对外暴露一个端口
    K8s学习

  • 将服务的类型设置成LoadBalance,type设置为loadbalance,客户端通过负载均衡器访问服务

  • 创建一 个Ingress资源

ConfigMap和Secret

Deployment

------------END-----------

更多原创文章请扫描上面(微信内长按可识别)二维码访问我的个人网站(https://www.xubingtao.cn),或者打开我的微信小程序:可以评论以及在线客服反馈问题,其他平台小程序和APP请访问:https://www.xubingtao.cn/?p=1675。祝大家生活愉快!

以上是关于K8s学习的主要内容,如果未能解决你的问题,请参考以下文章

k8s学习-k8s初识与Centos下集群安装

企业运维实战--k8s学习笔记11.k8s容器资源限制

学习k8s的经验

k8s如何学习?搞清k8s关键技术点

k8s学习-思维导图与学习笔记

K8S学习圣经:大白话说K8S底层原理,14W字实现K8S自由