资源含义:k8s中所有的内容都被抽象为资源,资源实例化之后,叫做对象。
资源分类:
资源清单:k8s一般都是通过定义资源清单的方式去创建资源,资源清单类似提前写好的配置文件,通过文件信息告知k8s如何进行配置,一般使用yaml格式的文件来创建符合我们预期期望的资源,这样的yaml文件我们一般称为资源清单
资源清单基础格式:
apiVersion: group/apiversion #如果没有给定group名称,那么默认为croe,可以使用kubectl api-versions 获取当前k8s版本上所有的apiVersion版本信息(每个版本可能不同)
kind: #资源类型
metadata: #元数据对象
spec: #期望的状态(disired state)
status: #当前状态,本字段有kubernetes自身维护,用户不能去定义
#获取 apiversion 版本信息 kubectl api-versions
#获取字段设置帮助文档 kubectl explain pod|deploy...,可以通过explain查看各种资源
#apiVersion、kind、metatdata、spec、status,可用过kubectl explain pod.kind方式查询下级信息
apiVersion <string> #表示字符串类型
metadata <Object> #表示需要嵌套多层字段
labels <map[string]string> #表示由k:v组成的映射
finalizers <[]string> #表示字串列表
ownerReferences <[]Object> #表示对象列表,如hostPID ,布尔值ture|false
#布尔类型priority
#整型name -required-
#如果类型后面接 -required-,表示为必填字段
metadata: <Object> #元数据
annotations <map[string]string>
#注释,可以作为挑选条件,作为labels的补充
key1: value1
key2: value2
clusterName <string>
#对象所属的集群的名称。用来区分不同集群中具有相同名称和名称空间的资源。
creationTimestamp <string>
#当前对象创建日期的时间戳
deletionGracePeriodSeconds <integer>
#在从系统中删除该对象之前,对象被正常终止所允许的秒数。仅在还设置了deleteTimestamp时设置
deletionTimestamp <string>
#当前对象删除日期的时间戳
generation <integer>
#用于表示当前对象目标状态的代码
labels <map[string]string>
key1: value1
key2: value2
name <string>
#对象名称,名称空间的同一类型中必须唯一
namespace <string>
#命名空间,默认为default
resourceVersion <string>
#当前对象的内部版本标识符
uid <string>
#唯一表示符
spec: <Object> #必选,pod中容器的详细定义
containers: <[]Object> -required- #pod中的容器列表,可以有多个容器
- name: <string> -required- #容器名称
image: <string> -required- #容器的镜像名称
imagePullPolicy: <string> (Always, Never, IfNotPresent) #获取镜像的策略,Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像,如果是lastest默认为Always,否则默认为IfNotPresent
command: <[]string> #容器的启动命令列表,如不指定,使用打包时使用的启动命令,需要指定bash shell,对应Dockerfile的ENTRYPOINT,定义command后,只会运行command下的命令(优先执行与其他子字段下的command)
args: <[]string> #容器的启动命令参数列表,向command中传参数,对应Dockerfile的CMD
workingDir: <string> #容器的工作目录
ports: <[]Object> #需要暴露的端口列表
- name: <string> #端口号名称
containerPort: <integer> -required- #容器所在pod的IP地址上暴露的端口
hostPort: <integer> #容器所在节点暴露的端口,默认与Container相同
hostIP: <string> #绑定host主机IP地址对应外部端口(调度节点不确定)
protocol: <string> #端口协议,支持TCP和UDP,默认TCP
volumeMounts: <[]Object> #挂载到容器内部的存储卷配置
- name: #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
mountPath: <string> -required- #存储卷在容器内mount的绝对路径
env: <[]Object> #环境变量
- name: <string> -required- #定义的名称信息
value: <string> #具体参数
valueFrom: <Object> #参数对应的源变量
livenessProbe: <Object> #容器存活状态探测
exec: <Object> #执行用户自定义命令
command: <[]string> #具体命令
httpGet: <Object> #指定要执行的http请求
host: <string> #Pod的IP地址
httpHeaders: <string> #http头I西宁西
path: <string> #表示向哪个url发起请求
port: <string> -required- #指定端口
tcpSocket: <Object> #指定涉及TCP端口的操作。 尚不支持TCP挂钩
host: <string> #Pod的IP地址
port: <string> -required- #指定端口
initialDelaySeconds: <integer> #在容器启动后多少秒进行探测,默认容器启动就探测(主进程需要启动时间)
failureThreshold: <integer> #探测器探测的最小连续故障次数,到达此次数即失败,视服务为未就绪,默认3,最小1
successThreshold: <integer> #探测器探测的最小连续成功次数,到达此次数即成功,视服务为就绪,默认3,最小1
periodSeconds: <integer> #执行探测的频率(单位s),默认10s,最下1s
timeoutSeconds: <integer> #探测超时的秒数,默认1s
readinessProbe: <Object> #就绪状态探测,子字段和livenessProbe一样
lifecycle: <Object> #生命周期感知组件
postStart: <Object> #在容器创建后立即执行的
exec: <Object> #执行参数设置
httpGet: <Object> #http获取方式
tcpSocket: <Object> #tcp套接字
preStop: <Object> #在容器终止后立即执行的
volumes: <[]Object> #数据卷使用
emptyDir: {} #为pod挂载分配node节点自动生成的目录,这个目录的初始内容为空,当Pod从node上移除时,emptyDir中的数据会被永久删除
hostPath: <Object> #为pod挂载宿主机上的目录或文件,使得容器可以使用宿主机的高速文件系统进行存储
path: <string> -required- #宿主机挂载目录路径
type: <string> #DirectoryOrCreate:宿主机目录不存在就创建;Directory:宿主机目录必须存在;FileOrCreate:宿主机文件不存在就创建;File:宿主机文件必须存在;Socket:;CharDevice:BlockDevice:;默认为空
nfs: <Object> #nfs存储
path: <string> -required- #路径
readOnly: <boolean> #是否只读,默认false
server: <string> -required- #NFS server地址
persistentVolumeClaim: <Object> #pvc存储
claimName: <string> -required- #pvc名称
readOnly: <boolean> #是否只读,默认false
nodeName: <string> #通过节点名称选择指定的部署主机
nodeSelector: <map|string|string> #标签选择器,通过标签指定部署的节点(标签:key: value)
restartPolicy: <string> #pod内容器重启策略,Always:总是重启、OnFailure:只有状态错误才重启、Never:从来不重启,默认总是重启
hostNetwork: <boolean> #是否使用主机的网络命名空间
hostPID: <boolean> #是否使用主机PID
hostIPC: <boolean> #是否使用主机IPC
serviceAccountName: <string> #指定创建的serviceaccount名称
[kubeadm@node1 pod]$ vim demo1.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo
labels:
app: demo
spec:
containers:
- name: demo
image: nginx
#使用nginx设置一个自主pod
[kubeadm@node1 pod]$ kubectl create -f demo1.yaml
pod/demo1 created
#创建pod
[kubeadm@node1 pod]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
demo1 1/1 Running 0 14s
[kubeadm@node1 pod]$ kubectl delete -f demo1.yaml
pod "demo1" deleted
#删除pod
[kubeadm@node1 pod]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
#pod无法自愈
[kubeadm@node1 pod]$ cp demo1.yaml demo2.yaml
[kubeadm@node1 pod]$ vim demo2.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo2
labels:
app: demo2
spec:
containers:
- name: vm1
image: nginx
- name: vm2
image: nginx
#创建2个容器vm1与vm2,都是nginx,会发生争抢资源
[kubeadm@node1 pod]$ kubectl create -f demo2.yaml
pod/demo2 created
[kubeadm@node1 pod]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
demo2 1/2 Error 2 28s
#pod中2个容器只有1个ready状态,另一显示error
[kubeadm@node1 pod]$ kubectl describe pod demo2
……
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 55s default-scheduler Successfully assigned default/demo2 to node3
Normal Pulling 16s kubelet, node3 Pulling image "nginx"
Normal Pulled 16s kubelet, node3 Successfully pulled image "nginx"
Normal Created 16s kubelet, node3 Created container vm1
Normal Started 16s kubelet, node3 Started container vm1
Normal Pulling <invalid> (x4 over 16s) kubelet, node3 Pulling image "nginx"
Normal Pulled <invalid> (x4 over 16s) kubelet, node3 Successfully pulled image "nginx"
Normal Created <invalid> (x4 over 16s) kubelet, node3 Created container vm2
Normal Started <invalid> (x4 over 15s) kubelet, node3 Started container vm2
Warning BackOff <invalid> (x4 over 9s) kubelet, node3 Back-off restarting failed container
……
#通过报错,可以看出vm2,创建成功,但是每次在开启时就会backoff,应为端口资源已被vm1使用,无法使用变无法开启
[kubeadm@node1 pod]$ cp demo2.yaml demo3.yaml
[kubeadm@node1 pod]$ vim demo3.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo3
labels:
app: demo3
spec:
containers:
- name: vm1
image: nginx
- name: vm2
image: redis
[kubeadm@node1 pod]$ kubectl create -f demo3.yaml
pod/demo3 created
[kubeadm@node1 pod]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
demo3 2/2 Running 0 17s
nfs-client-provisioner-7fffb7b865-8lmjn 1/1 Running 0 29h
[kubeadm@node1 pod]$ kubectl describe pod demo3
……
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m49s default-scheduler Successfully assigned default/demo3 to node3
Normal Pulling 2m11s kubelet, node3 Pulling image "nginx"
Normal Pulled 2m11s kubelet, node3 Successfully pulled image "nginx"
Normal Created 2m10s kubelet, node3 Created container vm1
Normal Started 2m10s kubelet, node3 Started container vm1
Normal Pulling 2m10s kubelet, node3 Pulling image "redis"
Normal Pulled 118s kubelet, node3 Successfully pulled image "redis"
Normal Created 118s kubelet, node3 Created container vm2
Normal Started 117s kubelet, node3 Started container vm2
……
[kubeadm@node1 pod]$ kubectl get pod demo3 --show-labels
NAME READY STATUS RESTARTS AGE LABELS
demo3 2/2 Running 0 5m50s app=demo3
#查询标签信息
[kubeadm@node1 pod]$ kubectl get pod -l app
NAME READY STATUS RESTARTS AGE
demo3 2/2 Running 0 6m38s
[kubeadm@node1 pod]$ kubectl get pod -L app
NAME READY STATUS RESTARTS AGE APP
demo3 2/2 Running 0 6m43s demo3
#通过便签指定key值,过滤pod信息
[kubeadm@node1 pod]$ kubectl label pod demo3 version=v1
pod/demo3 labeled
#增加新的标签信息
[kubeadm@node1 pod]$ kubectl label pod demo3 app=demo --overwrite
pod/demo3 labeled
#修改原有的标签信息,实际是覆盖
[kubeadm@node1 pod]$ kubectl get pod demo3 --show-labels
NAME READY STATUS RESTARTS AGE LABELS
demo3 2/2 Running 0 10m app=demo,version=v1
#标签信息修改显示
1.给指定node节点,创建标签,本次使用node2
[kubeadm@node1 pod]$ kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
node1 NotReady master 35h v1.17.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node2 Ready <none> 34h v1.17.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux
node3 Ready <none> 34h v1.17.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node3,kubernetes.io/os=linux
[kubeadm@node1 pod]$ kubectl label nodes node2 disktype=ssd
node/node2 labeled
#给node2创建一个标签
[kubeadm@node1 pod]$ kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
node1 NotReady master 35h v1.17.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node2 Ready <none> 34h v1.17.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux
node3 Ready <none> 34h v1.17.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node3,kubernetes.io/os=linux
[kubeadm@node1 pod]$ cat demo1.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo1
labels:
app: demo1
spec:
containers:
- name: vm1
image: nginx
nodeSelector: #节点选择器
disktype: ssd #选择器使用的标签
[kubeadm@node1 pod]$ kubectl create -f demo1.yaml
pod/demo1 created
[kubeadm@node1 pod]$ kubectl get pod demo1 -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo1 1/1 Running 0 31s 10.244.1.28 node2 <none> <none>
#demo1创建在了node2上