YAML文件

K8S集群中,通过YAML(资源清单文件)来对资源管理和资源对象编排部署

概述

  • YAML仍是一种标记语言。
  • YAML是一个可读性高,用来表白数据序列的格局。

根本语法

  • 应用空格缩进
  • 空格数不重要,只有雷同层级元素左侧对齐即可
  • 低版本缩进不容许应用Tab,只容许空格
  • 应用#标识正文,正文整行
  • 应用---标识新的yaml文件开始

文件组成部分

  • 控制器定义 (开始 ~ template)
  • 被管制对象 (template ~ 完结):镜像、版本、端口等

示例

属性阐明

属性名称介绍备注
apiVersionAPI版本kubectl api-versions
kind资源类型kubectl api-resources
metadata资源元数据
spec资源规格
replicas正本数量
selector标签选择器
templatePod模板
metadataPod元数据
specPod规格
containers容器配置

YAML编写

  1. kubectl create 生产yaml文件

    kubectl create deployment web --image=nginx -o yaml --dry-run > web.yaml 
  2. 应用kubectl get导出yaml文件

    kubectl get deploy nginx -o=yaml --export > web2.yaml

POD

基本概念

  • Pod是k8s中可创立和治理的最小单元和资源对象模型
  • Pod是由一个或多个容器组成的(根容器Pause + N个用户业务容器)
  • 一个Pod中的容器共享网络命名空间
  • Pod是短暂存在的

存在意义

  • 一个容器(Docker)一个过程,运行一个利用
  • Pod是多过程设计,运行多个利用
  • Pod是为了亲密性利用(交互,网络,频繁 调用)产生的

实现机制

  • 共享网络:通过Pause容器,把其余业务容器退出到Pause容器里,让所有业务在同一个命名空间中,实现网络共享
  • 共享存储:应用Volume数据卷进行长久化存储

示例

镜像拉取策略 imagePullPolicy

apiVersion: v1kind:Podmetadata:  name: mypodspec:  containers:  - name: nginx    image: nginx:1.14    imagePullPolicy: Always # IfNotPresent:默认值,镜像在宿主机上不存在才拉取# Always:每次创立Pod都会从新拉取一次镜像# Never:Pod永远不会被动拉取这个镜像

资源限度 resources

  • request:示意调度所需的资源
  • limits:示意最大所占用的资源
apiVersion: v1kind:Podmetadata:  name: mypodspec:  containers:  - name: db    image: mysql    env:    - name: MYSQL_ROOT_PASSWORD      value: "password"    resouces:      requests:         memory: "64Mi"        cpu: "250m"        limits:         memory: 128Mi"        cpu: "500m"            # 1核 = 1000m          

重启机制 restartPolicy

apiVersion: v1kind:Podmetadata:  name: mypodspec:  containers:  - name: busybox    image: busybox:1.28.4    args:    - /bin/sh    - -c    - sleep 36000  restartPolicy: Never# Always:当容器终止退出后,总是重启容器,默认策略 【nginx等,须要一直提供服务】# OnFailure:当容器异样退出(退出状态码非0)时,才重启容器。# Never:当容器终止退出,从不重启容器 【批量工作】            

健康检查

  • 存活查看(livenessProbe):如果查看失败,将杀死容器,依据Pod的restartPolicy操作
  • 就绪查看(readinessProbe):如果查看失败,K8S会把Pod从service endpoints中剔除

    apiVersion: v1kind:Podmetadata:name: mypodspec:containers:- name: busybox  image: busybox  args:  - /bin/sh  - -c  - touch /tmp/healthy;sleep 30;rm -rf /tmp/healthy  livenessProbe:     exec:      command:      - cat      - /tmp/healthy    initialDelaySeconds: 5    periodSeconds: 5

    Probe反对三种查看办法

  • http Get:发送HTTP申请,返回200 - 400 范畴状态码为胜利
  • exec:执行Shell命令返回状态码是0为胜利
  • tcpSocket:发动TCP Socket建设胜利

调度策略

创立Pod流程

  • 首先创立一个pod,而后创立一个API Server 和 Etcd【把创立进去的信息存储在etcd中】
  • 而后创立 Scheduler,监控API Server是否有新的Pod,如果有的话,会通过调度算法,把pod调度某个node上
  • 在node节点,会通过 kubelet -- apiserver 读取etcd 拿到调配在以后node节点上的pod,而后通过docker创立容器

影响Pod调度的属性

  1. 资源限度 requests
  2. 节点选择器标签 nodeSelector
  3. 节点亲和性 nodeAffinity
资源限度 requests

节点选择器标签 nodeSelector
apiVersion: v1kind:Podmetadata:  name: mypodspec:  nodeSelector:    env_role: dev #或 prod  continers:  - name: nginx    image: nginx:1.15       

节点选择器,其实就是有两个环境,而后环境之间所用的资源配置不同

通过label命令给节点新增标签,节点选择器就会进行调度了
kubectl get nodeskubectl label node k8s-node1 env_role=prodkubectl get nodes --show-labels
节点亲和性 nodeAffinity
  • 硬亲和性:约束条件必须满足
  • 软亲和性:尝试满足,不保障

反对罕用操作符:in、NotIn、Exists、Gt、Lt、DoesNotExists

反亲和性:就是和亲和性刚刚相同,如 NotIn、DoesNotExists等

污点和污点容忍

Taint 污点:节点不做一般调配调度,针对特定场景调配,是节点中的属性

利用场景

  1. 专用节点
  2. 配置特点硬件节点
  3. 基于Taint驱赶

查看污点状况

kubectl describe node k8smaster | grep TaintTaints:             node-role.kubernetes.io/master:NoSchedule

为节点增加污点

污点值:

  • NoSchedule:肯定不被调度
  • PreferNoSchedule:尽量不被调度【也有被调度的几率】
  • NoExecute:不会调度,并且还会驱赶Node已有Pod
kubectl taint node [node] key=value:污点值

示例
1.创立pod

kubectl create deployment web --image=nginx#删除podkubectl delete deployment web
kubectl get deploymentsNAME    READY   UP-TO-DATE   AVAILABLE   AGEnginx   1/1     1            1           25hweb     1/1     1            1           17s
kubectl get pods -o wideNAME                    READY   STATUS    RESTARTS   AGE    IP           NODE        NOMINATED NODE   READINESS GATESweb-5dcb957ccc-rzwj6    1/1     Running   0          2m7s   10.244.2.3   k8s-node2   <none>           <none>

2.扩容 kubectl scale

kubectl scale deployment web --replicas=5
kubectl get pods -o wide#随机调配到2个节点NAME                    READY   STATUS    RESTARTS   AGE     IP           NODE        NOMINATED NODE   READINESS GATESweb-5dcb957ccc-p9pkv    1/1     Running   0          2m48s   10.244.1.5   k8s-node1   <none>           <none>web-5dcb957ccc-rttjh    1/1     Running   0          2m48s   10.244.2.5   k8s-node2   <none>           <none>web-5dcb957ccc-rvnt9    1/1     Running   0          2m48s   10.244.1.4   k8s-node1   <none>           <none>web-5dcb957ccc-rzwj6    1/1     Running   0          6m42s   10.244.2.3   k8s-node2   <none>           <none>web-5dcb957ccc-xw4lr    1/1     Running   0          2m48s   10.244.2.4   k8s-node2   <none>           <none>

3.打上污点

kubectl taint node k8s-node1 env_role=yes:NoExecute

查看污点

kubectl describe node k8s-node1 | grep TaintTaints:             env_role=yes:NoExecute
kubectl get pods -o wide#节点都被驱赶到k8s-node2了NAME                    READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATESweb-5dcb957ccc-jdc2q    1/1     Running   0          33s   10.244.2.6   k8s-node2   <none>           <none>web-5dcb957ccc-rttjh    1/1     Running   0          10m   10.244.2.5   k8s-node2   <none>           <none>web-5dcb957ccc-rzwj6    1/1     Running   0          14m   10.244.2.3   k8s-node2   <none>           <none>web-5dcb957ccc-vdxdn    1/1     Running   0          33s   10.244.2.7   k8s-node2   <none>           <none>web-5dcb957ccc-xw4lr    1/1     Running   0          10m   10.244.2.4   k8s-node2   <none>           <none>

污点容忍

污点容忍就是某个节点可能被调度,也可能不被调度

-
-
-
-