K8S学习笔记03 YAML和POD

YAML文件

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

概述

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

基本语法

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

文件组成部分

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

示例
image.png

属性说明

属性名称 介绍 备注
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数据卷进行持久化存储

示例
image.png

镜像拉取策略 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创建容器

image.png

影响Pod调度的属性

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

image.png

节点选择器标签 nodeSelector
apiVersion: v1
kind:Pod
metadata:
  name: mypod
spec:
  nodeSelector:
    env_role: dev #或 prod
  continers:
  - name: nginx
    image: nginx:1.15       

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

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

kubectl label node k8s-node1 env_role=prod

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

image.png

支持常用操作符: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              

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              
web-5dcb957ccc-rttjh    1/1     Running   0          2m48s   10.244.2.5   k8s-node2              
web-5dcb957ccc-rvnt9    1/1     Running   0          2m48s   10.244.1.4   k8s-node1              
web-5dcb957ccc-rzwj6    1/1     Running   0          6m42s   10.244.2.3   k8s-node2              
web-5dcb957ccc-xw4lr    1/1     Running   0          2m48s   10.244.2.4   k8s-node2              

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              
web-5dcb957ccc-rttjh    1/1     Running   0          10m   10.244.2.5   k8s-node2              
web-5dcb957ccc-rzwj6    1/1     Running   0          14m   10.244.2.3   k8s-node2              
web-5dcb957ccc-vdxdn    1/1     Running   0          33s   10.244.2.7   k8s-node2              
web-5dcb957ccc-xw4lr    1/1     Running   0          10m   10.244.2.4   k8s-node2              

污点容忍

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

-
-
-
-

你可能感兴趣的:(kubernetes)