kubernetes学习笔记1(资源对象篇)
什么是资源对象文件?概念?k8s通过RC/RS管理pod,在RC中定义如何启动运行pod,启动几副本等功能,如果我们自己创建一个yaml格式的文件呢,提前给他定义好呢,这个yaml格式的文件就是我们的资源对象文件。我的理解差不多就是----一个自己定义好的脚本或者ansible-playbook剧本。资源对象文件有什么用?1.可以创建、管理、删除资源对象2.很多的复杂的功能光靠命令实现不了,这些复
什么是资源对象文件?概念?
k8s通过RC/RS管理pod,在RC中定义如何启动运行pod,启动几副本等功能,如果我们自己创建一个yaml格式的文件呢,提前给他定义好呢,这个yaml格式的文件就是我们的资源对象文件。我的理解差不多就是----一个自己定义好的脚本或者ansible-playbook剧本。
资源对象文件有什么用?
1.可以创建、管理、删除资源对象
2.很多的复杂的功能光靠命令实现不了,这些复杂难以实现的就需要用资源文件描述
怎么使用资源文件管理对象呢?
先看看资源文件管理对象的3个命令
create 创建资源对象
apply 声明更新资源对象
delete 删除资源对象
#个人建议apply,效果更佳,反正我个人不喜欢create
格式:kubectl (apply | create | delete) -f 资源文件
栗子:kubectl apply -f myweb.yaml
deployment.extensions "myweb" created #输出这个,就是创建成功
验证:kubectl get deployment myweb #可以看到出现了该资源
删除:kubectl delete -f myweb.yaml
注意注意!!!
1.如果不能补全建议先安装tab设置
设置kubectl
kubectl completion bash >/etc/bash_completion.d/kubectl
设置kubeadm
kubeadm completion bash >/etc/bash_completion.d/kubeadm
exit #需要退出重新进去验证
2.如果误删了资源对象文件
亲,这边建议你从deployment控制器删到RS再删到pod
不然你直接干pod,控制器会再给你创建一个
pod无法自愈,但是控制器可以给他治愈,所以先杀他的老大
1.pod资源文件
--- #看到三条横线大家就知道了,学过ansible的都知道,资源定义起始标志
kind: Pod #当前创建资源的类型
apiVersion: v1 #当前格式的版本
metadata: #当前资源的元数据
name: mypod #当前资源的名字,也就是pod
spec: #当前资源的详细定义
containers: #从这里开始就是容器的定义
- name: myhaha #容器名称,多个容器在一个pod中名字不能重复
image: 192.168.242.10/myos:v1818 #启动容器的镜像地址
stdin: true #-i参数,分配标准输出
tty: true #-t参数,分配终端
怎么验证呢?
kubectl apply -f mypod.yaml #创建
kubectl get pod #查看
2.deploy资源文件
--- #资源定义标志
kind: Deployment #当前创建资源的类型
apiVersion: app/v1 #当前格式的版本
metadata: #当前资源的元数据
name: myhaha #当前资源deployment的名字
spec: #当前资源的详细定义
selector: #资源匹配选择器,主要确定资源的方式
matchLabels: #匹配卷标
app: myapp #具体匹配的东西,和labels内定义相同
replicas: 1 #pod副本数量
template: #资源模板
标签和选择器!!!
为了建立控制器和pod的关联,k8s先给每个pod打上一个标签(label),然后再给相应的位置定义标签选择器(label selector),怎么用这些标签呢?答案是在资源文件中引用
selector #控制器中声明定义标签选择器
app: myapp-app #为服务的后端选择标签 和下面的标签一致
metadata: #pod中定义声明标签
labels: #声明标签
app: myapp-app #定义标签名字 !!!上下标签必须一致
那么因此我们可以写一个apache的资源对象文件
这里不做过多解释,看我操作就完了
--- #起始
kind: Deployment #资源的类型
apiVersion: app/v1 #版本
metadata: #元数据
name: myapache #deployment的名字
spec: #详细配置信息
selector: #选择器
matchLabels: #标签选择
myapp: http #标签,在pod中定义
replicas: 1 #以上是pod和控制器的定义,副本数量
template: #以下是定义容器
metadata:
labels:
myapp: http #定义标签,在其他地方被引用
spec: #容器详细定义
containers: #容器定义
- name: webcluster #容器名字
image: 192.168.242.10:5000/myos:http #镜像地址
stdin: false #标准输入,默认是false,服务容器可以省略
tty: false #终端,默认false,服务容器可以省略
ports: #端口
- protocol: TCP #服务使用的协议
containerPort: 80 #容器监听的端口
restartPolicy: Always #创建 Pod 时,如果 restartPolicy 不写,默认为:Always
容器重启策略Always
验证正确
kubectl apply -f apache.yaml
kubectl get deployments.apps
kubectl get pod
kubectl get pod -o wide 查看更详细
3.DaemonSet控制器
daemonset是什么?
daemonset 每个机器都要启动运行的pod,确保全部或者一些node上运行pod副本
1.当有node加入集群时,也会为他新增pod副本,当node从集群移除时,这些pod也会回收
2.删除daemonset时将删除他创建的所有pod
3.典型应用:ceph节点,监控节点,filebeat日志收集
4.系统服务kube-proxy,flannel就是这种
daemonset和deployment的区别是什么?
2者之间非常相似,区别在于不需要设置replicas,因为daemonset是每节点启动
了解daemonset是什么了,该干正事了,该怎么写呢
---
kind: DaemonSet #控制器类型
apiVersion: apps/v1 #控制器版本
metadata:
name: mynginx #控制器名称
spec:
selector:
matchLabels:
myapp: nginx
template: #以下容器模板配置
metadata:
labels:
myapp: nginx
spec:
containers:
- name: nginxcluster
image: 192.168.242.10:5000/myos:nginx
stdin: false
tty: false
ports:
- protocol: TCP
containerPort: 80
restartPolicy: Always
怎么验证呢?
kubectl apply -f mynginx.yaml #先跑一遍
kubectl get pod -o wide 查看pod,你会发现3个pod分别运行在不同的节点
我们会发现一个有趣的现象,daemonset会调度在除master以外的所有节点上
master节点除了一些系统服务以外不会有其他pod
为什么其他pod不在master上部署,这里我们要说到污点策略了,后面会单独讲讲污点策略
污点策略
有哪些污点标签呢?
NoSchedule 不会被调度
PreferNoSchedule 尽量不调度
NoExecute 驱逐节点
查看master的污点策略
kubectl describe node master
可以看到
Tains: node-role.kubernetes.io/master:NoSchedule
建议kubectl describe nodes | grep -P “^Tains” 过滤一下
设置污点策略
kubectl taint node node-0001 key=value:NoSchedule
删除污点策略
kubectl taint node node-0001 key-
一定要加key,不加弄不了
容忍
有些时候我们需要无视污点标签进行操作,这种方式叫对污点的容忍
在哪加呢?
答案是pod.spec这里添加,不要加到容器配置那去了,是pod配置那
tolerations: #声明容忍规则
- key: "node-role.kubernetes.io/master" #键key
operator: "Equal" #Equal完全匹配,Exists键存在即可
value: "" #值value
effect: "NoSchedule" #容忍策略
4.Job资源对象
job是什么?
job也叫单任务控制器,负责执行一次任务,保证任务在一个或者多个pod上执行成功
如果运行一个pod,当第一个pod失败或者被删除(比如:节点硬件失效或者重启)时,job对象会启动一个新pod,直到任务完成
删除job时,会清除所创建的全部pods
---
apiVersion: batch/v1 #当前格式版本
kind: Job #当前资源类型
metadata:
name:pi
spec:
template:
spec:
containers:
- name: pi
image: 192.168.242.10:5000/myos:v1818
command: ["perl","-Mbignum=bpi","-wle","print bpi(2000)"] #命令
restartPolicy: OnFailure #重启策略,只支持[Onfailure,Never]
5.Cronjob资源对象
job的升级版吧,重复多次任务控制器,他是基于时间管理的job,典型用法:周期性计划任务
Cronjob的本质是在约定的时间创建job
在job中会保留最后三次的状态,其他会清除
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-pi
spec:
schedule: "*/1 * * * *" #每分钟创建一个job
jobTemplate:
spec:
template:
spec:
containers:
- name: pi
image: 192.168.242.10:5000/myos:v1818
command: ["perl","-Mbignum=bpi","wle","print bpi(500)"]
restartPolicy: OnFailure
6.其他对象
Statefulset有状态服务相关POD
为了解决有状态服务设计的一种控制器
基于PVC的稳定持久化存储
稳定的网络标志,基于Headless Service
有序部署,有序扩展/收缩,基于init containers实现
Horizontal pod autoscaling控制器
自动扩展,可以根据业务的高峰和低谷自动水平扩展pod节点,提高资源利用率
花了一个下午写的,给个赞呗
更多推荐
所有评论(0)