youki2008
作者youki2008·2020-06-29 15:19
系统架构师·DDT

kubernetes系列06—kubernetes资源清单定义入门

字数 10118阅读 939评论 0赞 3

kubernetes系列06—kubernetes资源清单定义入门

转载自(https://www.cnblogs.com/along21/p/10313341.html)

1、认识kubernetes资源

1.1 常用资源 / 对象

  • workload工作负载型资源:pod,ReplicaSet,Deployment,StatefulSet,daemonset,job...
  • 服务器发现及均衡:Service,Lngress...
  • 配置与存储:volume,CSI

    • configmap,secret
    • downwardAPI
  • 集群级资源

    • namespace,node,role,clusterrole,rolebinding,clusterrolebinding
  • 元数据型资源

    • HPA,podtemplate,limitrange

1.2 创建资源的方法

  • apiserver 仅接受 JSON 格式的资源定义;
  • yaml 格式提供配置清单 , apiserver 可自动将其转为 JSON 格式,而后再提交;

1.3 大部分(主流)资源的配置清单:有 5 个一级字段组成

  • apiserver : group/version

    • 查询当前支持哪些 apiserver : $ kubectl api-versions
  • kind :资源类别
  • metadata :元数据

    • name :名称
    • namespace :名称空间
    • labels :标签
    • annotation :资源注解
    • selfLink :每个资源的引用 PATH , /api/GROUP/VERSION/namespaces/NAMESPACE/TYPE/NAME
  • spec :期望的状态( disired state ),期望资源应该用于什么特性
  • status :当前状态( current state ),本字段由 kubernetes 集群维护,用户不能自己定义

1.4 使用 kubectl explain 查询每个资源如何配置

( 1 )例如查询如何定义 pod 资源
[root@master ~]# kubectl explain pod
KIND: Pod
VERSION: v1

DESCRIPTION:
Pod is a collection of containers that can run on a host. This resource iscreated by clients and scheduled onto hosts.

FIELDS:

  apiVersion ... ...
  kind ... ...

metadata ... ...
spec

( 2 )能一级一级进入查询;如查询定义 pod 的 metadata 字段
[root@master ~]# kubectl explain pod.spec
KIND: Pod
VERSION: v1
RESOURCE: spec
DESCRIPTION:
... ...
FIELDS:
... ..
affinity

自己定义资源时,不清楚如何定义,可以进行快速的查询

1.5 示例

( 1 )查询集群中的 pod (上篇创建的 pod )
[root@master ~]# kubectl get pods

NAME READY STATUS RESTARTS AGE
client 1/1 Running 0 4h
myapp-848b5b879b-9slqg 1/1 Running 0 46m
myapp-848b5b879b-wtrjr 1/1 Running 0 46m
myapp-848b5b879b-z2sqc 1/1 Running 0 46m

( 2 ) -o yaml 输出为 yaml 格式,查看 pod 创建的操作
[root@master ~]# kubectl get pod myapp-848b5b879b-9slqg -o yaml

apiVersion: v1 #api版本
kind: Pod #资源类别
metadata: #元数据
annotations:
cni.projectcalico.org/podIP: 10.244.1.60/32
labels:
pod-template-hash: "4046164356"
run: myapp
name: myapp-848b5b879b-9slqg
namespace: default
... ...
selfLink: /api/v1/namespaces/default/pods/myapp-848b5b879b-9slqg

spec: #规格、规范;期望资源应该用于什么特性;期望目标状态
... ...

status: #当前状态
... ...

1.6 演示:基于 yaml 格式文件,创建 pod

[root@master ~]# mkdir manifests

[root@master ~]# cd manifests/

( 1 )编写 pod-demo.yaml 文件

创建 2 个容器,一个运行 nginx ;一个在 busybox 中执行 sleep 命令
[root@master manifests]# vim pod-demo.yaml

apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default

labels: {app:myapp, tier:frontend} #映射可以写为{}形式;

labels: #也可以在下边分级写
app: myapp
tier: frontend

spec:
containers:

  • name: myapp
    image: ikubernetes/myapp:v1
  • name: busybox
    image: busybox:latest
    \#command: ["/bin/sh","-c","sleep 3600"] #列表可以写为[]形式;
    command: #也可以在下边分级写,要加-
  • "/bin/sh"
  • "-c"
  • "sleep 3600"

( 2 )基于 pod-demo.yaml 文件创建 create pod
[root@master manifests]# kubectl create -f pod-demo.yaml

pod/pod-demo created

( 3 )验证

① 查询创建 pod 的信息

[root@master manifests]# kubectl create -f pod-demo.yaml

pod/pod-demo created

[root@master manifests]# kubectl get pods -o wide

NAME READY STATUS RESTARTS AGE IP NODE
pod-demo 2/2 Running 0 1m 10.244.1.61 node1

---查看详细信息

[root@master manifests]# kubectl describe pods pod-demo

Name: pod-demo
Namespace: default
... ...

② 访问 pod 中的服务

[root@master manifests]# curl 10.244.1.61

Hello MyApp | Version: v1 | Pod Name

---查询pod产生的日志

[root@master manifests]# kubectl logs pod-demo myapp

192.168.130.104 - - [23/Jan/2019:05:35:35 +0000] "GET / HTTP/1.1" 200 65 "-" "curl/7.29.0" "-"

③ 基于 yaml 文件删除 pod

[root@master manifests]# kubectl delete -f pod-demo.yaml

pod "pod-demo" deleted

[root@master manifests]# kubectl get pods

No resources found.

2 、 Pod 资源

2.1 Pod 资源常用选项

  • metadata.label :标签

    • key=value

      • key :字母、数字、 _ 、 - 、 .
      • value :可以为空,只能字母或数字开头及结尾,中间可使用字母、数字、 _ 、 - 、 .
  • metadata.annotations :资源注解
  • spec.containers <[]object>

      • name :容器名称
    • image :镜像
    • imagePullPolicy :下载镜像规则,若镜像时 latest 标签,默认是 Always ;否则默认 IfNotPresen

      • Always 总是镜像, Never 不下载镜像, IfNotPresent 本地有则不下载
    • ports :从容器中公开的端口列表

      • containerPort : Pod 中服务的端口号
      • hostIP :暴露绑定在主机哪个 IP 上
      • hostPort :暴露在主机的端口号
      • name :暴露这个端口的名称
    • args :参数
    • command :执行命令
  • spec.nodeSelector :节点标签选择器

2.2 演示

( 1 )修改 pod-demo.yaml 文件
[root@master manifests]# vim pod-demo.yaml

apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default

labels: {app:myapp, tier:frontend} #映射可以写为{}形式;

labels: #也可以在下边分级写

app: myapp
tier: frontend
annotations:
along.com/created-by: "cluster admin"

spec:
containers:

  • name: myapp
    image: ikubernetes/myapp:v1

ports:

  • name: http
    containerPort: 80
  • name: https
    containerPort: 443
  • name: busybox
    image: busybox:latest
    imagePullPolicy: IfNotPresent

\#command: ["/bin/sh","-c","sleep 3600"] #列表可以写为[]形式;

command: #也可以在下边分级写,要加-

  • "/bin/sh"
  • "-c"
  • "sleep 3600"
    nodeSelector:
    disktype: ssd

( 2 )将 node1 节点打上 disktype=ssd 的标签

[root@master manifests]# kubectl label node node1 disktype=ssd

[root@master manifests]# kubectl get nodes node1 --show-labels

NAME STATUS ROLES AGE VERSION LABELS
node1 Ready 140d v1.11.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/hostname=node1

( 3 )基于 yaml 文件创建 pod

[root@master manifests]# kubectl create -f pod-demo.yaml
pod/pod-demo created

( 4 )验证

--- pod只会创建到node1节点上,因为node1的disktype=ssd标签

[root@master manifests]# kubectl get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE
pod-demo 2/2 Running 0 11s 10.244.1.68 node1

--- -l 指定标签,实现标签过滤

[root@master manifests]# kubectl get pods --show-labels -l app

NAME READY STATUS RESTARTS AGE LABELS
pod-demo 2/2 Running 0 30s app=myapp,tier=frontend

3 、 Pod 健康检测

3.1 pod 健康检测介绍

  • pod 健康检测分为 存活性探测、 就绪型探测 ;这在生产环境几乎是必须配置的;
  • 如果没有就绪型探测; pod 一启动就会被分配用户流量;若 pod 中的服务像 tomcat 等,需要时间启动;就会导致有一定时间,用户访问不到服务;
  • 如果没有存活性探测: pod 中服务一旦失败,没有检测,不会将容器重启关闭;也会导致用户访问服务失败。

3.2 pod 健康检测选项

( 1 )在 spec 字段下、 containers 字段配置,可使用 explain 查看详细用法

$ kubectl explain pod.spec.containers.

  • livenessProbe 存活性探测

    • exec :指定检测的命令
    • failureThreshold :连续失败次数被认为失败,默认为 3 ,最小值为 1
    • httpGet :指定要执行的 http 请求
    • initialDelaySeconds :在容器启动多少秒后再检测
    • periodSeconds :每隔多少秒探测一次;默认为 10 秒。最低限度值是 1
    • successThreshold :连续成功次数认为服务正常
    • tcpSocket :定涉及 TCP 端口的操作
    • timeoutSeconds: 探测超时的秒数,默认为 1 秒
  • readinessProbe 就绪型探测 (和 livenessProbe 存活性探测选项一样)

    ( 2 ) pod 中容器挂了,是否重启 pod

$ kubectl explain pod.spec.restartPolicy.

  • Always :总是重启(默认)
  • OnFailure :只有容器状态为错误时,才重启
  • Never :绝不重启

3.3 演示: exec 方式实现存活性探测

( 1 )编写 yaml 文件

当探测到 /tmp/healthy 文件不存在时,认为服务故障;

容器在 30 秒后执行删除 /tmp/healthy 文件
[root@master manifests]# vim 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 -f /tmp/healthy; sleep 3600"]

livenessProbe:
exec:
command: ["test","-e","/tmp/healthy"]
initialDelaySeconds: 1 #在容器启动后1秒开始检测
periodSeconds: 3 #每隔3秒探测一次
restartPolicy: Always #总是重启pod

( 2 )创建运行 pod

[root@master manifests]# kubectl create -f liveness-exec.yaml

pod/liveness-exec-pod created

[root@master manifests]# kubectl get pods

NAME READY STATUS RESTARTS AGE
liveness-exec-pod 1/1 Running 0 6s

( 3 )等 30s ,容器就会检测失败,重启 pod ;使用 describe 可以查看详细信息

[root@master manifests]# kubectl describe pods liveness-exec-pod

... ...
State: Running
Started: Wed, 23 Jan 2019 16:58:09 +0800
Last State: Terminated #上次状态为终止
Reason: Error
Exit Code: 137
Started: Wed, 23 Jan 2019 16:57:01 +0800
Finished: Wed, 23 Jan 2019 16:58:09 +0800
Ready: True
Restart Count: 1 #重启次数1次
Liveness: exec [test -e /tmp/healthy] delay=1s timeout=1s period=3s #success=1 #failure=3

... ...

3.4 演示: httpget 方式实现存活性探测

( 1 )编写 yaml 文件,创建并运行 pod

当探测不到容器内 80 端口,和提供 80 端口的 /index.html 文件时,认为服务故障;

[root@master manifests]# vim liveness-httpget.yaml

apiVersion: v1
kind: Pod

metadata:
name: liveness-httpget-pod
namespace: default

spec:
containers:

  • name: liveness-exec-container
    image: ikubernetes/myapp:v1
    ports:
  • name: http
    containerPort: 80

livenessProbe:
httpget:
port: http
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3
restartPolicy: Always

[root@master manifests]# kubectl create -f liveness-httpget.yaml

pod/liveness-httpget-pod created

( 2 )手动连入容器,删除 index.html 文件

[root@master manifests]# kubectl exec -it liveness-httpget-pod -- /bin/sh

/ # rm -f /usr/share/nginx/html/index.html

( 3 )容器会检测失败,重启 pod ;使用 describe 可以查看详细信息

[root@master manifests]# kubectl describe pods liveness-httpget-pod

... ...
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Wed, 23 Jan 2019 17:10:03 +0800
Last State: Terminated #上次状态为终止
Reason: Completed
Exit Code: 0
Started: Wed, 23 Jan 2019 17:08:22 +0800
Finished: Wed, 23 Jan 2019 17:10:03 +0800
Ready: True
Restart Count: 1 #重启次数1次

Liveness: http-get http://:http/index.html delay=1s timeout=1s period=3s #success=1 #failure=3

... ...

3.5 演示: exec 方式实现就绪性探测

( 1 )编写 yaml 文件,创建启动容器

当探测到 /tmp/healthy 文件不存在时,就认为服务就绪不成功; pod 启动失败;

[root@master manifests]# vim readiness-exec.yaml

apiVersion: v1
kind: Pod

metadata:
name: readiness-exec-pod
namespace: default

spec:
containers:

  • name: readiness-exec-container
    image: busybox:latest
    imagePullPolicy: IfNotPresent

    command: ["/bin/sh","-c","touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 3600"]

    command: ["sleep 3600"]

readinessProbe:
exec:
command: ["test","-e","/tmp/healthy"]
periodSeconds: 3
restartPolicy: Always

[root@master manifests]# kubectl create -f readiness-exec.yaml

pod/readiness-exec-pod created

( 2 )查看, pod 启动就绪失败

[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
readiness-exec-pod 0/1 RunContainerError 1 12s

4 、 Pod 启动前 / 后钩子

4.1 介绍

  • pod 在启动前后都可以设置钩子 hook ;在 spec.containers.lifecycle 字段下设置;
  • postStart :创建容器后立即调用 PostStart 操作;如果失败,根据重启策略终止;
  • preStop :在容器终止之前立即调用 PreStop 操作,该容器在处理程序完成后终止

4.2 语法

$ kubectl explain pod.spec.containers.lifecycle

  • postStart

    • exec :指定了要采取的命令;
    • httpGet :指定要执行的 http 请求 ;
    • tcpSocket :指定涉及 TCP 端口的操作
  • preStop (和 postStart 命令一样)

4.3 演示:使用 exec 设置 pod 启动前钩子

( 1 )编写 yaml 文件,创建启动容器

启动容器前,先创建准备一个 httpd 服务的主页面文件 /tmp/index.html

[root@master manifests]# vim poststart-pod.yaml

apiVersion: v1
kind: Pod

metadata:
name: poststart-pod
namespace: default

spec:
containers:

  • name: poststart-container
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    lifecycle:
    postStart:
    exec:
    command: ['/bin/sh','-c','echo hello > /tmp/index.html']
    command: ['/bin/sh','-c','/bin/httpd -f -h /tmp']

[root@master manifests]# kubectl create -f poststart-pod.yaml
pod/poststart-pod created

( 2 )验证,访问服务

[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
poststart-pod 1/1 Running 0 26s 10.244.2.69 node2
[root@master ~]# curl 10.244.2.69

hello

作者:along阿龙
出处:http://www.cnblogs.com/along21/
简介:每天都在进步,每周都在总结,你的一个点赞,一句留言,就可以让博主开心一笑,充满动力!
版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

3

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广