学会灵活运用 kubectl
kubectl explain RESOURCE [options]
Use "kubectl api-resources" for a complete list of supported resources. #列出可用的资源清单
Pod资源
- 编写Pod的资源清单:pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
tier: frontend
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
- name: busybox
image: busybox
command:
- "/bin/sh"
- "-c"
- "sleep 3600"
Pod控制器
帮助:kubectl explain pod
清单:
一级:apiVersion,kind,metadata,spec,status
下面将讲述常用的例子
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
tier: frontend
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
- name: busybox
image: busybox
command:
- "/bin/sh"
- "-c"
- "sleep 3600"
pods.spec.containers
args字段=docker镜像中的CMD,若未定义,则docker镜像中的CMD作为参数传给args
command字段=docker镜像中的entrypoint,若未定义,则docker镜像中的entrypoint作为参数传给args
标签
标签过滤器
kubectl get pods -l
例:
kubectl get pods -l app (带有app标签的显示出来)
给pod打标签
kubectl label pods pod-demo release=canary
标签选择器
1.等值关系: = , ==, !=
例: kubectl get pods -l release=stable,app=myapp (将标签带有stable和myapp的显示出来)
2. 集合关系:
KEY in (VALUE1,VALUE2 ...)
KEY noin (VALUE1,VALUE2...)
KEY
!KEY
例:kubectl get pods -l "release in (canary,beta,alpha)"
kubectl get pods -l "release notin (canary,beta,alpha)"
许多资源支持内嵌的字段定义其使用的标签选择器:
matchLabels: 直接给定键值
matchExpressions: 基于给定的表达式来定义使用标签选择器,{key:"KEY",operator:"OPERATOR",values:[VAL1]....}
操作符:
In,NotIn: values字段的值必须非空列表
Exists,NotExists: values字段的值必须为空列表
节点标签选择器
nodeSelector <map[string]string>
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
tier: frontend
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
- name: busybox
image: busybox
command:
- "/bin/sh"
- "-c"
- "sleep 3600"
nodeSelector:
disktype: ssd
创建在带有node标签有disktype=ssd上
nodeName <string> #运行在指定节点
annotations:
与label不同的地方在于,它不能用于挑选资源对象,仅用于为对象提供"元数据"。
Pod容器生命周期
Status状态
pending
Pod已被K8S系统接受,但有一个或多个容器镜像尚未创建。等待时间包括调度Pod的时间和下载时间
Running
该Pod已经绑定到了一个节点上,Pod中所有的容器都创建。至少有一个容器正在运行,或者正处于启动或
重启状态
Succeeded
Pod中所有的容器都被成功终止,并且不会再重启
Failed
Pod中的所有容器都被成功终止,并且至少有一个容器是因为失败终止。也就是,容器非0状态退出
或被系统终止
unknown
因为某些原因无法取得Pod的状态,通常是因为与Pod所在主机通信失败

创建Pod:
Pod生命周期中的重要行为:
初始化容器
重启策略
restartPolicy:
Always, OnFailure,Never,default to always
探测
容器检测:
Readness:就绪检测
liveness:生存检测
lifecycle:生命周期
探针
由kubelet对容器执行的定期诊断。要执行诊断,kubelet调用由容器实现的Handler。有三种类型的处理程序:
ExecAction:在容器内执行指定命令。如果命令退出时返回码为0则认为诊断成功
TCPSocketAction:对指定端口上的容器的IP地址进行TCP检查。如果端口打开,则诊断被认为是成功的。
HTTPGetAction:对指定的端口和路径上的容器的IP地址执行HTTPGet请求。如果响应的状态码大于等于200
且小于400,则诊断被认为是成功的
每次探测都将获得以下三种结果之一:
成功
失败
未知
例子: kubectl create -f liveness-exec.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec-pod
namespace: default
spec:
containers:
- name: liveness-exec-container
image: busybox:latest
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","touch /tmp/healthy;sleep 30;rm /tmp/healthy -f;sleep 3600"]
livenessProbe:
exec:
command: ["test","-e","/tmp/healthy"]
initialDelaySeconds: 1
periodSeconds: 3
Comments NOTHING