k8s资源类型详解

2023-11-12

一、k8s资源类型简介

Deployment、Service、Pod是k8s最核心的3个资源对象。
Deployment:最常见的无状态应用的控制器,支持应用的扩缩容、滚动更新等操作。
Servcie:为弹性变动且存在生命周期的Pod对象提供了一个固定的访问接口,用于服务发现和服务访问。
Pod:是运行容器以及调度的最小单位。同一个Pod可以同时运行多个容器,这些容器共享NET、UTS、IPC。除此之外还有USER、PID、MOUNT。
在这里插入图片描述

二、deployment资源类型

创建一个Deployment资源对象,名称为bdqn1,replicas:5个,镜像使用httpd。

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: test1
spec:
  replicas: 5
  template:
    metadata:
      labels:
        app: test1
    spec:
      containers:
      - name: test1
        image: httpd
        ports:
            - containerPort: 80

分析Deployment为什么被称为高级的Pod控制器?

[root@master yaml]# kubectl describe deployments. test1
...
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  3m5s  deployment-controller  Scaled up replica set test1-644db4b57b to 4

注意:events属于事件提示,它描述了整个资源从开始到现在所经历的全部过程。Deployment没有像我们想象中直接创建并控制后端的Pod,而是又创建了一个新的资源对象:ReplicaSet(test1-644db4b57b)。
查看该RS的详细信息,会看到RS整个的Events。

[root@master yaml]# kubectl describe rs test1-644db4b57b
...
Events:
  Type    Reason            Age    From                   Message
  ----    ------            ----   ----                   -------
  Normal  SuccessfulCreate  9m53s  replicaset-controller  Created pod: test1-644db4b57b-4688l
  Normal  SuccessfulCreate  9m53s  replicaset-controller  Created pod: test1-644db4b57b-72vhc
  Normal  SuccessfulCreate  9m53s  replicaset-controller  Created pod: test1-644db4b57b-rmz8v
  Normal  SuccessfulCreate  9m53s  replicaset-controller  Created pod: test1-644db4b57b-w25q8

此时查看任意一个Pod的详细信息,能够看到此Pod的完整的工作流程。

[root@master yaml]# kubectl describe pod test1-644db4b57b-4688l
...
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  11m   default-scheduler  Successfully assigned default/test1-644db4b57b-4688l to node1
  Normal  Pulled     11m   kubelet, node1     Container image "192.168.229.187:5000/httpd:v1" already present on machine
  Normal  Created    11m   kubelet, node1     Created container test1
  Normal  Started    11m   kubelet, node1     Started container test1

在这里插入图片描述

三、service资源类型

创建一个Service资源,要求与上述test1进行关联。

kind: Service
apiVersion: v1
metadata:
  name: test-svc
spec:
  selector:
    app: test1
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

默认情况下Service的资源类型Cluster IP,上述YAML文件中,spec.ports.port:描述的是Cluster IP的端口。只是为后端的Pod提供了一个统一的访问入口(在k8s集群内有效)。

[root@master yaml]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        23d
test-svc     NodePort    10.103.159.206   <none>        80:32767/TCP   6s
[root@master yaml]# curl 10.103.159.206
11111

如果想要让外网能够访问到后端Pod,这里应该将Service的资源类型改为NodePort。

kind: Service
apiVersion: v1
metadata:
  name: test-svc
spec:
  type: NodePort
  selector:
    app: test1
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 32034  #nodePort的有效范围是:30000-32767

上面我们看到了访问Cluster IP ,后端的Pod会轮替着为我们提供服务,也就是有负载均衡,如果没有Service资源,KUBE-PROXY组件也不会生效,因为它就是负责负载均衡,那么现在有了Service资源,它到底是怎么做到负载均衡的?底层的原理是什么?
表面上来看,通过describe命令,查看SVC资源对应的Endpoint,就能够知道后端真正的Pod。

[root@master yaml]# kubectl describe svc test-svc
...
Endpoints:                10.244.1.33:80,10.244.1.34:80,10.244.2.27:80 + 1 more...
...

通过查看iptables规则,可以了解一下具体的负载均衡过程。

[root@master yaml]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        23d
test-svc     NodePort    10.103.159.206   <none>        80:32767/TCP   8m11s

[root@master yaml]# iptables-save | grep 10.103.159.206
-A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.103.159.206/32 -p tcp -m comment --comment "default/test-svc: cluster IP" -m tcp --dport 80 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.103.159.206/32 -p tcp -m comment --comment "default/test-svc: cluster IP" -m tcp --dport 80 -j KUBE-SVC-W3OX4ZP4Y24AQZNW
#如果目标地址是10.103.159.206/32的80端口,并且走的是TCP协议,那么就把这个流量跳转到KUBE-SVC-W3OX4ZP4Y24AQZNW

[root@master yaml]# iptables-save | grep KUBE-SVC-W3OX4ZP4Y24AQZNW
-A KUBE-SVC-W3OX4ZP4Y24AQZNW -m statistic --mode random --probability 0.25000000000 -j KUBE-SEP-UNUAETQI6W3RVNLM
-A KUBE-SVC-W3OX4ZP4Y24AQZNW -m statistic --mode random --probability 0.33332999982 -j KUBE-SEP-QNYBCG5SL7K2IM5K
-A KUBE-SVC-W3OX4ZP4Y24AQZNW -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-NP7BZEGCZQZXEG4R
-A KUBE-SVC-W3OX4ZP4Y24AQZNW -j KUBE-SEP-5KNXDMFFQ4CLBFVI

[root@master yaml]# iptables-save | grep KUBE-SEP-UNUAETQI6W3RVNLM
:KUBE-SEP-UNUAETQI6W3RVNLM - [0:0]
-A KUBE-SEP-UNUAETQI6W3RVNLM -s 10.244.1.33/32 -j KUBE-MARK-MASQ
-A KUBE-SEP-UNUAETQI6W3RVNLM -p tcp -m tcp -j DNAT --to-destination 10.244.1.33:80
-A KUBE-SVC-W3OX4ZP4Y24AQZNW -m statistic --mode random --probability 0.25000000000 -j KUBE-SEP-UNUAETQI6W3RVNLM

参数解释

SNAT:Source NAT(源地址转换);

DNAT:Destination NAT(目标地址转换);

MASQ:动态的源地址转换;

Service实现的负载均衡:默认使用的是iptables规则;
四、k8s资源的回滚操作

准备3个版本所使用的私有镜像,来模拟每次升级不同的镜像。

[root@master yaml]# vim test1.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: test1
spec:
  replicas: 4
  template:
    metadata:
      labels:
        test: test
    spec:
      containers:
      - name: test1
        image: 192.168.229.187:5000/httpd:v1
[root@master yaml]# vim test2.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: test1
spec:
  replicas: 4
  template:
    metadata:
      labels:
        test: test
    spec:
      containers:
      - name: test1
        image: 192.168.229.187:5000/httpd:v2
[root@master yaml]# vim test3.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: test1
spec:
  replicas: 4
  template:
    metadata:
      labels:
        test: test
    spec:
      containers:
      - name: test1
        image: 192.168.229.187:5000/httpd:v3

此处3个yaml文件指定不同版本的镜像。
运行一个服务,并记录一个版本信息。

[root@master yaml]# kubectl apply -f test1.yaml --record

查看有哪些版本信息

[root@master yaml]# kubectl rollout history deployment test1
deployment.extensions/test1
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=test1.yaml --record=true

运行并升级Depoyment资源,并记录版本信息。

[root@master yaml]# kubectl apply -f test2.yaml --record
[root@master yaml]# kubectl apply -f test3.yaml --record

把test1的版本进行升级

[root@master yaml]# kubectl set image deploy test1 test1=192.168.229.187:5000/httpd:v2

此时可以运行一个关联的Service资源去做验证,升级是否成功。

[root@master yaml]# kubectl apply -f test-svc.yaml
[root@master yaml]# kubectl get deployments. test1 -o wide

回滚到指定版本

[root@master yaml]# kubectl rollout undo deployment test1 --to-revision=1
五、用label控制pod的位置

添加节点标签

[root@master yaml]# kubectl label nodes node2 disk=ssd
node/node2 labeled
[root@master yaml]# kubectl get nodes --show-labels

删除节点标签

[root@master yaml]# kubectl label nodes node2 disk-
 ...
spec:
  revisionHistoryLimit: 10
  replicas: 3
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: test-web
        image: 192.168.1.10:5000/httpd:v1
        ports:
        - containerPort: 80
        nodeSelector:  #添加节点选择器
        disk: ssd  #和标签内容一致
六、namespace简介

默认的名称空间:Default
查看名称空间

[root@master yaml]# kubectl get ns
NAME              STATUS   AGE
default           Active   25d
kube-node-lease   Active   25d
kube-public       Active   25d
kube-system       Active   25d
test              Active   22m

查看名称空间详细信息

[root@master yaml]# kubectl describe ns default
Name:         default
Labels:       <none>
Annotations:  <none>
Status:       Active

No resource quota.

No resource limits.

创建名称空间

[root@master yaml]# kubectl create ns test
[root@master yaml]# vim test.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: test

注意:namespace资源对象仅用于资源对象的隔离,并不能隔绝不同名称空间的Pod之间的通信,那是网络策略资源的功能。
查看指定名称空间的资源可以使用–namespace或者-n选项

[root@master yaml]# kubectl get pod -n test
NAME   READY   STATUS    RESTARTS   AGE
test   1/1     Running   0          28m

删除某个名称空间

[root@master yaml]# kubectl delete ns test

注意:在执行删除某个名称空间的时候,千万注意,轻易不执行此操作。如果执行之后,默认会将所在此名称空间之下资源全部删除。

七、pod资源类型

1.利用yaml文件创建pod资源

[root@master yaml]# vim pod.yaml
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
spec:
  containers:
  - name: test-app
    image: httpd

单个pod运行多个容器

[root@master yaml]# vim pod.yaml
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
spec:
  containers:
  - name: test-app
    image: httpd
    
  - name: test-web
    image: busybox

2.Pod中镜像获取策略
将上述Pod资源的镜像下载策略改为IfNotPresent。

[root@master yaml]# vim pod.yaml
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
spec:
  containers:
  - name: test-app
    image: httpd
    imagePullPolicy: IfNotPresent

k8s默认根据镜像的TAG的不同,有3中不同策略。

Always:镜像标签为"latest"或镜像标签不存在时,总是从指定的仓库(默认的官方仓库、或者私有仓库)中获取最新镜像。

IfNotPresent:仅当本地镜像不存在时才从目标仓库中下载。也就意味着,如果本地存在,直接使用本地镜像,无需再联网下载。

Never:禁止从仓库中下载镜像,即只使用本地镜像。

注意:对于标签为“latest”或者这标签不存在,其默认镜像下载策略为“Always”,而对于其他标签的镜像,默认则使用了“IfNotPresent”。
上述语句中提到的"本地"是指:docker images命令能够给查看到的镜像。
3.容器的重启策略
将上述Pod资源添加重启策略为OnFailure。

[root@master yaml]# vim pod.yaml
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
spec:
  restartPolicy: OnFailure
  containers:
  - name: test-app
    image: httpd
    imagePullPolicy: IfNotPresent

策略如下:

Always:但凡Pod对象终止就将其重启,此为默认设定;

OnFailure:仅在Pod对象出现错误时才将其重启;

Never:从不重启;

简便方法:
同一个yaml文件内,可以同时存在多种资源对象,但最好是同一个服务相关的资源。并且在写的时候,不同的资源需要用“—”将资源隔离。其实默认是一个资源的yaml,最上方也有“—"不过是通常会省略不写。

[root@master yaml]# vim pod.yaml
---
apiVersion: v1
kind: Namespace
metadata:
  name: test
---
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
  namespace: test
spec:
  restartPolicy: OnFailure
  containers:
  - name: test-app
    image: httpd
    imagePullPolicy: IfNotPresent

4.Pod的默认健康检查
根据Pod的默认重启策略,对Pod进行健康检查

[root@master yaml]# vim pod.yaml
kind: Pod
apiVersion: v1
metadata:
  name: healthcheck
  namespace: test
spec:
  restartPolicy: OnFailure
  containers:
  - name: test-app
    image: httpd
    imagePullPolicy: IfNotPresent
    args:
    - sh
    - -c
    - sleep 10; exit 1

监控pod的运行状态

[root@master yaml]# kubectl get pod -n test -w

如果此时我们将退出状态码改为0,也就是正常退出,仍使用OnFailure策略,但它就不会重启Pod了。

[root@master yaml]# vim pod.yaml
kind: Pod
apiVersion: v1
metadata:
  name: healthcheck
  namespace: test
spec:
  restartPolicy: OnFailure
  containers:
  - name: test-app
    image: httpd
    imagePullPolicy: IfNotPresent
    args:
    - sh
    - -c
    - sleep 10; exit 0

监控pod的运行状态

[root@master yaml]# kubectl get pod -n test -w

5.livenessprobe(活跃度、存活性)

kind: Pod
apiVersion: v1
metadata:
  name: liveness
  labels:
    test: liveness
spec:
  restartPolicy: OnFailure
  containers:
  - name: liveness
    image: busybox
    args:
    - sh
    - -c
    - touch /tmp/test; sleep 30; rm -rf /tmp/test; sleep 300
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/test
      initialDelaySeconds: 10  #pod运行10秒后开始探测
      periodSeconds: 5  #每5秒探测一次

注意:Liveness活跃度探测,根据探测某个文件是否存在,来确认某个服务是否正常运行,如果存在则正常,否则,它会根据你设置的Pod的重启策略操作Pod。
6.readiness(敏捷探测、就绪性探测)

kind: Pod
apiVersion: v1
metadata:
  name: readiness
  labels:
    test: readiness
spec:
  restartPolicy: OnFailure
  containers:
  - name: readiness
    image: busybox
    args:
    - sh
    - -c
    - touch /tmp/test; sleep 30; rm -rf /tmp/test; sleep 300
    readinessProbe:
      exec:
        command:
        - cat
        - /tmp/test
      initialDelaySeconds: 10
      periodSeconds: 5

注意

(1)liveness和readiness是两种健康检查机制,如果不特意配置,k8s将两种探测采取相同的默认行为,即通过判断容器启动进程的返回值是否为零,来判断探测是否成功。

(2)两种探测配置方法完全一样,不同之处在于探测失败后的行为:
liveness探测是根据Pod重启策略操作容器,大多数是重启容器;
readiness则是将容器设置为不可用,不接收Service转发的请求;

(3)两种探测方法可以独立存在,也可以同时使用。
用liveness判断容器是否需要重启实现自愈;
用readiness判断容器是否已经准备好对外提供服务;
八、健康检测的相关应用

1.在扩容中的应用

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: web
spec:
  replicas: 5
  template:
    metadata:
      labels:
        run: web
    spec:
      containers:
      - name: web
        image: httpd
        ports:
        - containerPort: 80
        readinessProbe:
          httpGet:
            scheme: HTTP
            path: /healthy
            port: 80
          initialDelaySeconds: 10
          periodSeconds: 5
---
kind: Service
apiVersion: v1
metadata:
  name: web-svc
spec:
  type: NodePort
  selector:
    run: web
  ports:
  - protocol: TCP
    port: 90
    targetPort: 80
    nodePort: 30321

总结:服务扩容中,如果没有针对性就绪探测,往往扩容之后,表面看Pod的状态是没有问题的,但其实Pod内的服务是否运行正常也是我们要关注的,而Readiness的关注点就在这,如果Pod内的服务运行有问题,那么,这些新扩容的Pod就不会被添加到Service资源的转发中,从而保证用户能够有最起码正常的服务体验。
2.在更新过程中的应用

[root@master yaml]# vim update1.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: update
spec:
  replicas: 10
  template:
    metadata:
      labels:
        app: update
    spec:
      containers:
      - name: update
        image: 192.168.229.187:5000/httpd:v1
        args:
        - sh
        - -c
        - sleep 10; touch /tmp/health; sleep 300
        readinessProbe:
          exec:
            command:
            - cat
            - /tmp/health
          initialDelaySeconds: 10
          periodSeconds: 5

复制update1的yaml文件,命名update2.yaml,并更改镜像和args的命令部分,这里我们确定,更新肯定会失败,因为它没有符合readiness探测文件。

[root@master yaml]# vim update2.yml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: update
spec:
  replicas: 10
  template:
    metadata:
      labels:
        app: update
    spec:
      containers:
      - name: update
        image: 192.168.229.187:5000/httpd:v2
        args:
        - sh
        - -c
        - sleep 300
        readinessProbe:
          exec:
            command:
            - cat
            - /tmp/health
          initialDelaySeconds: 10
          periodSeconds: 5

在更新的过程中,Readiness探测同样重要,想象一下,如果更新完成的Pod内没有更新的内容,并且也没有相对应的探测,那么有可能我们更新的Pod全部都会是不可用的。
其实在更新过程中,为了保证,即使更新失败,至少也有相对数量的副本数量仍能正常提供服务,其实是有数值可以设置的。

maxSurge:此参数控制滚动更新过程中,副本总数超过预期数的值。可以是整数,也可以是百分比,默认是1。
maxUnavailable:不可用Pod的值。默认为1。可以是整数,也可以是百分比。

测试题:
在更新过程中,期望的Replicas值为10个,更改rollingupdate策略,要求在更新过程中,最大不可用Pod的值为4个,允许同时出现的Pod的总数量为13个。

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: update
spec:
  strategy:
    rollingUpdate:
      maxSurge: 3
      maxUnavailable: 4
  replicas: 10
  template:
    metadata:
      labels:
        app: update
    spec:
      containers:
      - name: update
        image: 192.168.229.187:5000/httpd:v2
        args:
        - sh
        - -c
        - sleep 300
        readinessProbe:
          exec:
            command:
            - cat
            - /tmp/healthy
          initialDelaySeconds: 10
          periodSeconds: 5
九、ReplicaSet的相关介绍

Deployment是一种高级的Pod控制器,这种高级Pod控制器,并不是像想象中直接管理后端的Pod,而是又创建了RS这种Pod控制器,然后由RS控制后端的Pod,那么为什么这么做?因为RS资源并不支持滚动更新策略。
RC:Replication Controller(老一代的Pod控制器)
用于确保由其管控的Pod对象副本数量,能够满足用户期望,多则删除,少则通过模板创建。
特点

确保Pod资源对象的数量精准;

确保Pod健康运行;

弹性伸缩;

同样它也可以通过yaml或json格式的资源清单来创建。其中spec字段一般嵌套以下字段。

replicas:期望的Pod对象副本数量;

selector:当前控制器匹配Pod对象副本的标签选择器;

template:Pod副本的模板;

与RC相比而言,RS不仅支持基于等值的标签选择器,而且还支持基于集合的标签选择器。
1.labels与selector的关系
(1)现在有一个Pod资源,且是拥有2个标签。还有svc资源,selector选择器,仅有一个符合。

kind: Pod
apiVersion: v1
metadata:
  name: pod1
  labels:
    test: web
    app: httpd
spec:
  containers:
  - name: pod1
    image: httpd
---
kind: Service
apiVersion: v1
metadata:
  name: test-svc1
spec:
  selector:
    app: httpd
  ports:
  - port: 80

svc资源是否能成功的关联到上述的Pod资源?
(2)现在有一个Pod资源,且是拥有1个标签。还有svc资源,selector选择器,需要2个满足条件。

kind: Pod
apiVersion: v1
metadata:
  name: pod1
  labels:
    test: web
spec:
  containers:
  - name: pod1
    image: httpd
---
kind: Service
apiVersion: v1
metadata:
  name: test-svc1
spec:
  selector:
    app: httpd
    test: web
  ports:
  - port: 80

svc资源是否能成功的关联到上述的Pod资源?
结论:selector是拥有选择权的,而labels只能够被选择,所以labels必须全部满足selector的要求,才能被匹配。
常用标签
标签:解决同类型的资源对象越来越多,为了更好的管理,按照标签分组。
常用标签分类

release(版本):stable(稳定版)、canary(金丝雀版本)、beta(测试版);

environment(环境变量):dev(开发)、qa(测试)、production(生产);

application(应用):ui、as(application software应用软件)、pc、sc;

tier(架构层级):frontend(前端)、backend(后端)、cache(缓存);

partition(分区):customerA(客户A)、customerB(客户B);

track(品控级别):daily(每天)、weekly(每周);

示例:写一个Pod的yaml文件。

kind: Pod
apiVersion: v1
metadata:
  name: pod-labels
  labels:
    env: qa
    tier: frontend
spec:
  containers:
  - name: myapp
    image: httpd

通过下面命令显示资源对象的标签

[root@master ~]# kubectl get pod --show-labels

通过-l查看仅包含某个标签的资源

[root@master ~]# kubectl get pod -l env

给pod资源添加标签

[root@master ~]# kubectl label pod pod-labels release=v1
[root@master ~]# kubectl get pod pod-labels --show-labels

删除标签

[root@master ~]# kubectl label pod pod-labels release-

修改标签

[root@master ~]# kubectl label pod pod-labels env=dev --overwrite
[root@master ~]# kubectl get pod -l tier --show-labels

如果标签有多个,标签选择器选择其中一个,也可以关联成功。相反,如果选择器有多个,那么标签必须完全满足条件,才可以关联成功。
2.标签选择器
标签的查询过滤条件。

基于等值关系(equality-based)"=""==","!="前边两个都是相等,最后是不等;

基于集合关系(set-based)"in""notin""exists"三种;

示例:

pod 标签
pod1 app: nginx、name: zhangsan、age: 18
pod2 app: nginx、name: lisi、age: 20
pod3 name: wangwu、age: 30
...
selector:
  matchLabels:
    app: nginx
  matchExpressions:
  #pod中有name这个关键字的,并且对应的值是:zhangsan或者lisi,那么此处会关联到Pod1、Pod2
    - {key: name,operator: In,values: [zhangsan,lisi]}
  #所有关键字是age的,并且忽略它的值,都会被选中,此处会关联到Pod1、Pod2、Pod3 
    - {key: age,operator: Exists,values:}
...
matchLabels:指定键值对表示的标签选择器;

matchExpressions:基于表达式来指定的标签选择器;

选择器列表间为“逻辑与”关系;使用In或者NotIn操作时,其values不强制要求为非空的字符串列表,而使用Exists或DostNotExist时,其values必须为空。
3.使用标签选择器的逻辑

1.同时指定的多个选择器之间的逻辑关系为“与“操作;

2.使用空值的标签选择器意味着每个资源对象都将被选择中;

3.空的标签选择器无法选中任何资源;
十、DaemonSet资源类型

它也是一种Pod控制器。
特点:它会在每一个Node节点上都会生成并且只能生成一个Pod资源。
使用场景:如果必须将Pod运行在固定的某个或某几个节点,且要优先于其他Pod的启动。通常情况下,默认每一个节点都会运行,并且只能运行一个Pod。这种情况推荐使用DaemonSet资源对象。
监控程序;
日志收集程序;
运行一个web服务,在每一个节点都运行一个Pod。

kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
  name: test-ds
spec:
  template:
    metadata:
      labels:
        name: test-ds
    spec:
      containers:
      - name: test-ds
        image: httpd

RC、RS、Deployment、DaemonSet都是Pod控制器。–> Controllermanager(维护集群状态,保证Pod处于期望的状态。)

十一、job资源对象
服务类的Pod容器:RC、RS、DS、Deployment.(Pod内运行的服务,要持续运行);

工作类的Pod容器:Job--->执行一次或者批量执行处理程序,完成就会退出容器;

1.编写一个job.yaml文件

[root@master ~]# vim job.yaml
kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:
  template:
    metadata:
      name: test-job
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["echo","hello k8s job!"]
      restartPolicy: Never

注意:如果容器内执行任务有误,会根据容器的重启策略操作容器,不过这里的容器重启策略只能是:Never和OnFailure。
2.提高Job的执行效率
我们可以在Job.spec字段下加上parallelism选项。表示同时运行多少个Pod执行任务。
我们可以在Job.spec字段下加上completions选项。表示总共需要完成Pod的数量。
举例将上述Job任务进行更改。提示,更改Job任务的时候,需要先将原来的Job资源对象删除。

[root@master ~]# vim job.yaml
kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:
  parallelism: 2
  completions: 8
  template:
    metadata:
      name: test-job
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["echo","hello k8s job!"]
      restartPolicy: Never

job的作用和之前提到的at命令有些相似,在K8s集群中,如果需要用到运行一次性工作任务的需求,可以考虑job资源对象。下面的cronjob和之前的crontab也是十分相似。

十二、CronJob资源类型

1.如何定时执行Job
编写一个cronjob.yaml文件

[root@master ~]# vim cronjob.yaml
kind: CronJob
apiVersion: batch/v1
metadata:
  name: test-cronjob
spec:
  schedule: "*/1 * * * *"  #分、时、日、月、周
  jobTemplate:
  spec:
    template:
      spec:
        containers:
        - name: hello
          image: busybox
          command: ["echo","hello cronjob!"]
        restartPolicy: Never

此时查看Pod的状态,会发现每分钟都会运行一个新的Pod来执行命令规定的任务。
注意:如果规定具体时间,可能并不会执行任务。cronjob资源对象,开发还未完成此功能。
2.添加apiVersion库

[root@master job]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
在yaml文件中command指令下添加
- --runtime-config=batch/v2alpha1=true

重启kubelet服务,重新识别api yaml文件内容即可。
查看api版本库

[root@master job]# kubectl api-versions

注意:此时仍然不能正常运行指定时间的CronJob,这是因为K8s官方在cronjob这个资源对象的支持中还没有完善此功能,还待开发。
跟Job资源一样在cronjob.spec.jobTemplate.spec下同样支持并发Job参数:parallelism,也支持完成Pod的总数参数:completions。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k8s资源类型详解 的相关文章

随机推荐

  • PPPoE Server防止ARP***

    在一般情况下 只要有一台计算机感染ARP病毒就可能造成此网段中所有计算机上网时断时续或缓慢等其它不正常现象 为了保障网络正常运行 针对ARP病毒的猖獗和破坏性 我们也已有一些应对措施 这些措施有的尽管能解一时之急 但不能从根本上彻底解决问题
  • HIVE-执行命令的几种方式 和 hive -e 和hive -f的使用

    第一种 在bash中直接通过hive e命令 并用 gt 输出流把执行结果输出到制定文件 hive e select from test hour rate2 where year 2019 gt tmp output 1 txt 第二种
  • 流明(lux)和坎德拉;

    流明是光照度 坎德拉是光强 流明是光通量的单位 cd是光强单位 光强是单位立体角的光通量 照度是单位面积的光通量 尼特是亮度单位 1尼特 1CD m 2 1 lx 1 流明每平方米 面发光度 光照度 纸面的反射系数 发光强度1坎德拉 cd
  • C++中for( : )用法

    常用的遍历数组的写法 随机定义的数组 int array 10 1 2 3 4 5 6 7 8 9 10 for int i 0 i lt 10 i cout lt lt array i lt lt 输出 1 2 3 4 5 6 7 8 9
  • Vuex安装时报错“Could not resolve dependency: npm ERR peer vue@“^3.0.2“ from vuex@4.0.2”

    报错的原因 安装的版本过高的原因造成的 解决方法 1 可以npm view vuex versions json查版本 找适合的版本 不要最新的 2 npm install vuex 3 6 2 save根据版本下载 这样就可以了
  • 第七届蓝桥杯省赛C++A/B组 最大比例

    X星球的某个大奖赛设了 M 级奖励 每个级别的奖金是一个正整数 并且 相邻的两个级别间的比例是个固定值 也就是说 所有级别的奖金数构成了一个等比数列 比如 16 24 36 54 其等比值为 3 2 现在 我们随机调查了一些获奖者的奖金数
  • sprintf, snprintf, _snprintf, sprintf_s 等的区别

    先放结论 1 在支持snpritf的编译器 只使用int snprintf char buffer size t count const char format argument 无论成功或者失败 都会返回字符串的总长度 不包括结束符 如果
  • 计算机网络之网络层

    网络层涉及的问题 1一般是网关 18 是外网 内网有两类 1 存储转发包交换 2 提供给传输层的服务 3 非连接服务的实现 4 面向连接服务的实现 5 虚电路和数据包的比较 OSPF开放式最短路径优先 自治域 cisco路由器 4种延迟 传
  • 批量修改文件夹名称——规则重命名(Excel+Python脚本两种方式)

    批量修改文件夹名称 场景 在进行神经网络训练的时候 有些时候获取到的数据集的命名是不规则的 不便于直观理解数据的结构 由此需要进行批量重命名 本文提供Excel Python脚本两种方式 Excel 如下图所示 文件是命名是乱序无规则的 在
  • QT信号槽跨线程传递QDataStream问题

    第一点 查看QDataStream类 可以发现这一句 Q DISABLE COPY QDataStream Q DISABLE COPY是QT的一个宏 顾名思义 意思为禁用拷贝构造函数 如果要知道这个宏的实现 可以继续F2 所以第一个结论
  • Android 全局异常处理之UncaughtExceptionHandler

    在日常开发中可能有需要将机器奔溃日志保存本机 以便保存到本地 那么该如何做呢 实现UncaughtExceptionHandler接口 public class ApplicationCrashHandler implements Thre
  • upload-labs 环境搭建(docker)

    1 切换到root用户 2 在docker镜像仓库搜索upload labs镜像 3 下载镜像 4 查看本地镜像库 看是否下载成功 如下图就有了下载的镜像 5 运行镜像 生成镜像 docker run d p92 80 镜像id 92端口是
  • Linux学习笔记一:vmware安装Ubuntu虚拟机并进行联网设置

    目录 概述 新建虚拟机 安装Ubuntu 安装后重启失败 联网设置 修改分辨率 概述 主要参考讯为的教程 没有使用讯为提供的镜像 为了自己动手把相关工具安装一遍 采用了官方的Ubuntu18镜像 过程中与教程难免存在差异 遇到问题再针对解决
  • 总结:Git 撤销操作

    1 还未添加到暂存区 git checkout filename 执行命令后 会回退到未修改之前的状态 2 已经添加到暂存区 git reset HEAD filename 执行命令后 会回退到工作区之前的状态 3 已经 commit 但是
  • 以太坊Python智能合约开发指南

    在以太坊上获得一个基本的智能合约是一个很简单的事 只需google查询 ERC20代币教程 你会发现有关如何做到这一点的大量信息 以编程方式与合约交互完全是另一回事 如果你是一个Python程序员 那么教程就很少 所以写这个Python中的
  • Adaptive让 Spark SQL 更高效更智能

    本文转发自技术世界 原文链接 http www jasongj com spark adaptive execution 1 背景 前面 Spark SQL Catalyst 内部原理 与 RBO 与 Spark SQL 性能优化再进一步
  • 期权套期保值

    同种商品期货价格走势与现货价格走势方向基本一致 同涨同跌 而在临近到期日时 期货价格相对现货价格通常会呈现回归 在此基础上 再根据方向相反 数量 相等 月份相同或相近的操作原则进行交易 套期保值的意义 投资者进行套期保值的最终目的是规避或者
  • 浏览器可直接访问 Dubbo、gRPC 后端微服务,Dubbo-js 首个alpha 版本来了!

    基于 Dubbo3 定义的 Triple 协议 你可以轻松编写浏览器 gRPC 兼容的 RPC 服务 并让这些服务同时运行在 HTTP 1 和 HTTP 2 上 Dubbo TypeScript SDK 1 支持使用 IDL 或编程语言特有
  • 华为OD机试真题-信号发射和接收【2023Q2】【JAVA、Python、C++】

    题目描述 有一个二维的天线矩阵 每根天线可以向其他天线发射信号也能接收其他天线的信号 为了简化起见 我们约定每根天线只能向东和向南发射信号 换言之 每根天线只能接收东向或南向发送的信号 每根天线有自己的高度anth 各根天线的高度存储在一个
  • k8s资源类型详解

    k8s资源类型 一 k8s资源类型简介 二 deployment资源类型 三 service资源类型 四 k8s资源的回滚操作 五 用label控制pod的位置 六 namespace简介 七 pod资源类型 八 健康检测的相关应用 九 R