今天聊一下Kubernetes 1.19.0——Pod(1)

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 pods -o wide查看pod运行至哪个worker节点上

kubectl get pod pod1 -o yaml 把pod的配置以yaml文件方式输出

kubectl get pod pod1 -o json 把pod的配置以json文件方式输出(这里不作演示)

kubectl run pod1 –image=nginx –image-pull-policy=IfNotPresent –dry-run

模拟创建,并不是真的创建,用于检查语法,类似于nginx里面的nginx -t

2. 通过yaml的方式来创建

  a.官方文档来获取

  b.命令行的方式来生成

kubectl run pod1 –image=nginx –image-pull-policy=IfNotPresent –dry-run=client -o yaml

快速生成一个yaml文件

kubectl apply -f pod1.yaml 通过apply来指定pod的yaml文件生成pod

每个缩进都是2空格

此pod里运行的程序则是镜像里CMD指定的那个

通过kubectl delete -f pod1.yaml来删除创建的pod(这里不作演示)

如果没有指定namespace,则是在当前的ns命名空间

通过kubectl explain pod 查看pod写法
创建pod时指定命名空间
加上command这一行,表示pod里容器运行的进程不再是nginx而是sleep
kubectl run pod2 –image=nginx –dry-run=client -o yaml — sh -c “sleep 100” > pod2.yaml

也可通过命令行来指定并运行

小结:

创建容器的时候,如果不指定特定的命令,则运行的是镜像CMD所指定的

Pod的基本操作

kubectl describe pod pod1查看pod的属性
获取pod的shell进程
kubectl cp pod1.yaml pod1:/opt/ 将物理机上pod1.yaml文件拷贝到pod1的opt目录下并查看

在pod里执行命令的话,kubectl exec podname — 要执行的命令

kubectl logs pod1获取日志输出

字典变量: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

以”-”为一个元素的形式排列叫列表变量

创建成功2个容器
但是过了一段时间发现只存活了一个容器,这是为什么呢?

这是因为这两个容器都映射到了80这个端口上面去,造成了端口的冲突

所以将pod1.yaml中containers下的第二个镜像按照之前的方法加上command让其运行指定的命令即可解决

第一个容器称之为叫主容器,第二个容器叫sidecar

kubectl exec pod1 -c c1 — ls /opt 查看指定容器下的路径

一般情况下,一个pod里包含一个容器

kubectl delete pod pod1正常情况下是直接把pod给你删除了

在k8s里,有一个优雅启停的概念,给我们设置了一个30s的间隔,如果30s内还没有关闭掉容器里的进程,才会给你强制关闭。

–grace-period可以指定这个间隔时间
也可在yaml文件中指定terminationGracePeriodSeconds的值

注:但是如果这里设置为1000,delete这个nginx的pod还是会马上kill掉,因为nginx本身关闭进程的机制和k8s是不一样的

Pod生命周期lifecycle

为了解决nginx会立即停止的这种机制,可以通过pod hook来实现

postStart:当容器启动起来后就运行一些操作

          postStart这个进程和主进程是同时进行的

preStop:在容器关闭之前运行一些操作

此操作未完成之前pod是不会被关闭的

修改一下yaml文件,然后apply新的配置文件

再通过watch -n .5 ‘kubectl get pods’监测pod的删除过程会发现过50s后会删除掉pod

再次修改yaml,添加两行command

第一个红框,表示先等待15秒再去写入CMD到aa.txt

第二个postStart表示等待5秒去写入post到aa.txt

由此可以看出,post和CMD相差大约10s
变量的值,如果是纯数字的话,记得要用引号引起来,不然会报错

第一个红框表示此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不会创建

修改内核参数

先pull alpine这个镜像,然后查看swappiness这个参数

为了防止容器随意修改内核参数,系统有了一个安全机制

修改yaml通过command将swappiness改成10,通过securityContext来实现安全机制

注:=号两端不能有空格

成功运行后,修改成功

正文完