学会灵活运用 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