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
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
污点容忍
污点容忍就是某个节点可能被调度,也可能不被调度
-
-
-
-