乐趣区

关于kubernetes:K8S学习笔记03-YAML和POD

YAML 文件

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

概述

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

根本语法

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

文件组成部分

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

示例

属性阐明

属性名称 介绍 备注
apiVersion API 版本 kubectl api-versions
kind 资源类型 kubectl api-resources
metadata 资源元数据
spec 资源规格
replicas 正本数量
selector 标签选择器
template Pod 模板
metadata Pod 元数据
spec Pod 规格
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: v1
kind:Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx:1.14
    imagePullPolicy: Always 

# IfNotPresent:默认值,镜像在宿主机上不存在才拉取
# Always:每次创立 Pod 都会从新拉取一次镜像
# Never:Pod 永远不会被动拉取这个镜像

资源限度 resources

  • request:示意调度所需的资源
  • limits:示意最大所占用的资源
apiVersion: v1
kind:Pod
metadata:
  name: mypod
spec:
  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: v1
kind:Pod
metadata:
  name: mypod
spec:
  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: v1
    kind:Pod
    metadata:
    name: mypod
    spec:
    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: v1
kind:Pod
metadata:
  name: mypod
spec:
  nodeSelector:
    env_role: dev #或 prod
  continers:
  - name: nginx
    image: nginx:1.15       

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

通过 label 命令给节点新增标签,节点选择器就会进行调度了

kubectl get nodes

kubectl label node k8s-node1 env_role=prod

kubectl get nodes --show-labels
节点亲和性 nodeAffinity
  • 硬亲和性:约束条件必须满足
  • 软亲和性:尝试满足,不保障

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

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

污点和污点容忍

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

利用场景

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

查看污点状况

kubectl describe node k8smaster | grep Taint

Taints:             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

#删除 pod
kubectl delete deployment web
kubectl get deployments

NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           25h
web     1/1     1            1           17s
kubectl get pods -o wide

NAME                    READY   STATUS    RESTARTS   AGE    IP           NODE        NOMINATED NODE   READINESS GATES
web-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 GATES
web-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 Taint

Taints:             env_role=yes:NoExecute
kubectl get pods -o wide

#节点都被驱赶到 k8s-node2 了
NAME                    READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
web-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>

污点容忍

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




退出移动版