k8s-学习总结(资源清单、自主Pod、标签)

文章目录

  • 概念
  • POD资源清单对象信息
    • 帮助信息格式
    • pod.metadata(元数据):
    • pod.spec
  • 资源清单实践
    • 自主式POD
      • 1个容器的自主式POD创建、删除、查询
      • POD内多个容器,资源争抢情况
      • 创建不同的容器,不争抢资源情况
    • 标签
      • 标签查询、创建、修改(覆盖)
      • 标签的使用,通过标签将pod创建在指定node节点上

概念

  • 资源含义:k8s中所有的内容都被抽象为资源,资源实例化之后,叫做对象。

  • 资源分类:

    • 工作负载:pod、rs(ReplicasSet)、deploy(Deployment)、sts(StatefulSet)、ds(DaemonSet)、job、cronjob
    • 服务发现及负载均衡:svc(Service)、ing(Ingress)
    • 配置与存储:cm(ConfigMap)、Secret、Volume、pv( persistentvolumes )、pvc、sc(StorageClasses)DownwardAPI
    • 集群级: ns(Namespace),Node,Role,ClusterRole,RoleBinding,ClusterRoleBinding
    • 元数据: HPA,PodTemplate,LimitRange
  • 资源清单: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方式查询下级信息

POD资源清单对象信息

帮助信息格式

apiVersion <string>         	#表示字符串类型
metadata <Object>            	#表示需要嵌套多层字段
labels <map[string]string>  	#表示由k:v组成的映射
finalizers <[]string>       	#表示字串列表
ownerReferences <[]Object>   	#表示对象列表,如hostPID ,布尔值ture|false
								#布尔类型priority            
								#整型name  -required-     
								#如果类型后面接 -required-,表示为必填字段

pod.metadata(元数据):

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>
   #唯一表示符

pod.spec

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名称

资源清单实践

自主式POD

  1. 使用pod资源清单设置的自主式pod,是无法自愈的,也就是删除后无法再次创建,原因是没有关联控制器
  2. 自主式pod可以理论上是可以创建多个containers,但是因为资源共享,要求容器使用的资源不能冲突,例如端口

1个容器的自主式POD创建、删除、查询

[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无法自愈

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
#标签信息修改显示

标签的使用,通过标签将pod创建在指定node节点上

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
  1. pod资源清单修改
[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
  1. 查看pod创建的节点信息
[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上

你可能感兴趣的:(Linux运维-企业实战,k8s)