设为首页 收藏本站
查看: 2239|回复: 0

[经验分享] pod

[复制链接]

尚未签到

发表于 2018-1-6 15:34:05 | 显示全部楼层 |阅读模式
pod定义详解
  下面是一个完整的yaml格式定义的文件,注意格式,子集包含关系,不要有tab,要用空格。不是所有的元素都要写,按照实际应用场景配置即可。
  定义一个简单pod(最好把docker源改成国内的)
  

apiVersion: v1  
kind: Pod
  
metadata:
  name: hello-world
  namespace: default
  
spec:
  restartPolicy: OnFailure
  containers:
  - name: hello
  image: "ubuntu:14.04"
  command: ["/bin/echo","hello","world"]
  pod文件解释:
  apiVersion: v1//k8s版本
  kind: pod//声明API对象类型这里是pod
  metadata:
  name:hello-word //pod名字必须在namespace中是唯一
  spec://配置pod具体配置
  restartPolicy: OnFailure  // pod重启策略  [Always默认策略,当容器退出时总是重启容器|Never当容器退出时,从不重启|OnFailure容器正常退出不会再重新启动,退出码非0时才重启容器]
  containers: //pod中的容器列表,可以有多个容器
  - name: hello //容器名字,在一个pod中唯一
  image: "ubuntu:14.04" //镜像名字
  command: ["/bin/echo","hello","word"]//设置容器的启动命令
  

  创建pod
[iyunv@kubernetes-master pods]# kubectl create -f helloworld.yml

  pod "hello-word" created
  查看pod状态,状态不是runing而是完成,说明容器运行完成已经退出了

  查看容器log输出
[iyunv@kubernetes-master pods]# kubectl logs hello-world

  hello world
  这里要说一下command和args2个参数:

  pod中定义env
  容器获取pod信息

  

apiVersion: v1  

kind: Pod  

metadata:  

name: print-pod-info  

namespace: default  

spec:  

containers:  

- name: my-pod  

image: busybox  

resources:  

requests:  

memory: "32Mi"  

cpu: "125m"  

limits:  

memory: "64Mi"  

cpu: "250m"  

env:  

- name: MY_POD  

valueFrom:  

fieldRef:  

fieldPath: metadata.name  

- name: MY_POD_NAMESPACE  

valueFrom:  

fieldRef:  

fieldPath: metadata.namespace  

- name: MY_POD_IP  

valueFrom:  

fieldRef:  

fieldPath: status.podIP  

- name: MY_POD_SERVICE_ACCOUNT  

valueFrom:  

fieldRef:  

fieldPath: spec.serviceAccountName  

- name: MY_CPU_REQUEST  

valueFrom:  

resourceFieldRef:  

containerName: my-pod  

resource: requests.cpu  

- name: MY_CPU_LIMIT  

valueFrom:  

resourceFieldRef:  

containerName: my-pod  

resource: limits.cpu  

- name: MY_MEM_REQUEST  

valueFrom:  

resourceFieldRef:  

containerName: my-pod  

resource: requests.memory  

- name: MY_MEM_LIMIT  

valueFrom:  

resourceFieldRef:  

containerName: my-pod  

resource: limits.memory  

command: ["/bin/sh","-c","while true;do sleep 5;done"]  


my_api.yaml  解释:
  

env:  - name: MY_POD   定义的变量名字最好是大写
  valueFrom:     获取pod中的信息这个是固定的
  fieldRef:    获取pod中的信息这个是固定的
  fieldPath: metadata.name   获取pod中的信息这个是固定的
  

  定义普通变量:
  

env:  - name: MY_POD   定义的变量名字最好是大写
  value: "massage......"  变量的值
  

  端口:
  配置nginx

  

apiVersion: v1  

kind: Pod  

metadata:  

name: my-nginx  

namespace: default  

spec:  

containers:  

- image: nginx  

imagePullPolicy: IfNotPresent  

name: nginx  

ports:  

- name: web  

containerPort: 80   //容器内部端口  

protocol: TCP          //协议可选  

hostIP: 0.0.0.0      //worknodeIP可选,0.0.0.0就是任意选择  

hostPort: 8000     //worknode(宿主机)上的端口  


View Code  提示:
  ports.name  这个值在pod中也是唯一的,当配置一个端口的时候是可选的,多个端口是必选。
  如果同时2个pod的的宿主机端口都是80那么k8s会将容器分别调度到没有占用80端口机器上启动
  数据持久化和共享

  

piVersion: v1  

kind: Pod  

metadata:  

name: newhello  

namespace: default  

spec:  

restartPolicy: Never  

containers:  

- name: write  

image: "ubuntu:14.04"  

command: ["/bin/sh","-c","echo \"hello word\" >> /data/hello"]  

volumeMounts:  

- name: data             挂在下面定义卷data  

mountPath: /data    挂载到容器中的目录  

- name: read  

image: "ubuntu:14.04"  

command: ["bash","-c","sleep 10; cat /data/hello"]  

volumeMounts:  

- name: data  

mountPath: /data  

volumes:         定义卷  

- name: data    卷名字  

hostPath:       宿主机  

path: /tmp    宿主机路径  


View Code  查看结果
[iyunv@kubernetes-master pods]# kubectl logs newhello read

  hello word
  pod生命周期:
  1、 Pending:kubernetes已经开始创建Pod,但是Pod中的一个或多个容器还没有被启动。比如Pod正处在应该被分配到哪个节点上这个调度过程中,或者kubernetes还在从镜像仓库中下载Pod中容器镜像这个下载过程中。
  2、 Running:kubernetes已经将Pod分配到节点上,并且Pod中的所有容器都启动了。还包括Pod中至少有一个容器仍然在运行状态,或者正在重新启动状态。
  3、 Succeeded:Pod中的所有容器都处在终止状态,并且这些容器是自主正常退出到终止状态的,也就是退出代码为0,而且kubernetes也没有重启任何容器。
  4、 Failed:Pod中的所有容器都处在终止状态,并且至少有一个容器不是正常终止的,也就是退出代码不为0,或者是由于系统强行终止的。
  5、 Unknown:由于一些特殊情况无法获取Pod状态,比如由于网络原因无法同Pod所在的主机通讯。
  变量Phase的取值还取决于结构体PodSpec中的RestartPolicy变量,这个RestartPolicy变量是用来设置Pod中容器重启策略的,包括三个可选值,分别是Always、OnFailure和Never。

  这三个值得含义分别是:
  1、Always:表示对容器一直执行重启策略。如果不设置RestartPolicy,那么Always是默认值。
  2、OnFailure:表示在容器失败的时候重启容器。
  3、 Never:表示在对容器不执行重启策略。
  总结一下pod重启策略和容器退出后。pod状态
  
  pod生命周期回调
  主要作用就是在容器开始的时候做一个动作,容器停止的时候做一个动作

  

apiVersion: v1  

kind: Pod  

metadata:  

name: javaweb2  

namespace: default  

spec:  

containers:  

- image:ubuntu:14.04  

name: war  

lifecycle:  

postStart:  

exec:  

command:  

- "cp"  

- "/sample.war"  

- "/app"  

preStop:  

httpGet:  

host: monitor.com  

path: /warning  

port: 8080  

scheme: HTTP  


View Code  PostStart:容器创建成功后回调
  PreStop :容器终止前回调
  自定义pod检查
  在很多实际场景下,仅仅使用进程级健康检查还远远不够。有时,从Docker的角度来看,容器进程依旧在运行;但是如果从应用程序的角度来看,代码处于死锁状态,即容器永远都无法正常响应用户的业务
  为了解决以上问题,Kubernetes引人了一个在容器内执行的活性探针(Liveness Probe)和(Readiness Probe)的概念,以支持用户自己实现应用业务级的健康检查。这些检查项由Kubelet代为执行,以确保用户的应用程序正确运转,至于什么样的状态才算“正确”,则由用户自己定义。
  1Liveness Probe 容器自定义检查,检查失败容器被杀死,然后根据pod重启策略来做
  2Readiness Probe 检查失败直接从代理后端移除,既不会分发请求给改pod。
  Kubernetes支持3种类型的应用健康检查动作,分别为HTTP Get、Container Exec和TCP Socket。个人感觉exec的方式还是最通用的,因为不是每个服务都有http服务,但每个服务都可以在自己内部定义健康检查的job,定期执行,然后将检查结果保存到一个特定的文件中,外部探针就不断的查看这个健康文件就OK了。
  HTTPget:
  path URL路径
  port 端口
  host 请求IP
  scheme:求情协议默认HTTP
  Kubelet将调用容器内Web应用的web hook,如果返回的HTTP状态码在200和399之间,则认为容器运转正常,否则认为容器运转不正常。每进行一次HTTP健康检查都会访问一次指定的URL。给出httpGet的简单示例如下:

  

[iyunv@k8s-master livenessProbe]# cat test-livenessprobe.yaml  

apiVersion: v1  

kind: Pod  

metadata:  

labels:  

name: test-livenessprobe  

name: test-livenessprobe  

spec:  

containers:  

- name: test-livenessprobe  

image: registry:5000/back_demon:1.0  

livenessProbe:  

httpGet:  

path: /starott_cloud_client/test/overview-frontend  

port: 8080  

initialDelaySeconds: 15  

periodSeconds: 5  

timeoutSeconds: 1  

command:  

- /run.sh  


HTTPGET  TCP Socket:
  tcpSocket:
  port:8080
  检查tcp端口8080是否正常
  Exec:
  exec:
  command:
  这里拿exec做例子演示Liveness Probe和Readiness Probe区别:

  

apiVersion: v1  

kind: Pod  

metadata:  

name: livemess-probe  

labels:  

test: liveness  

spec:  

containers:  

- name: libeness  

image: "ubuntu:14.04"  

command:  

- /bin/sh  

- -c  

- echo ok > /tmp/health; sleep 30;rm -rf /tmp/health;sleep 600  

livenessProbe:  

exec:  

command:  

- cat  

- /tmp/health  

initialDelaySeconds: 15  

timeoutSeconds: 1  


livenessProbe  注意看restarts数值

  30秒后容器重启了

  查看错误日志
  kubectl describe pod livemess-probe |grep Unhealthy

  Readiness Probe实验

  容器状态还是running但是k8s不会往这个pod上转发数据
  日志查询:
  一个pod中2个容器,一个正常退出一个异常退出。重启策略O:nFailure,异常退出时在重启容器

  

apiVersion: v1  

kind: Pod  

metadata:  

name: logs-pod  

namespace: default  

spec:  

restartPolicy: OnFailure  

containers:  

- name: cont1  

image: "ubuntu:14.04"  

command: ["bash","-c","echo \"cont1:`date --rfc-3339 ns`\";exit 0"]  

- name: cont2  

image: "ubuntu:14.04"  

command: ["bash","-c","echo \"cont2:`date --rfc-3339 ns`\";exit 1"]  


logs-pod.yml  查看容器1和容器2日志
[iyunv@kubernetes-master pods]# kubectl logs logs-pod cont1

  cont1:2017-07-11 13:15:41.122936441+00:00
[iyunv@kubernetes-master pods]# kubectl logs logs-pod cont2

  cont2:2017-07-11 13:21:40.452165906+00:00
  查看日志历史,有的时候会出现查询不到当前日志,我们就 可意查询上一次容器打的日志。加上这个--previous
[iyunv@kubernetes-master pods]# kubectl logs logs-pod cont2 --previous

  cont2:2017-07-11 13:21:40.452165906+00:00
  定义持久化日志

  

apiVersion: v1  

kind: Pod  

metadata:  

name: logs-pod  

namespace: default  

spec:  

restartPolicy: OnFailure  

containers:  

- name: cont1  

terminationMessagePath: /dev/termination-log  

image: "ubuntu:14.04"  

command: ["bash","-c","echo \"cont1:`date --rfc-3339 ns`\" >> /dev/termination-log;"]  


View Code  用到的参数terminationMessagePath:
[iyunv@kubernetes-master pods]# kubectl get pod logs-pod --template="{{range .status.containerStatuses}}{{.state.terminated.message}}{{end}}" --show-all

  cont1:2017-07-11 13:28:03.421374195+00:00
  远程连接容器
  1、exec(功能强大)
  2、attach(这个比较麻烦)
  远程执行命令并返回
[iyunv@kubernetes-master pods]# kubectl exec mysql -- date

  Tue Jul 11 13:42:44 UTC 2017
  进入pod容器
[iyunv@kubernetes-master pods]# kubectl exec -ti mysql  /bin/bash

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-432260-1-1.html 上篇帖子: arun 下篇帖子: 用ingress的方式部署jenkins,启动后提示没有下载插件,未解决
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表