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 编写
-
kubectl create 生产 yaml 文件
kubectl create deployment web --image=nginx -o yaml --dry-run > web.yaml
-
应用 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 调度的属性
- 资源限度 requests
- 节点选择器标签 nodeSelector
- 节点亲和性 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 污点:节点不做一般调配调度,针对特定场景调配,是节点中的属性
利用场景
- 专用节点
- 配置特点硬件节点
- 基于 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>
污点容忍
污点容忍就是某个节点可能被调度,也可能不被调度
–
–
–
–