本文收录在容器技术学习系列文章总目录

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 is
created by clients and scheduled onto hosts. FIELDS:
apiVersion <string>
... ...
kind <string>
... ... metadata <Object>
... ...
spec <Object>
... ...
status <Object>
... ...

  

(2)能一级一级进入查询;如查询定义pod 的metadata字段

[root@master ~]# kubectl explain pod.spec
KIND: Pod
VERSION: v1 RESOURCE: spec <Object> DESCRIPTION:
... ... FIELDS:
... ..
affinity <Object>
... ...
[root@master ~]# kubectl explain pod.spec.containers
KIND: Pod
VERSION: v1 RESOURCE: containers <[]Object> DESCRIPTION:
... ...
FIELDS:
args <[]string>
... ...
command <[]string>
... ...

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

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 | <a href="hostname.html">Pod Name</a>
---查询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 <none> 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

  

kubernetes系列06—kubernetes资源清单定义入门的更多相关文章

  1. Kubernetes 学习5 kubernetes资源清单定义入门

    一.kubernetes是有一个restful风格的 API,把各种操作对象都一律当做资源来管理.并且可通过标准的HTTP请求的方法 GET,PUT,DELETE,POST,等方法来完成操作,不过是通 ...

  2. kubernetes 资源清单定义入门

    k8s中的资源 什么叫资源? k8s中所有的内容都抽象为资源, 资源实例化之后,叫做对象 在k8s中有哪些资源? 工作负载型资源(workload): Pod ReplicaSet Deploymen ...

  3. 5、kubernetes资源清单定义入门

    使用配置清单创建资源 定义pod时使用yaml格式 master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE client / Error 1 ...

  4. Kubenetes 资源清单定义入门

    Kubernetes 常用资源 资源  对象 工作负载型资源对象(workload): Pod  Replicaset  ReplicationController  Deployments Stat ...

  5. k8s学习笔记之四:资源清单定义入门

    第一章.k8s中的资源 1.什么叫资源? k8s中所有的内容都抽象为资源, 资源实例化之后,叫做对象 2.在k8s中有哪些资源? 工作负载型资源(workload): Pod ReplicaSet D ...

  6. 04-kubernetes 资源清单定义入门

    目录 资源对象 创建资源的方法 清单帮助命令 创建测试清单 资源的三种创建方式 资源对象 workload:Pod, ReplicaSet, Deployment, StatefulSet, Daem ...

  7. 四,k8s集群资源清单定义入门

    目录 资源对象 创建资源的方法 清单帮助命令 创建测试清单 资源的三种创建方式 资源对象 workload:Pod, ReplicaSet, Deployment, StatefulSet, Daem ...

  8. k8s资源清单定义入门

    1.资源分类 a.workload型资源:service.pod.deployment.ReplicaSet.StatefulSet.Job.Cronjob; b.服务发现及服务均衡资源型资源:Ser ...

  9. 4、kubernetes资源清单快速入门190625

    一.资源清单概念 资源/对象的类型 工作负载型资源:Pod, ReplicaSet, Deployment, StatefulSet, DaemonSet, Job, Cronjob, ... 服务发 ...

随机推荐

  1. MicroSoft CryptoAPI data/file encrypt/decrypt

    linux 用第三方库 Crypto++, 还未实战. CryptoAPI使用两种密钥:会话密钥与公共/私人密钥对.会话密钥使用相同的加密和解密密钥,这种算法较快,但必须保证密钥的安全传递.公共/私人 ...

  2. jquery项目中一些常用方法

    1.获取url中的参数 function getUrlParam(name) {    var reg = new RegExp("(^|&)" + name + &quo ...

  3. 找一个数组的最大和的连续子数组(时间复杂度 O(n))(二)

    要求: 要求数组从文件读取. 如果输入的数组很大,  并且有很多大的数字,  就会产生比较大的结果 (考虑一下数的溢出), 请保证你的程序能正常输出. 另外, 如果输入文件的参数有错误, 这个程序应该 ...

  4. linux df -i 100%处理

    发现空间是足够的,然后df -i 查看了下inodes,发现根目录下的inodes值使用率为100%了 解决方法:通过以下脚本进行检查,查看到底哪个目录下面的文件最多: find / -xdev -p ...

  5. 有关promise的技巧

    其实promise的作用是将异步的代码转化为同步,这里的异步指的是request1,request2.

  6. javabean简介

    Javabean简介 JavaBean是一个可重复使用的软件组件.实际上JavaBean是一种Java类,通过封装属性和方法成为具有某种功能或者处理某个业务的对象,简称bean.由于javabean是 ...

  7. mysql根据查询结果批量更新多条数据(插入或更新)

    mysql根据查询结果批量更新多条数据(插入或更新) 1.1 前言 mysql根据查询结果执行批量更新或插入时经常会遇到1093的错误问题.基本上批量插入或新增都会涉及到子查询,mysql是建议不要对 ...

  8. HBuilder git使用-建立仓库,邀请用户

    1.git环境配置好后,在Github上注册好帐号 2. 创建一个Respository(代码仓库) 3.邀请其他小组用户(必须的,要不别人提交不了修改) 4.把邀请链接要COPY给其他用户 5. 其 ...

  9. jenkins:一键回滚站点集群

    最近在学习jenkins过程中整理了大量资料,都收录在<jenkins自动化工具使用教程>,但依然缺少一些具体实现细节. 这篇文章,介绍jenkins做集群回滚时的两个设计方案,让一键回滚 ...

  10. 【RL-TCPnet网络教程】第28章 RL-TCPnet之DNS应用

    第28章      RL-TCPnet之DNS应用 本章节为大家讲解RL-TCPnet的DNS应用,学习本章节前,务必要优先学习第27章的DNS基础知识.有了这些基础知识之后,再搞本章节会有事半功倍的 ...