目录

前言

一,docker 资源配额

docker容器控制cpu

CPU配额控制参数的混合使用

docker容器控制内存

docker 容器控制IO

概念总结:

二,docker swarm集群

1,docker swarm集群是什么

2,Docker Swarm

3,Docker Swarm架构

4,swarm特性

三,命名空间namespace

概念

考什么

四,Pod(重头戏开始)

1,Pod是什么

2,Pod

3,Pod工作方式

4,PodIP

5,Pod的状态

6,相关命令

7,自主式Pod

五,Deployment和Replicase

六,Label与Label Selector

1,标签是干什么的

2,个数

3,标签的作用

4,相关命令

七,Service服务发现

1,什么是Kubernets中的Service

2,Service的类型

3,Endpoint Controller

4,ClusterIP的创建

5,NodePort的创建

6,CoreDNS

7,Headless Service

8,相关命令

八,DaemonSet与Job

1,DamonSet是什么?

2、DaemonSet和Deployment的区别是什么?

3、Job和CronJob是什么,区别是什么?

4,创建DaemonSet

 5,创建一次性任务Job

6,创建CronJob

7,相关命令

九,Pod健康检查

1,概念

2,探针的种类

3,实现方法Handler

4、存活性探测livenessProbe和就绪性探测readinessProbe的区别是什么?

5、两种探针都支持的三种探测方法是,检测判断依据是什么?

6、探针探测结果有哪三种值?

7,存活探针execaction

8,存活探针TCP

9,存活探针HTTP

10,就绪探针

十,Kubernetes存储

1,Kubernetes的存储方式

2,emptyDir

3,HostPath

4,创建pv,pvc

十一,ConfigMip与Secret

1,Config

2,Secret

十二,StatefulSet

1,无状态与有状态

2,创建有状态的三个步骤

十三,kubernets服务质量QoS

1,Best-Effort

2,Burstable

3,Guaranteed

结语


前言

我刚开始感觉一二三部分考的内容不多,可能第一部分就考一些命令,第二部分就考一些概念,要不然还能考什么?考搭建docker swarm集群?不可能!后边还有一堆kubernets的内容没考,在这给你考搭建?做梦,第三部分考的几率也比较小,但是有几条命令,就写了点。后来才知道根本不考,所以为了应付考试的话,可以不看哈!重点在第四部分及之后(导图里全是重点),那才是kubernets的大方向。

下面是老师给的考试的思维导图奉上

一,docker 资源配额

docker容器控制cpu

Docker是通过CGroups来实现对CPU,内存和磁盘I/O等资源的控制。

1,指定docker容器可以使用的cpu份额

例1:给容器分配512权重的cpu使用份额

docker run -it --cpu-shares 512 centos /bin/bash

--cpu-share int :CPU配额参数

例2:设置容器进程需要每秒使用单个CPU的0.2s时间

docker run -dit --cpu-period 100000 --cpu-quota 200000 centos

--cpu-period指定容器对CPU的使用多长时间重新分配一次

--cpu-quota指定在这个周期内最多可以使用的时间

CPU core 核心控制:

参数:--cpuset 可以绑定 CPU

CPU配额控制参数的混合使用

例1:指定docker1只能在CPU0和CPU1上运行,且使用份额为512

dockre run -dit --name docker1 --cpuset-cpus 0,1 --cpu-shares 512 centos /bin/bash

例2:指定docker2只能在CPU0和CPU2上运行,且使用份额为1024

docker -dit --name docker2 --cpuset-cpus 0,1 --cpu-shares 1024 centos /bin/bash

docker容器控制内存

参数:--memory-swappiness:设置容器的虚拟内存控制行为

           --kernel-memory:核心内存限制

           --memory:设置容器使用的最大内存上限

           --memory-swap:内存和swap的总和

           --memory-reservation:启用弹性的内存共享

例:创建一个docker,只能使用2个核心,且只能使用128M内存。

docker run -it --cpuset-cpus 0,1 -m 128m centos

docker 容器控制IO

参数:--device-read-bps:限制设备的读速度

           --device-read-iops:限制设备每秒读I/O的次数

           --device-write-bps:限制设备的写速度

           --device-write-iops:限制设备每秒写I/O的次数

例:限制容器实例对硬盘的最高写入速度为2MB/s。

docker run -it -v /var/www/html/:/var/www/html --device /dev/sda:/dev/sda --device-write-bps /dev/sda:2mb centos /bin/bash

docker容器运行结束自动释放资源

参数:--rm:当容器运行结束后,自动删除容器,释放资源

例:

docker run -it --rm --name c1 centos sleep

概念总结:

资源配额就是可以实现容器的资源调度使用的控制,及容器的读写速度,运行在哪个CPU上。

二,docker swarm集群

1,docker swarm集群是什么

是一套管理Docker集群的工具,将一群Docker宿主机变成一个单一的,虚拟的主机

2,Docker Swarm

服务(Service):实在工作节点所允许的一组任务的定义,是整个swarm的核心,一个service由多个任务组成

任务(Task):是swarm中最小调度单元,任务就是一个容器,容器中运行的命令或应用。

3,Docker Swarm架构

Swarm Manager管理节点:负责swarm集群管理,并向工作节点分配工作

Swarm Node工作节点:接受并执行来自管理节点分配的任务

一个Node就是一台Docker宿主机,管理节点是领导,工作节点是小兵,但领导也会工作,小兵也可以被提拔为领导。

4,swarm特性

动态扩展服务--水平扩展

负载均衡,节点宕机,节点提权/降权

三,命名空间namespace

概念

kubernetes支持多个虚拟集群,它们底层依赖于同一个物理集群,这些虚拟集群被称为命名空间。

考什么

既然是命名空间,那就肯定是考创建,查看,删除,切换……

例1:查看有哪些命名空间

kubectl get namespace

例2:查看命名空间及其资源对象

kubectl get pods -n kube-system k8s的安装组件在此

例3:创建一个test命名空间

kubectl create ns test

例4:切换命名空间

kubectl config set-context --current --namespace=kube-system

例5:删除命名空间

kubectl delete ns test

例6:查看命名空间详细信息

kubectl describe ns test

还有一个点就是namespace的资源限额,这个可能就考考你yaml清单文件里的内容什么意思

例7:所有容器的内存请求总额不得超过2GiB。

所有容器的内存限额总额不得超过4 GiB。

所有容器的CPU请求总额不得超过2 CPU。

所有容器的CPU限额总额不得超过4CPU。

hard:    
requests.cpu: "2"  
requests.memory: 2Gi  
limits.cpu: "4"  
limits.memory: 4Gi

四,Pod(重头戏开始)

1,Pod是什么

Kubernets中的最小调度单元。

2,Pod

Pod中运行容器,容器中指定镜像,容器可以有多个,为避免管理复杂化,尽量采用一个容器的Pod。

3,Pod工作方式

Pod需要调度到nod工作节点中来运行,具体哪个节点看scheduler调度器。

4,PodIP

每个Pod都会有一个唯一的IP地址。

5,Pod的状态

Pending(挂起),Running(正常运行中,一般都是这个),Succeeded(成功运行完毕),Unknown(未知),Failed(失败)

6,相关命令

创建pod,删除pod,查看pod,查看pod详细信息,查看所有podIP节点信息,进入pod

kubectl apply -f filename.yaml
kubectl delete podname
kubectl get pods
kubectl describe pod podname
kubectl get pods -o wide
kubectl exec -it podname /bin/bash

7,自主式Pod

一般我们都会以yaml资源清单的方式(就是文件名可以随便起,扩展名必须是.yaml)去创建,考的时候也是这么考,可能考你这个yaml文件怎么写,也可能给出你来,让你去解释每行什么意思,下面就来简单介绍一下吧!

apiVersion: v1                        ##版本信息
kind: Pod                             ##创建的是什么类型
metadata:                             ##对象,定义元数据属性信息
  name: Podname                       ##Pod的名字
  namespace: default                  ##此Pod属于哪个命名空间
  labels:                             ##Pod的标签
    app:tomcat                        ##app=tomcat
spec:                                 ##代表下面是容器的信息
  containers:                         ##容器中会执行的命令
  - name: dockername1                 ##容器的名字
    image: centos                     ##容器要用到的镜像
    ports:                            ##端口信息
    - containerPort: 8080             ##暴露8080端口
    imagePullPolicy: IfNotPresent     ##镜像的拉取策略,分为三种,下边会说到
  - name: dockername2                 ##第二个容器的信息,与第一个基本相似
    image: ……
    ……   ……
    ……   ……
  • Always:不管镜像是否存在都会进行一次拉取。
  • Never:不管镜像是否存在都不会进行拉取
  • IfNotPresent:只有镜像不存在时,才会进行镜像拉取

通过上面这个文件创建出来的Pod,我们称之为自主式Pod,简单来说就是,删掉后就是删掉了,这就是他的一个缺陷,所以就会用到下边的Deployment或者Replicaset控制器的方式来管理Pod。

五,Deployment和Replicase

其实我在一篇文章中已经详细的讲过Deployment控制器了,本篇文章就不再详细说了,可以去看这篇:K8S控制器之Deployment详解及配置。_无求道贾的博客-CSDN博客,这次就来说说Deployment和replicase的区别。

首先:是Deployment包含Replicase,再一个需要注意i的地方,就是Deployment在更新回滚Pod的时候是全自动的,不需要手动去删除旧的Pod,而Replicase是不会自动删除的,它需要你手动去删除,这是他的缺陷,还有一个就是Replicase=rc=rs,基本都是一个东西。

六,Label与Label Selector

1,标签是干什么的

标签(Label)就是附在Kubernets对象(如Pod,Deployment)上的键对值(Key-Value),可以在创建时指定,也可以在创建后指定

2,个数

一个对象可以有多个标签。

3,标签的作用

其实Label的作业不仅仅是一种对象的标识,后面我们会通过特殊的标签去对应Pod等等一些服务,这才是它的关键作用。

还有一个就是更方便的管理不同的Pod,比如你有5个Pod,但你想统一管理其中3个Pod,就可以给这三个Pod打上相同的Label,从而实现更方便的批量管理。

4,相关命令

这一部分内容,除了上边的理论之外,就是如何给对象打标签的语法了,一起来看看吧!

例1:查看所有Pod的所有label。

kubectl get pods --show-labels

例2:给Pod打标签,给pod打上一个time=2021的标签。

kubecal label pod podname time=2021

例3:基于等值的标签选择器查,查标签为time=2021的pod,并显示其标签。

kubectl label pod -l time=2021 --show-labels

例4:基于集合的标签选择器查,查标签time不是2022的,并显示其标签。

kubectl get pod -l time!=2022 --show-labels

例5:还有就是再yaml资源清单中的metadata字段下来定义。

metadata:
  app: nginx
  time: 2021
  key: value

例6:除此之外还可以给node节点打标签,一般用于让这个Pod运行在这个node节点上。

kubectl label nodes nodename env=test

在yaml文件中通过nodeSector字段来选择这个节点

nodeSelector:
  env: test

七,Service服务发现

1,什么是Kubernets中的Service

简单来说就是外界访问pod的桥梁,对外暴露服务的方式。那么问题来了,每个Pod不是有自己唯一的IP吗?我们在扩容,更新时Pod是会改变的,所以就引入了Service,通过Service去访问所对应的Pod,而它们之间就是通过相同的labels来关联的

2,Service的类型

ClusterIP:默认模式,提供一个集群内部的虚拟IP专供集群内部访问,外部无法访问。

NodePort:在所有节点上开放一个特定端口,任何发送到该端口的流量都被转发到对应服务。

Load Balancer:直接暴露服务,所有通往你指定的端口的流量都会被转发到对应的服务。它没有过滤条件,没有路由。

3,Endpoint Controller

负责维护Service和Pod IP之间的对应关系,当Service对应的Pod发生变化时,endpoints也会自动改变。

4,ClusterIP的创建

同样,Service的创建也是写yaml资源清单。

apiVersion: v1
kind: Service
metadata:
  name: Servicename
spec:
  selector:
    app: httpd                ##通过此标签自动匹配相同标签的Pod
  ports:
  - protocol: TCP
    port: 8080                ##Service的端口,客户端通过此端口访问
    targetPort: 80            ##后端Pod的端口,需与Pod提供服务的端口一致

5,NodePort的创建

apiVersion: v1
kind: Service
metadata:
  name: Servicename
spec:
  type: NodePort            ##新增加的用于指定Service类型
  selector:
    app: httpd              ##和上一个一样用于做匹配关联
  ports:
  - protocol: TCP
    port: 8080              ##Service的端口
    targetPort: 80          ##后端容器端口
    nodePord: 30144         ##访问时通过“节点IP地址:端口”

6,CoreDNS

以域名的方式来访问Pod。

kubeDNS是前期版本kubernets中默认的dns组件

IPVS需要手动开启方可使用

7,Headless Service

没有IP地址的Service服务,主要用于StatefulSet(后边会讲到)

apiVersion: v1
kind: Service
metadata:
  name: Servicename
spec:
  selector:
    app: httpd                ##通过此标签自动匹配相同标签的Pod
  ports:
  - protocol: TCP
    port: 8080                ##Service的端口,客户端通过此端口访问
    targetPort: 80            ##后端Pod的端口,需与Pod提供服务的端口一致
  clusterIP: None             ##多出来的一条,就是为了说明此Service没有IP

8,相关命令

例:应用Service,查看Service,删除Service,查看endpoint信息:

kubectl apply -f Servicefiel.yaml
kubectl get service -o wide
kubectl delete service servicename
kubectl get endpoints

八,DaemonSet与Job

1,DamonSet是什么?

DaemonSet是另一种Pod控制器,不同于Deployment和rs。

2、DaemonSet和Deployment的区别是什么?

DaemonSet在每个节点都会自动生成一个pod跟随节点的变化而变化,节点存在则存在,节点消失则消失,而Deployment是始终维持副本数量。

3、Job和CronJob是什么,区别是什么?

job:一次性任务

cronjob:周期性任务,每执行依次都会生成一个一次性的pod

4,创建DaemonSet

通过yaml资源清单文件

apiVersion: apps/v1                ##版本不同
kind: DaemonSet                    ##类型不一样
metadata:
  name: DaemonSetname
spec:
  selector:
    matchLabels:
      app: nginx
  template:                        ##Pod模板信息
    metadata:
       labels:
         app: nginx
    spec:
      containers:
      - name: dockername
        image: nginx
        ports:
        - containerPort: 80

 5,创建一次性任务Job

通过yaml资源清单文件

apiVersion: batch/v1                ##版本不同
kind: Job                           ##类型不一样
metadata:
  name: Jobname
spec:
  selector:
    matchLabels:
      app: nginx
  template:                        ##Pod模板信息
    metadata:
       labels:
         app: nginx
    spec:
      containers:
      - name: dockername
        image: nginx
        command: ["/bin/bash","-c","-- sleep 30000"]
      restartPolicy: Never           ##重启策略,只能为Never或OnFailure
   backoffLimit: 3                   ##job失败后重启的次数

在deployment,restartPolicy还可以设置为always

6,创建CronJob

通过yaml资源清单文件,Cron Job不是Job的一种,属于不同Kind

apiVersion: batch/v1beta1                ##版本不同
kind: CronJob                           ##类型不一样
metadata:
  name: CronJobname
spec:
  schedule: "*/1 * * * *"             ##分时日月周
  jobTemplate:                        ##一次性任务的模板信息
    spec:
      template:                       ##Pod模板信息
        spec:
          containers:
          - name: dockername
            image: nginx
        command: ["/bin/bash","-c","-- sleep 30000"]
Kubernetes cluster      
     restartPolicy: OnFailure           ##重启策略,只能为Never或OnFailure

7,相关命令

例:应用,删除,查看一次性Job日志,查看job,cronjob,deamonset

kubectl apply -f filename.yaml
kubectl delete job jobname
kubectl delete cronjob cronjobname
kubectl delete deamonset deamonsetname
kubectl logs jobname
kubectl get job/cronjob/deamonset

九,Pod健康检查

1,概念

简单来说就是Kubernets借助不同种类的探针来检查Pod是否正常运行或正常提供服务

2,探针的种类

Liveness探针:存活探针,用于捕获容器是否处于存活状态,若失败,会尝试重启策略恢复容器。

Readiness探针:就绪探针,顾名思义,就是检查Pod是否准备好对外提供服务,若没有,则会将Pod从匹配的endpointcontroller中删掉。

3,实现方法Handler

两种种类的探针使用的都是以下三种实现方法。

ExecAction:在容器内执行命令来诊断是否成功。

TCPSockerAction:对指定端口上的容器的IP地址进行TCP检查,端口打开为成功。

HTTPGetAction:对指定端口上的容器的IP地址执行HTTP Get请求,若返回码>=200且<400,则为成功。

4、存活性探测livenessProbe和就绪性探测readinessProbe的区别是什么?

存活探针(livenessProbe

就绪探针(readinessProbe

Pod出错时

杀死出错Pod,重启Pod

等待

服务

Endpoint中自动更新Pod信息

Endpoint删除错误的Pod

功能

查看Pod是否存活

查看Pod是否准备好提供服务

5、两种探针都支持的三种探测方法是,检测判断依据是什么?

三种探测方式

判断依据

ExecAction

进入容器,执行一条命令

TCPSocketAction

Tcp端口是否成功

HTTPGetAction

Http服务获取值是否在[200,400)

6、探针探测结果有哪三种值?

三种探测方式

探测结果

ExecAction

0成功,其余失败

TCPSocketAction

Tcp端口打开则成功,否则为是被

HTTPGetAction

Http服务响应状态码在[200,400)为成功,否则为失败。

7,存活探针execaction

使用方法就是在pod资源清单文件中containers内容下加入如下代码:

spec:
  containers:
  - name: dockernaem
    image: centos
    args:
    - /bin/bash
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:                     ##探针的类型
      exec:                            ##探针的实现方法
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5            ##探测延迟5秒
      periodSeconds: 5                  ##探测周期5秒
        

默认情况下,三次探测失败,则认为容器不存活,一次探测成功,则认为容器存活。这个默认次数可变。

8,存活探针TCP

spec:
  containers:
  - name: dockername
    image: centos
    livenessProbe:                    ##探针类型
      tcpSocket:                      ##探针实现方法
        port: 23                      ##检查的端口
      initialDelaySeconds: 60
      periodSeconds: 20

9,存活探针HTTP

spec:
  containers:
  - name: dockername
    image: centos
    livenessProbe:                    ##探针类型
      httpGet:                        ##探针实现方法
        port: 8080
        httpHeaders:
        - name: headersname
          value:

10,就绪探针

把livernessProbe改为readinessProbe即可,其他都一样,只是处理方式不同。

十,Kubernetes存储

1,Kubernetes的存储方式

emptyDir:当Pod被成功分配到某个节点时,就会自动创建一个emptyDir,只要Pod在这个节点上,emptyDir就一直在,Pod无emptyDir也随之永远删除。虽方便,但不安全。

君生即我生,君去随君去

pod有,我就有,pod无,我也无

HostPath:需在pod被分配到的node节点上建一个目录,但因为不知道pod会被分配到哪个节点,所以要每个节点都建一个目录(弊端),pod删除后,目录及文件依然在。

君生伴我生,君去我不去

PV和PVC:pv:由管理员配置的一块存储空间,是集群中的资源,可以是NFS,云存储等等。PVC:用户的存储请求,去请求pv

2,emptyDir

就是在Pod的资源清单里通过volumes字段挂载

spec:
  containers:
  - image: centos
    name: docekrname
    volumeMounts:                    ##挂载卷
    - mountPath: /ceshi              ##容器内路径
      name: ceshi-volume             ##通过名字去匹配卷
  volumes:                           ##卷
  - name: ceshi-volume               ##卷名
    empytyDir: {}                    ##大小

3,HostPath

volumeMounts:
- mountPath: /tmp
  name: test
volumes:
- name: test
  hostPath:
    path: /tmp
    type: Directory

4,创建pv,pvc

apiVersion: v1
kind: PersistentVolume                    ##类型pv
metadata:
  name: jpzpv1
spec:
  capacity:                               ##大小
    storage: 1Gi
  accessModes:                            ##访问模式
  - ReadWriteMany                         ##多次读写
  persistentVolumeReclaimPolicy: Recycle  ##回收策略
  storageClassName: jpz-sc
  nfs:
    path: /nfs/jpzpv1
    server: 192.168.100.31

访问模式:Read'Write'Once: 读写模式,一个节点。

ReadOnlyMany:只读模式,多个节点。

Read Write Many:读写模式,多个节点,同时加载。

回收策略:Retain:保留,手动删除                Reycle:回收                Delete:删除

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jpzpvc1
spec:
  accessModes:                  ##和pv一样
  - ReadWriteMany
  volumeName: jpzpv1            ##匹配pv名
  resources:
    requests:
      storage: 1Gi

其实关于pv和pvc还有很多没有涉及到的,深入学习的话还需学习其它文章。

十一,ConfigMip与Secret

1,Config

用于保存非机密性的配置(明文配置),数据通过key--value的键值对形式存储,也可以是文件。

Config可以做成Volume,通过volume的方式映射到容器内部目录,从而实现对容器内部配置文件更方便的统一管理。局限性是数据不可超过1MB。

2,Secret

用于存放一些敏感数据内容,如密码,密钥等数据,保证这些数据不会暴露到镜像或者Pod Spec中。

十二,StatefulSet

1,无状态与有状态

无状态stateless:无持久化存储,IP地址变换,

有状态stateful:持久化的存储,通过pvc,稳定的网络,通过Headless Service,Pod基于序号的有序操作。

2,创建有状态的三个步骤

搭建存储服务器,如nfs,创建pv和pvc。创建StatefulSet(它包含了pvc)。创建Headless Se rvice,无固定IP的方式被请求。

十三,kubernets服务质量QoS

spec:
  containers:
  - name:
    image:
    resources:
      limits:
        memory: ""
        cpu: ""
      requests:
        memory: ""
        cpu: ""

1,Best-Effort

没有limit和request

2,Burstable

中级:一般limit>request

3,Guaranteed

最高级别,requests和limits数值一样

结语

后来老师讲了复习之后,我就感觉我写的太详细了,于是后边就写的简单了些,只写了考点,也是快考试没时间了,这篇文章就先这样吧,等到以后有时间了,我会把每一部分,尤其是后边的再细化,可以作为一个简单的学习手册来用。

这篇文章写了好长时间,因为一直有课,挺不容易的,一万三千字,大家多多支持吧!有错误的话欢迎指出。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐