Kubernetes资源清单
内容来自尚硅谷。
操作k8s其实就是操作k8s中的各种资源,这里记录一下资源相关内容。
资源清单格式
# 如果没有给定 group 名称,那么默认为 core
apiVersion: group/apiversion
# 资源类别
kind:
# 资源元数据
metadata:
name
namespace
lables
annotations # 主要目的是方便用户阅读查找
# 期望的状态(disired state)
spec:
# 当前状态,本字段有 Kubernetes 自身维护,用户不能去定义
status:
资源清单的常用命令
- 获取apiVersion版本信息
kubectl api-versions
- 获取资源的详细信息及字段设置帮助文档
# 以pod为例 kubectl explain pod
输出:
KIND: Pod VERSION: v1 DESCRIPTION: Pod is a collection of containers that can run on a host. This resource is created by clients and scheduled onto hosts. FIELDS: apiVersion <string> ........ ........
字段配置格式:
apiVersion <string> #表示字符串类型 metadata <Object> #表示需要嵌套多层字段 labels <map[string]string> #表示由k:v组成的映射 finalizers <[]string> #表示字串列表 ownerReferences <[]Object> #表示对象列表 hostPID <boolean> #布尔类型 priority <integer> #整型 name <string> -required- #如果类型后面接 -required-,表示为必填字段
通过定义清单文件创建Pod
创建方法
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
spec:
containers:
- name: myapp-1
image: nginx:latest
- name: myapp-2
iamge: mysql:latest
command:
- "/bin/sh"
- "-c"
- "sleep 60"
其中apiVersion
kind
metadata
spec
字段是必须的。
一种快速创建资源的方法是使用如下命令将已有资源的配置输出:
kubectl get pod xx.xx.xx -o yaml
# 使用json可以输出为json格式
或是试运行一个容器,输出配置:
kubectl run app --image=nginx --dry-run -o yaml
Init容器
用于在主容器启动前进行初始化,比如复制敏感文件等操作。
Init容器启动是串行执行的,其中任何一个的失败都会导致Pod启动失败。
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
- name: init-mydb
image: busybox
command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
检测探针-就绪检测
readinessProbe
检测不通过的话Pod不会进入Ready
状态。
apiVersion: v1
kind: Pod
metadata:
name: readiness-httpget-pod
namespace: default
spec:
containers:
- name: readiness-httpget-container
image: nginx
imagePullPolicy: IfNotPresent
readinessProbe:
httpGet:
port: 80
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3
检测探针-存活检测
livenessProbe
检测不通过的话重启Pod。
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec-pod
namespace: default
spec:
containers:
- name: liveness-exec-container
image: nginx
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","touch /tmp/live ; sleep 60; rm -rf /tmp/live; sleep 3600"]
livenessProbe:
exec:
command: ["test","-e","/tmp/live"]
initialDelaySeconds: 1
periodSeconds: 3
对于readinessProbe和livenessProbe,有三种方式进行检测:
- command
命令返回0即成功。# ... livenessProbe: exec: command: ["test","-e","/tmp/live"] # ...
- httpGet
状态码大于等于200且小于400即成功。# ... livenessProbe: httpGet: port: http path: /index.html # ...
- tcpSocket
连接成功即成功。# ... livenessProbe: tcpSocket: port: 80 # ...
启动、退出动作
lifecycle
在容器启动的前后进行操作。
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: nginx
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
preStop:
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStop handler > /usr/share/message"]
Comments NOTHING