K8S学习


K8S学习

容器/docker的基本知识

镜像Images,仓库Repositories,容器:Container

从远端仓库拉取镜像到本地,镜像实例化为容器

容器提交给镜像,在本地将镜像推送给远端仓库

给镜像打标签

docker tag c059bfaa849c docker.io/wzh-repository/alpine:v1107

推送镜像?推送失败docker push docker.io/wzh-repository/alpine:v1107

docker tag c059bfaa849c wzhdocker1107/alpine:1107

失败原因,应该改为dockerhub用户名/镜像名,则docker push wzhdocker1107/alpine:1107

列出所有容器 docker ps -a 列出活着的 docker ps

启动容器 docker run

映射端口 docker run -p 容器外端口: 容器内端口

docker run –rm –name mynginx -d -p81:80 wzhdocker1107/nginx:v1.12.2

挂载数据卷 docker run -v 容器外目录:容器内目录

传递环境变量 docker run -e 环境变量key=环境变量value

容器内安装软件(工具) yum/apt-get/apt等

容器通过提交变为镜像;同时dockerfile通过build也可以生成Image,一行行执行dockerfile里的指令。

dockerfile的规则: 指令用大写,内容用小写

USER/WORKDIR指令 USER指定进程使用哪个用户运行,WORKDIR指定进程的工作目录,进去docker时所在目录

ADD/EXPOSE指令 ADD指令的功能是将主机构建环境(上下文)目录中的文件和目录、以及一个URL标记的文件 拷贝到镜像中。 EXPOSE指令:指的是让容器哪个端口暴露出来

RUN/ENV指令 RUN是构建镜像时,执行的操作 ENV是将环境变量固化到镜像中

CMD/ENTRYPOINT指令 使用CMD构建的镜像,当容器启动时就执行 CMD配置的命令。CMD是启动容器时执行的操作 如果容器启动时没带 CMD指令,默认会执行/entrypoint.sh当然也可以手动编辑entrypoint.sh然后add到镜像中

docker的四种网络模式

使用docker的好处:

1.docker统一了基础设施的环境。docker环境。硬件的配置,操作系统的版本,运行时环境的异构。

2.docker统一了程序打包方式。 docker镜像。 java程序,python程序

3.docker统一了容器部署的方式。docker容器。 java-jar, npm run dev 。 docker run…

三次跨时代飞跃: 1.CS to BS,不必下载客户端,直接网页访问 2.移动互联网,有手机就行 3.微信小程序,我连APP都不用装了。

K8S入门

K8S的优势:自动装箱,弹性伸缩,自我修复;服务发现和负载均衡;自动部署和回滚;集中化配置和密钥管理;存储编排;任务批处理运行。

  1. pod 是k8s中能够运行的最小逻辑单元,一个pod里面可以运行多个容器。 Pod是豌豆荚,容器是豌豆。一个pod里运行多个容器,又叫边车模式。

  2. pod控制器是pod启动的一种模版,用来保证在K8S里启动的Pod应该始终按照人们的预期运行。K8S内提供了众多pod控制器,常用的有Deployment,DaemonSet

  3. name 每一种“资源”,都应该有自己的“名称”。资源有五个维度的信息,api版本,类别,元数据,定义清单,状态。 名称通常定义在资源的元数据信息里。资源是功能的抽象。

  4. namespace 隔离K8S内各种资源的方法,名称空间可以理解为K8S内部的虚拟集群组。

  5. label 标签。标签和资源是多对多的关系,标签的组成key=value

  6. label选择器。 使用标签选择器过滤指定的标签。

  7. service 在K8S中,每个pod都会被分配一个单独的IP地址,但IP地址会随着pod的销毁而消失。service可以看作是一组提供相同服务的pod的对外访问接口。哪些pod归k8s管?通过标签选择器来定义。

  8. Ingress是第7层的应用层,对外暴露的接口。Service只能进行L4的流量调度,表现形式是ip+port. Ingress则可以调度不同业务域,不同url访问路径的业务流量。

有状态和无状态:无状态应用不会对本地环境产生任何依赖,例如不会存储数据到本地磁盘。

资源与对象:在K8S中一切皆资源,配置资源清单。对象是资源的实例。

资源的分类:元空间级(每一个资源都可以使用),集群级(K8S集群),命名空间级。

Node是一台机器,属于集群级别的资源。

  1. 命名空间级的资源很重要:
    pod,里面由单个容器或者几个紧耦合在一起的容器组成。希望如果两个容器有强依赖关系时,可以共享网络。让多个容器挂载同一存储卷。pod在创建之初就有一个pause容器,来支持所有的共享。

  2. pod的控制器管理pod的创建,分为适用于无状态服务的,适用于有状态服务的,守护进程,任务/定时任务

  3. 适用于无状态服务的:Replication Controller 简称 RC,主要的作用就是用来确保容器应用的副本数始终保持在用户定义的副本数 。 RS(ReplicaSet )替代了RC。RS新增了可以通过selector来选择特定的一些pod.可以给 Pod 设置 label,然后给“控制器”设置对应的 selector,这就实现了对象的关联。但是RS只有扩容和缩容的功能,实际生产也不会用。Deployment 会自动创建RS和pod,滚动升级,平滑扩容和缩容,暂停与恢复Deployment。

  4. 适用于有状态服务的:StatefulSet,里面有两个组件,Headless Service (DNS管理),volumeClaimTemplate(用于创建持久化卷的模板)。一个负责网络,一个负责存储。

  5. 守护进程,DaemonSet。监控应用,日志搜集。可以配置只在type=logs上的Node上执行。

CronJob在Job上添加了定时的功能。

内部节点之间,pod之间的网络通信,用Service来实现。东西流量。

南北流量基于Ingress实现,将K8S内部服务暴露给外部。

K8S的各种插件

Kubectl命令行工具

K8S的CNI网络插件-flannel

K8S的服务发现插件-coredns

K8S的服务暴露插件-traefik

K8S的GUI管理工具-dashboard

K8S的dashboard监控小插件-heapster

K8S集群的生产维护经验

管理K8S核心资源的三种基本方法:
1.陈述式管理方法 - 主要依赖命令行CLI工具进行管理

2.声明式管理方法 - 主要依赖统一资源配置清单(yaml/json)进行管理

3.GUI管理方法- 主要依赖图形化操作界面(web页面)进行管理

K8S的pod探针

探针,三种

  1. LivenessProbe,每隔一定时间探查是否存活,和Redis的心跳机制类似
  2. ReadinessProbe,每隔一定时间探查是否被外界可读。
  3. StartupProbe,探查是否pod启动,如果没有启动,就不需要上面两个探针了。

服务发现

如何将deployment与RS关联起来。给RS打标签Label。然后在deployment里定义选择器selector。

服务发现:service,service去找Endpoint,Endpoint根据address和iptables去找node的kube-proxy,然后找到具体的pod。各个pod之间也可以自由通信。Service的Endpoint类似于Nacos

外部访问,内部服务->Service->Endpoint->百度等要访问的网站。

Ingress类似于Nginx。Nginx就是Ingress的实现之一。外部用户访问服务器。

配置与存储

为了持久化保存容器的数据,kubernetes引入了Volume的概念。

Volume是Pod中能够被多个容器访问的共享目录,它被定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下,kubernetes通过Volume实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储。Volume的生命容器不与Pod中单个容器的生命周期相关,当容器终止或者重启时,Volume中的数据也不会丢失。

kubernetes的Volume支持多种类型,比较常见的有下面几个:

简单存储:EmptyDir、HostPath、NFS

高级存储:PV、PVC

配置存储:ConfigMap、Secret

当Pod销毁时, EmptyDir中的数据也会被永久删除。

EmptyDir用途如下:

  • 临时空间,例如用于某些应用程序运行时所需的临时目录,且无须永久保留
  • 一个容器需要从另一个容器中获取数据的目录(多容器共享目录)

hostPath

EmptyDir中数据不会被持久化,它会随着Pod的结束而销毁,如果想简单的将数据持久化到主机中,可以选择HostPath。

HostPath就是将Node主机中一个实际目录挂在到Pod中,以供容器使用,这样的设计就可以保证Pod销毁了,但是数据依据可以存在于Node主机上。

NFS挂载,NFS是一个网络文件存储系统,可以搭建一台NFS服务器,然后将Pod中的存储直接连接到NFS系统上,这样的话,无论Pod在节点上怎么转移,只要Node跟NFS的对接没问题,数据就可以成功访问。NFS的位置类似于上图中的hostPath,在pod外面。

为了能够屏蔽底层存储实现的细节,方便用户使用, kubernetes引入PV和PVC两种资源对象。

  • PV(Persistent Volume)是持久化卷的意思,是对底层的共享存储的一种抽象。一般情况下PV由kubernetes管理员进行创建和配置,它与底层具体的共享存储技术有关,并通过插件完成与共享存储的对接。

  • PVC(Persistent Volume Claim)是持久卷声明的意思,是用户对于存储需求的一种声明。换句话说,PVC其实就是用户向kubernetes系统发出的一种资源需求申请。

使用了PV和PVC之后,工作可以得到进一步的细分:

  • 存储:存储工程师维护
  • PV: kubernetes管理员维护
  • PVC:kubernetes用户维护

ConfigMap是一种比较特殊的存储卷,它的主要作用是用来存储配置信息的。

在kubernetes中,还存在一种和ConfigMap非常类似的对象,称为Secret对象。它主要用于存储敏感信息,例如密码、秘钥、证书等等。

使用 ConfigMap 或 Secret 挂载到目录的时候,会将容器中源目录给覆盖掉,此时我们可能只想覆盖目录中的某一个文件,但是这样的操作会覆盖整个文件,因此需要使用到 SubPath

高级调度

污点(Taints)是一种将限制条件附加到节点的方式,以影响 Pod 是否能够在该节点上调度。如果节点被设置了污点,只有在 Pod 设置了相应容忍规则时,它们才能够被调度到该节点上。

通过在Node上添加污点属性,来决定是否允许Pod调度过来。
Node被设置上污点之后就和Pod之间存在了一种相斥的关系,进而拒绝Pod调度进来,甚至可以将已经存在的Pod驱逐出去。

如果想将某些节点专门分配给特定的一组用户使用,你可以给这些节点添加一个污点

配备了特殊硬件的节点:在部分节点配备了特殊硬件(比如 GPU)的集群中, 我们希望不需要这类硬件的 Pod 不要被调度到这些特殊节点,以便为后继需要这类硬件的 Pod 保留资源。 要达到这个目的,可以先给配备了特殊硬件的节点添加污点,然后给使用了这类特殊硬件的 Pod 添加一个相匹配的容忍度。

如果 Pod 不能容忍这类污点,会马上被驱逐。

污点的格式为:key=value:effect, key和value是污点的标签,effect描述污点的作用,支持如下三个选项:

  • PreferNoSchedule:kubernetes将尽量避免把Pod调度到具有该污点的Node上,除非没有其他节点可调度
  • NoSchedule:kubernetes将不会把Pod调度到具有该污点的Node上,但不会影响当前Node上已存在的Pod
  • NoExecute:kubernetes将不会把Pod调度到具有该污点的Node上,同时也会将Node上已存在的Pod驱离

容忍(Tolerations)是在 Pod 中设置的规则,用于指示该 Pod 是否能够容忍节点上的特定污点。如果 Pod 设置了与节点上的污点匹配的容忍规则,那么该 Pod 就可以被调度到具有该污点的节点上。

污点就是拒绝,容忍就是忽略,Node通过污点拒绝pod调度上去,Pod通过容忍忽略拒绝

亲和性调度(Affinity)是 Kubernetes 中用于定义 Pod 与节点或其他 Pod 之间关系的一种机制。通过使用亲和性,你可以控制 Pod 的调度行为,使其倾向于或避免某些节点或其他 Pod。亲和性分为三种主要类型:

  • nodeAffinity(node亲和性): 以node为目标,解决pod可以调度到哪些node的问题
  • podAffinity(pod亲和性) : 以pod为目标,解决pod可以和哪些已存在的pod部署在同一个拓扑域中的问题
  • podAntiAffinity(pod反亲和性) : 以pod为目标,解决pod不能和哪些已存在pod部署在同一个拓扑域中的问题

节点亲和性,一个是硬亲和,一个是软亲和。

  • requiredDuringSchedulingIgnoredDuringExecution: 意味着这个规则在调度时必须被满足,但在 Pod 运行时可以被忽略。
  • preferredDuringSchedulingIgnoredDuringExecution: 意味着这个规则在调度时是首选,但不是必须的,同样在 Pod 运行时可以被忽略。

pod亲和性也是分硬亲和,软亲和。有了pod以后才能亲和,尽量和pod待在一起,她在哪我就去哪。

其他

DevOps:让技术团队、运维、测试等团队实现一体式流程自动化

CICD: 持续集成(CI),持续交付(CD)

持续集成:从编码、编译、测试、发布的完整自动化流程

持续交付: 包含持续集成,并且增加将项目部署到对应环境的自动化流程。


文章作者: 爱敲代码の鱼儿
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 爱敲代码の鱼儿 !
  目录