关于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>

污点容忍

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




评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理