前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes 1.19.0——Pod(1)

Kubernetes 1.19.0——Pod(1)

原创
作者头像
gz_naldo
修改2020-09-21 09:54:24
6500
修改2020-09-21 09:54:24
举报
文章被收录于专栏:CloudComputingCloudComputing

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 pods -o wide查看pod运行至哪个worker节点上
kubectl get pod pod1 -o yaml 把pod的配置以yaml文件方式输出
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
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
kubectl run pod1 --image=nginx --image-pull-policy=IfNotPresent --dry-run=client -o yaml

快速生成一个yaml文件

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

每个缩进都是2空格

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

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

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

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

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

小结:

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

Pod的基本操作

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

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

kubectl logs pod1获取日志输出
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个容器
创建成功2个容器
但是过了一段时间发现只存活了一个容器,这是为什么呢?
但是过了一段时间发现只存活了一个容器,这是为什么呢?

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

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

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

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

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

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

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

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

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

Pod生命周期lifecycle

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

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

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

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

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

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

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

再次修改yaml,添加两行command
再次修改yaml,添加两行command

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

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

由此可以看出,post和CMD相差大约10s
由此可以看出,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这个参数
先pull alpine这个镜像,然后查看swappiness这个参数

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

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

注:=号两端不能有空格

成功运行后,修改成功

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建pod的方法
    • 1. 直接使用命令行的方式
      • 2. 通过yaml的方式来创建
      • Pod的基本操作
      • Pod生命周期lifecycle
      • 容器的状态
      • 初始化容器
        • 修改内核参数
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档