2021.4.22总结pod和controller
先随手记一下,有空再来二次总结
命令:
kubectl [command] [TYPE] [NAME] [flags]
kubectl get pods --namespace=kubesphere-logging-system
获取特定namespace的pod
kubectl get deploy --all-namespaces
查看所有namespaces
kubectl create 命令生成yaml文件
kubectl create deployment web --image=nginx -o yaml --dry-run >my1.yaml
第二中 kubectl get命令导出yaml文件
kubectl get deploy nginx -o=yaml --export> my2.yaml
概念:
Pod---k8s中创建和管理的最小单元,最小部署单元,不是容器
k8s不会直接处理容器,Pod包含多个容器,一组容器的集合
一个pod共享网络命名空间
pod是短暂的(重新创建ip不一致)
pod存在意义
(1)创建容器使用docker,一个docker对应一个容器,一个容器有进程,一个容器运行一个应用程序(docker单进程)
(2)pod是多进程设计,运行多个应用程序
一个pod有多个容器,一个容器里面运行一个应用。
(3)pod存在为了亲密性应用,
两个应用之间进行交互,网络之间调用,两个应用需要频繁调用。
pod的实现机制
(1)共享网络
容器本身之间相互隔离,namespace,group
前提条件:容器在同一个namespace下
pod实现共享网络机制;
首先创建pause容器(也叫info容器、根容器)
业务容器会加入info容器。所有业务容器在同一名称空间namespace中。info容器会独立拥有ip、mac、port
(2)共享存储
引入数据卷(类似docker挂载的数据卷)
pod持久化数据(1.日志数据 2.业务数据)
引入数据卷概念volume,使用数据卷进行持久化存储
挂载数据卷
volumeMounts:
-name:data
mountPath:/data
定义数据卷
volume:
-name:data
emptyDir:()
pod镜像拉取策略
apiVersion:v1
kind:pod
metadata:
name:mypod
spec:
containers:
- name:nginx
image:nginx:1.14
imagepullpolicy:Always
imagepullpolicy有三种策略
IfNotPresent:默认值,镜像在宿主机上不存在时才拉取
Always:每次创建pod都会重新拉取一次镜像
never:pod永远不会主动拉取这个镜像
pod资源限制:
确保pod最大合理化利用
resource:
request:
memory:64Mi“”
cpu:“250m”
limits:
memory:“128mi”
cpu“500m”
pod重启机制:
restartPolicy:
always:默认,退出后,总是重启onfailure:异常结束(退出状态码非0)后才重启
never:当容器终止退出,从不重启容器
pod健康检查
kubectl get pods
有时running但是不能对外提供服务(eg“java堆内存溢出”)
应用层面检查:
livenessprobe(存活检查)
如果检查失败,将杀死容器,根据pod的restartPolicy来操作
readlinessProbe(就绪检查)
如果检查失败,kubernate会把pod从serverice endpoints中剔除
调度策略
kubectl get pods -o wide查看详细信息
创建pod流程
create pod --apiserver--etcd
scheduler---apiserver--etcd---调度算法,把pod调度到某个node节点上
node节点:
kublet---apiserver--读取etcd拿到分配给当前节点pod---docker创建容器
影响调度的属性
1.pod资源限制
2.节点选择器影响标签
给节点打标签
语法
kubectl label nodes <node-name> <label-key>=<label-value>
3.节点亲和性对pod影响
节点亲和性 nodeAffinity
1)硬亲和性
约束条件必须满足
2)软亲和性
尝试满足,不保证绝对满足
支持常用操作符
In NotIn Gt ...
3)反亲和性
4.污点及污点容忍
nodeSelector,nodeAffinity
Taint污点:节点不做普通分配调度,是节点属性
2.场景
专用节点
配置特定硬件节点
基于taint驱逐
查看节点污点情况
kubectl describe node node01.k8s.org |grep Taint
污点值有三个
NoSchedule:一定不被调度
PreferNoSechdule:尽量不被调度
NoExecute:不会调度,并且还会驱逐node已有pod
添加污点
kubectl taint nodes node1 key=value:NoSchedule
污点容忍:
Controller
实际存在的
确保预期的pod副本数量
无状态应用部署
有状态应用部署
确保所有的node运行同一个pod
一次性任务和定时任务
controller---在集群上管理和运行容器的对象
pod和Controller关系
pod通过controller实现应用的运维,比如伸缩、滚动升级等等
pod和controller之间通过label来建立关系
3.deployment应用场景
部署无状态应用
管理pod和ReplicaSet
部署、滚动升级等功能
应用场景:web服务、微服务
使用deployment'部署应用(yaml)
kubectl create deployment web --image=nginx
第一步导出yml文件
kubectl create deployment web --image=nginx --dry-run -o yml>web.yml
修改yml
kubectl apply -f web.yml
对外发布 暴露端口号
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yml>web1.yml
kubectl apply -f web.yml
kubectl get pods.svc
升级回滚和弹性伸缩