K8s中最小的调度单位,pod里包含的是容器,也就是说pod是最终对外提供服务的
所有的资源都是以命名空间进行隔离
创建pod的方法
1. 直接使用命令行的方式
kubectl run 名字 -image=镜像 –labels=”aa=bb,aa2=bb2…” –env=”k1=v1” –port=80 –image-pull-policy=策略
建议写的时候,能够把镜像下载策略写进去
Always:不管本地有没有镜像读取下载
IfNotPresent:本地有则优先使用本地,本地没有再去下载
Never:本地即使没有也不去下载
kubectl get pod pod1 -o json 把pod的配置以json文件方式输出(这里不作演示)
模拟创建,并不是真的创建,用于检查语法,类似于nginx里面的nginx -t
2. 通过yaml的方式来创建
a.官方文档来获取
b.命令行的方式来生成
快速生成一个yaml文件
每个缩进都是2空格
通过kubectl delete -f pod1.yaml来删除创建的pod(这里不作演示)
如果没有指定namespace,则是在当前的ns命名空间
也可通过命令行来指定并运行
小结:
创建容器的时候,如果不指定特定的命令,则运行的是镜像CMD所指定的
Pod的基本操作
在pod里执行命令的话,kubectl exec podname — 要执行的命令
字典变量:Xx1=yy1
Xx2=yy2
Xx3=yy3
Xx4=yy4
这种格式叫做字典,字典中的元素是不能重复的,如果有重复的话则后面的变量会覆盖前面的变量。比如如果再加一个Xx1=zz,那最终Xx1的值就会是zz
列表变量:-xx1=yy1
xx2=yy2
xx3=yy3
xx4=yy4
-xx1=yy1
xx2=yy2
xx3=yy3
xx4=yy4
以”-”为一个元素的形式排列叫列表变量
这是因为这两个容器都映射到了80这个端口上面去,造成了端口的冲突
第一个容器称之为叫主容器,第二个容器叫sidecar
一般情况下,一个pod里包含一个容器
kubectl delete pod pod1正常情况下是直接把pod给你删除了
在k8s里,有一个优雅启停的概念,给我们设置了一个30s的间隔,如果30s内还没有关闭掉容器里的进程,才会给你强制关闭。
注:但是如果这里设置为1000,delete这个nginx的pod还是会马上kill掉,因为nginx本身关闭进程的机制和k8s是不一样的
Pod生命周期lifecycle
为了解决nginx会立即停止的这种机制,可以通过pod hook来实现
postStart:当容器启动起来后就运行一些操作
postStart这个进程和主进程是同时进行的
preStop:在容器关闭之前运行一些操作
此操作未完成之前pod是不会被关闭的
再通过watch -n .5 ‘kubectl get pods’监测pod的删除过程会发现过50s后会删除掉pod
第一个红框,表示先等待15秒再去写入CMD到aa.txt
第二个postStart表示等待5秒去写入post到aa.txt
第一个红框表示此pod生命周期10s
第二个红框的策略表示pod里的进程执行完了则会通过重启来重新运行
Always:总是重启
OnFailure:非正常退出才重启
Never:从不重启
容器的状态
Pending pod 因为其他的原因导致pod准备开始创建 还没有创建(卡住了)
Running pod已经被调度到节点上,且容器工作正常
Completed pod里所有容器正常退出
error
CrashLoopBackOff 创建的时候就出错,属于内部原因
imagePullBackoff 创建pod的时候,镜像下载失败
初始化容器
初始化容器的概念
比如一个容器A依赖其他容器,可以为A设置多个
依赖容易A1,A2,A3
A1,A2,A3要按照顺序启动,A1没有启动启动起来的
话,A2,A3是不会启动的,直到所有的静态容器全
部启动完毕,主容器A才会启动。
如果初始化容器失败,则会一直重启,pod不会创建
修改内核参数
为了防止容器随意修改内核参数,系统有了一个安全机制
注:=号两端不能有空格
成功运行后,修改成功