简介:
Kubernetes 资源清单
Pod生命周期
探针
Kubernetes 资源清单
在 k8s 中,一般使用 yaml 格式的文件来创建符合我们预期期望的 pod ,这样的 yaml 文件我们一般
称为资源清单
资源清单格式
apiVersion: group/apiversion # 如果没有给定 group 名称,那么默认为 core,可以使用 kubectl api- versions # 获取当前 k8s 版本上所有的 apiVersion 版本信息( 每个版本可能不同 )
kind: #资源类别
metadata: #资源元数据
name
namespace
lables
annotations # 主要目的是方便用户阅读查找
spec: # 期望的状态(disired state)
status:# 当前状态,本字段有 Kubernetes 自身维护,用户不能去定义
资源清单常用命令
获取 apiversion 版本信息
[root@k8s-master01 ~]# kubectl api-versions admissionregistration.k8s.io/v1beta1 apiextensions.k8s.io/v1beta1 apiregistration.k8s.io/v1 apiregistration.k8s.io/v1beta1 apps/v1 ......(以下省略)
获取资源的 apiVersion 版本信息
[root@k8s-master01 ~]# kubectl explain pod KIND: Pod VERSION: v1 .....(以下省略) [root@k8s-master01 ~]# kubectl explain Ingress KIND: Ingress VERSION: extensions/v1beta1
获取字段设置帮助文档
[root@k8s-master01 ~]# 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: hub.atguigu.com/library/myapp:v1 - name: busybox-1 image: busybox:latest command: - "/bin/sh" - "-c" - "sleep 3600"
运行创建上面pod.yaml文件
$ kubectl apply -f pod.yaml
pod/pod-demo created
或者
$ kubectl create -f pod.yaml
pod/pod-demo created
查看pod状态
kubectl get pod
查看运行的pod详情
kubectl describe pod pod-demo
查看容器日志(pod-demo pod名,-c 指定容器名,如果该pod里面只有一个容器,可不加-c)
kubectl log pod-demo -c myapp-1
注:当容器报错了,先用 kubectl describe pod pod-demo 查看pod详情,找到异常容器,再查看异常容器日志排查
kubectl get pod xx.xx.xx -o yaml
<!--使用 -o 参数 加 yaml,可以将资源的配置以 yaml的格式输出出来,也可以使用json,输出为json格式-->
Pod生命周期
init容器
Pod 能够具有多个容器,应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的 Init容器
Init 容器与普通的容器非常像,除了如下两点:
Init 容器总是运行到成功完成为止
每个 Init 容器都必须在下一个 Init 容器启动之前成功完成
如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,
如果 Pod 对应的 restartPolicy 为 Never,它不会重新启动。
Init 容器具有与应用程序容器分离的单独镜像
init模板
$ vim init-pod.yaml
apiVersion: v1 kind: Pod #pod类型 metadata: name: myapp-pod #pod名称 labels: #标签 app: myapp spec: #详细描述信息 containers: - name: myapp-container #容器名 image: busybox #用的镜像 command: ['sh', '-c', 'echo The app is running! && sleep 3600'] #启动时执行命令,取代CMD initContainers: #初始化上面的容器 - name: init-myservice #定义第一个初始化容器 image: busybox command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;'] #until: 当条件为真时,退出循环. nslookup myservice:解析域名 - name: init-mydb #定义第二个初始化容器 image: busybox command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
创建pod
kubectl create -f init-pod.yaml
查看网络
kubectl get svc
可以查看日志看到上面会一直重新解析,是因为没有该解析,就会一直尝试解析
创建svc (service简称)
$vim myservice.yaml kind: Service apiVersion: v1 metadata: name: myservice spec: ports: - protocol: TCP port: 80 targetPort: 9376 #暴露到svc的端口
$ vim mydb.yaml kind: Service apiVersion: v1 metadata: name: mydb spec: ports: - protocol: TCP port: 80 targetPort: 9377
创建pod
$ kubectl create -f myservice.yaml
$ kubectl create -f mydb.yaml
然后查看,即可看到初始化成功
$ kubectl get pod
查看svc状态(可看到已添加解析)
$ kubectl get svc
探针
探针是由
kubelet 对容器执行的定期诊断。要执行诊断,kubelet 调用由容器实现的 Handler。有三种类型的处理程序:
ExecAction:在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。
TCPSocketAction:对指定端口上的容器的 IP 地址进行 TCP 检查。如果端口打开,则诊断被认为是成功的。
HTTPGetAction:对指定的端口和路径上的容器的 IP 地址执行 HTTP Get 请求。如果响应的状态码大于等于200 且小于 400,则诊断被认为是成功的
检测探针 - 就绪检测
$ vim read.yaml apiVersion: v1 kind: Pod metadata: #元数据信息 name: readiness-httpget-pod namespace: default spec: #详细描述 containers: - name: readiness-httpget-container image: wangyanglinux/myapp:v1 imagePullPolicy: IfNotPresent #镜像下载策略,如果有就不下载 readinessProbe: #就绪检测 httpGet: #检测方案 port: 80 path: /index1.html initialDelaySeconds: 1 #初始化检测延时,这个容器在启动1秒以后,启用初始化检测 periodSeconds: 3 #重试时间
创建pod
kubectl create -f read.yaml
进入容器
kubectl get pod kubectl exec readiness-httpget-pod -c readiness-httpget-container -it -- /bin/sh #如果pod中只有一个容器,可不指定-c
检测探针 - 存活检测
livenessProbe-exec
$ vim live-exec.yaml apiVersion: v1 kind: Pod metadata: name: liveness-exec-pod namespace: default spec: containers: - name: liveness-exec-container image: hub.atguigu.com/library/busybox 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
kubectl create -f live-exec.yaml
livenessProbe-httpget
$ vim live-http.yaml apiVersion: v1 kind: Pod metadata: name: liveness-httpget-pod namespace: default spec: containers: - name: liveness-httpget-container image: hub.atguigu.com/library/myapp:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 livenessProbe: httpGet: port: http path: /index.html #检测能否通过http的方式获取到这个文件 initialDelaySeconds: 1 periodSeconds: 3 timeoutSeconds: 10
kubectl create -f live-http.yaml
livenessProbe-tcp
$ vim live-tcp.yaml apiVersion: v1 kind: Pod metadata: name: probe-tcp spec: containers: - name: nginx image: hub.atguigu.com/library/myapp:v1 livenessProbe: initialDelaySeconds: 5 timeoutSeconds: 1 tcpSocket: port: 80
kubectl create -f live-tcp.yaml
启动、退出动作
$ vim post.yaml 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"]
kubectl create -f post.yaml