K8S学习笔记(06): 资源
简介
k8s中所有的内容都抽象为资源, 资源实例化之后,叫做对象。
资源类型介绍
- 工作负载型资源对象(workload):Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob …
- 服务发现及均衡资源对象:Service,Ingress …
- 配置与存储资源对象:Volume(存储卷),CSI(容器存储接口,可以扩展各种各样的第三方存储卷),ConfigMap,Secret,DownwardAPI
- 集群级资源:Namespace,Node,Role,ClusterRole,RoleBinding,ClusterRoleBinding
- 元数据型资源:HPA,PodTemplate,LimitRange
工作负载资源
Deployment
为了更好地解决服务编排的问题,k8s在V1.2版本开始,引入了deployment控制器,值得一提的是,这种控制器并不直接管理pod,
而是通过管理replicaset来间接管理pod,即:deployment管理replicaset,replicaset管理pod。所以deployment比replicaset的功能更强大。

deployment的主要功能有下面几个:
- 支持replicaset的所有功能
- 支持发布的停止、继续
- 支持版本的滚动更新和版本回退
编写资源清单
1 $ cat test-deploy.yaml
2 apiVersion: apps/v1
3 kind: Deployment
4 metadata:
5 name: test-deployment
6 namespace: dev
7 spec:
8 replicas: 3
9 selector:
10 matchLabels:
11 app: nginx-pod
12 template:
13 metadata:
14 labels:
15 app: nginx-pod
16 spec:
17 containers:
18 - name: nginx
19 image: nginx:1.17.1
20
运行清单
$ k apply -f test-deploy.yaml
deployment.apps/test-deployment created
查看效果
$ k get deploy -A
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
dev test-deployment 3/3 3 3 94s
guestbook-system guestbook-controller-manager 1/1 1 1 59d
kube-system coredns 2/2 2 2 63d
kubernetes-dashboard dashboard-metrics-scraper 1/1 1 1 14d
kubernetes-dashboard kubernetes-dashboard 1/1 1 1 14d
可以看出deploy已经运行成功,3副本已处于READY状态。
再查看它运行中的清单:
$ k get deploy -n dev test-deployment -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"test-deployment","namespace":"dev"},"spec":{"replicas":3,"selector":{"matchLabels":{"app":"nginx-pod"}},"template":{"metadata":{"labels":{"app":"nginx-pod"}},"spec":{"containers":[{"image":"nginx:1.17.1","name":"nginx"}]}}}}
creationTimestamp: "2022-09-28T12:35:22Z"
generation: 1
name: test-deployment
namespace: dev
resourceVersion: "5045809"
uid: 40feb568-1343-4046-8708-7e1bf5e5c384
spec:
#spec.progressDeadlineSeconds 是可选配置项,用来指定在系统报告Deployment的failed progressing一一表现为resource的状态中 type=Progressing 、 Status=False 、 Reason=ProgressDeadlineExceeded 前可以等待的Deployment进行的秒数。Deployment controller会继续重试该Deployment。未来,在实现了自动回滚后, deployment controller在观察到这种状态时就会自动回滚。
progressDeadlineSeconds: 600
#.spec.replicas 是可以选字段,指定期望的pod数量,默认是1。
replicas: 3
revisionHistoryLimit: 10
#.spec.selector是可选字段,用来指定 label selector ,圈定Deployment管理的pod范围。如果被指定, .spec.selector 必须匹配 .spec.template.metadata.labels,否则它将被API拒绝。如果.spec.selector 没有被指定, .spec.selector.matchLabels 默认是.spec.template.metadata.labels。在Pod的template跟.spec.template不同或者数量超过了.spec.replicas规定的数量的情况下,Deployment会杀掉label跟selector不同的Pod。
selector:
matchLabels:
app: nginx-pod
#.spec.strategy 指定新的Pod替换旧的Pod的策略。 .spec.strategy.type 可以是"Recreate"或者是"RollingUpdate"。"RollingUpdate"是默认值。
strategy:
rollingUpdate:
#spec.strategy.rollingUpdate.maxSurge 是可选配置项,用来指定可以超过期望的Pod数量的最大个数。该值可以是一个绝对值(例如5)或者是期望的Pod数量的百分比(例如10%)。当 MaxUnavailable 为0时该值不可以为0。通过百分比计算的绝对值向上取整。默认值是1。
maxSurge: 25%
#.spec.strategy.rollingUpdate.maxUnavailable 是可选配置项,用来指定在升级过程中不可用Pod的最大数量。该值可以是一个绝对值(例如5),也可以是期望Pod数量的百分比(例如10%)。通过计算百分比的绝对值向下取整。 如 果 .spec.strategy.rollingUpdate.maxSurge 为0时,这个值不可以为0。默认值是1。例如,该值设置成30%,启动rolling update后旧的ReplicatSet将会立即缩容到期望的Pod数量的70%。新的Pod ready后,随着新的ReplicaSet的扩容,旧的ReplicaSet会进一步缩容确保在升级的所有时刻可以用的Pod数量至少是期望Pod数量的70%。
maxUnavailable: 25%
#滚动更新,简单定义 更新期间pod最多有几个等。可以指定 maxUnavailable 和 maxSurge 来控制 rolling update 进程。
type: RollingUpdate
#.spec.template 是 .spec中唯一要求的字段。.spec.template 是 pod template. 它跟 Pod有一模一样的schema,除了它是嵌套的并且不需要apiVersion 和 kind字段。另外为了划分Pod的范围,Deployment中的pod template必须指定适当的label(不要跟其他controller重复了,参考selector)和适当的重启策略。.spec.template.spec.restartPolicy 可以设置为 Always , 如果不指定的话这就是默认配置。
template:
metadata:
creationTimestamp: null
labels:
app: nginx-pod
spec:
containers:
- image: nginx:1.17.1
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
#terminationMessagePath 表示容器的异常终止消息的路径,默认在 /dev/termination-log 下。当容器退出时,可以通过容器的状态看到退出信息。
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
#“ClusterFirst“:如果DNS查询与配置好的默认集群域名前缀不匹配,则将查询请求转发到从节点继承而来,作为查询的上游服务器。
dnsPolicy: ClusterFirst
restartPolicy: Always
#spec:schedulername参数指定调度器的名字,可以为 pod 选择某个调度器进行调度
schedulerName: default-scheduler
#安全上下文(Security Context)定义 Pod 或 Container 的特权与访问控制设置。
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 3
conditions:
- lastTransitionTime: "2022-09-28T12:35:25Z"
lastUpdateTime: "2022-09-28T12:35:25Z"
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: "True"
type: Available
- lastTransitionTime: "2022-09-28T12:35:22Z"
lastUpdateTime: "2022-09-28T12:35:25Z"
message: ReplicaSet "test-deployment-5d9c9b97bb" has successfully progressed.
reason: NewReplicaSetAvailable
status: "True"
type: Progressing
observedGeneration: 1
readyReplicas: 3
replicas: 3
updatedReplicas: 3
ReplicaSet
ReplicaSet是kubernetes中的一种副本控制器,主要作用是控制由其管理的pod,使pod副本的数量始终维持在预设的个数。
kubernetes官方推荐不要直接使用ReplicaSet,用Deployments取而代之,Deployments是比ReplicaSet更高级的概念,它会管理ReplicaSet并提供很多其它有用的特性,最重要的是Deployments支持声明式更新,声明式更好相比于命令式更新的好处是不会丢失历史变更。总结起来就是:不要再直接使用ReplicaSet。
查看效果
$ k get rs -A
NAMESPACE NAME DESIRED CURRENT READY AGE
dev test-deployment-5d9c9b97bb 3 3 3 23h
guestbook-system guestbook-controller-manager-84cd65964f 1 1 1 60d
kube-system coredns-78fcd69978 2 2 2 64d
kubernetes-dashboard dashboard-metrics-scraper-7c857855d9 1 1 1 15d
kubernetes-dashboard kubernetes-dashboard-6b79449649 1 1 1 15d
查看清单:
$ k get rs -n dev test-deployment-5d9c9b97bb -o yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
annotations:
deployment.kubernetes.io/desired-replicas: "3"
deployment.kubernetes.io/max-replicas: "4"
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2022-09-28T12:35:22Z"
generation: 1
labels:
app: nginx-pod
pod-template-hash: 5d9c9b97bb
name: test-deployment-5d9c9b97bb
namespace: dev
ownerReferences:
- apiVersion: apps/v1
#控制特定的从属对象是否可以阻止垃圾收集删除其所有者对象
blockOwnerDeletion: true
controller: true
kind: Deployment
name: test-deployment
uid: 40feb568-1343-4046-8708-7e1bf5e5c384
resourceVersion: "5045808"
uid: 1dc27f38-b2db-48a1-b76a-ad044e3da2d7
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pod
pod-template-hash: 5d9c9b97bb
template:
metadata:
creationTimestamp: null
labels:
app: nginx-pod
pod-template-hash: 5d9c9b97bb
spec:
containers:
- image: nginx:1.17.1
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 3
fullyLabeledReplicas: 3
observedGeneration: 1
readyReplicas: 3
replicas: 3
Pod
Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。
$ k get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
dev test-deployment-5d9c9b97bb-7hmqb 1/1 Running 0 23h
dev test-deployment-5d9c9b97bb-bdwhq 1/1 Running 0 23h
dev test-deployment-5d9c9b97bb-l9fj2 1/1 Running 0 23h
guestbook-system guestbook-controller-manager-84cd65964f-c2z8x 2/2 Running 184 (34h ago) 60d
kube-system coredns-78fcd69978-s52td 1/1 Running 7 (11d ago) 64d
kube-system coredns-78fcd69978-z5fvx 1/1 Running 7 (11d ago) 64d
kube-system etcd-docker-desktop 1/1 Running 7 (11d ago) 64d
kube-system kube-apiserver-docker-desktop 1/1 Running 7 (11d ago) 64d
kube-system kube-controller-manager-docker-desktop 1/1 Running 7 (11d ago) 64d
kube-system kube-proxy-b5954 1/1 Running 7 (11d ago) 64d
kube-system kube-scheduler-docker-desktop 1/1 Running 146 (34h ago) 64d
kube-system storage-provisioner 1/1 Running 229 (34h ago) 64d
kube-system vpnkit-controller 1/1 Running 4395 (17m ago) 64d
kubernetes-dashboard dashboard-metrics-scraper-7c857855d9-g4slf 1/1 Running 1 (11d ago) 15d
kubernetes-dashboard kubernetes-dashboard-6b79449649-lrnz8 1/1 Running 10 (3d10h ago) 15d
查看清单:
$ k get pod -n dev test-deployment-5d9c9b97bb-7hmqb -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2022-09-28T12:35:22Z"
generateName: test-deployment-5d9c9b97bb-
labels:
app: nginx-pod
pod-template-hash: 5d9c9b97bb
name: test-deployment-5d9c9b97bb-7hmqb
namespace: dev
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: ReplicaSet
name: test-deployment-5d9c9b97bb
uid: 1dc27f38-b2db-48a1-b76a-ad044e3da2d7
resourceVersion: "5045804"
uid: 06aeda67-ccaa-4715-ab1a-992ae409cd12
spec:
containers:
- image: nginx:1.17.1
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-sgghr
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: docker-desktop
#优先级在普通的 pod 执行优先级的剔除是没什么问题的,但是在 job 控制器来运行的 pod 上就是一个灾难,如果 job 控制器运行的任务计划 pod 正在执行任务,此时因为集群节点的资源不够用导致 job 的 pod 被剔除集群节点,从而导致指定运行的任务被搁置,为了解决这个问题,可以在 PriorityClass 中设置属性 preemptionPolicy ,当它的值为 preemptionLowerPriorty(默认)时,则正常执行抢占策略(表示优先级低会被剔除)。如果将值设置为 Never 时则为默认不抢占,不会被剔除而是等待调度机会。
preemptionPolicy: PreemptLowerPriority
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes:
- name: kube-api-access-sgghr
projected:
defaultMode: 420
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
items:
- key: ca.crt
path: ca.crt
name: kube-root-ca.crt
- downwardAPI:
items:
- fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
path: namespace
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2022-09-28T12:35:22Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2022-09-28T12:35:25Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2022-09-28T12:35:25Z"
status: "True"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2022-09-28T12:35:22Z"
status: "True"
type: PodScheduled
containerStatuses:
- containerID: docker://1453a8ace21fbf107edd376e3357e7c9880afe6c67b2fdde535092bb8c654ddf
image: nginx:1.17.1
imageID: docker-pullable://nginx@sha256:b4b9b3eee194703fc2fa8afa5b7510c77ae70cfba567af1376a573a967c03dbb
lastState: {}
name: nginx
ready: true
restartCount: 0
started: true
state:
running:
startedAt: "2022-09-28T12:35:24Z"
hostIP: 192.168.65.4
phase: Running
podIP: 10.1.0.57
podIPs:
- ip: 10.1.0.57
qosClass: BestEffort
startTime: "2022-09-28T12:35:22Z"
Statefulset
应用场景
- 稳定的不共享持久化存储:即每个pod的存储资源是不共享的,且pod重新调度后还是能访问到相同的持久化数据,基于pvc实现。
- 稳定的网络标志:即pod重新调度后其PodName和HostName不变,且PodName和HostName是相同的,基于Headless Service来实现的。
- 有序部署,有序扩展:即pod是有顺序的,在部署或者扩展的时候是根据定义的顺序依次依序部署的(即从0到N-1,在下一个Pod运行之前所有之前的pod必都是Running状态或者Ready状态),是基于init containers来实现的。
- 有序收缩:在pod删除时是从最后一个依次往前删除,即从N-1到0.
基于上面的特性,可以发现statefulset由以下几个部分组成:
- 用于定义网络标志(DNS domain)的headless service
- 用于**创建pvc的volumeClaimTemplates**
- 具体的statefulSet应用
创建yaml文件示例
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None # 要点1,可以不用指定clusterIP
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx" # 要点2,指定serviceName名称
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
name: web
查看效果
# mosp @ mospdeMacBook-Pro in ~/study/myblog/mospan-hugo-blog on git:master x [17:35:39]
$ k get sts -A
NAMESPACE NAME READY AGE
default web 3/3 24h
# 可以看出StatefulSet不走ReplicalSet
$ k get rs -A
NAMESPACE NAME DESIRED CURRENT READY AGE
guestbook-system guestbook-controller-manager-84cd65964f 1 1 1 63d
kube-system coredns-78fcd69978 2 2 2 67d
kubernetes-dashboard dashboard-metrics-scraper-7c857855d9 1 1 1 19d
kubernetes-dashboard kubernetes-dashboard-6b79449649 1 1 1 19d
# mosp @ mospdeMacBook-Pro in ~/study/myblog/mospan-hugo-blog on git:master x [11:11:00]
$ k get svc -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 67d
default nginx ClusterIP None <none> 80/TCP 24h
guestbook-system guestbook-controller-manager-metrics-service ClusterIP 10.107.190.68 <none> 8443/TCP 63d
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 67d
kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.96.38.104 <none> 8000/TCP 19d
kubernetes-dashboard kubernetes-dashboard ClusterIP 10.102.50.227 <none> 443/TCP 19d
# mosp @ mospdeMacBook-Pro in ~/study/myblog/mospan-hugo-blog on git:master x [11:11:13]
$ k get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
default web-0 1/1 Running 0 24h
default web-1 1/1 Running 0 24h
default web-2 1/1 Running 0 24h
查看清单
查看service
$ k get svc nginx -n -o yaml apiVersion: v1 kind: Service metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"nginx"},"name":"nginx","namespace":"default"},"spec":{"clusterIP":"None","ports":[{"name":"web","port":80}],"selector":{"app":"nginx"}}} creationTimestamp: "2022-10-02T03:06:17Z" labels: app: nginx name: nginx namespace: default resourceVersion: "5343708" uid: ff6a9fb8-4abd-4fda-af08-6ecdf7695b5a spec: clusterIP: None clusterIPs: - None #kube-proxy 基于 spec.internalTrafficPolicy 的设置来过滤路由的目标服务端点。当它的值设为 Local 时,只选择节点本地的服务端点。当它的值设为 Cluster 或缺省时,则选择所有的服务端点。 internalTrafficPolicy: Cluster ipFamilies: - IPv4 #用spec.ipFamilyPolicy字段配置的,可设置为以下选项之一: #SingleStack #PreferDualStack #RequireDualStack #要使用双堆栈支持,你需要设置.spec.ipFamilyPolicy为PreferredDualStack或RequiredDualStack。此功能在Kubernetes中默认启用,还包括通过IPv4和IPv6地址的脱离集群出口路由。 ipFamilyPolicy: SingleStack ports: - name: web port: 80 protocol: TCP targetPort: 80 selector: app: nginx #使用svc.spec.sessionAffinity设置会话亲和性,默认是None。指定为ClientIP会使来自同一个Client IP的请求转发到同一个Pod上。 sessionAffinity: None type: ClusterIP status: loadBalancer: {}查看StatefulSet
1 $ k get sts web -o yaml 2 apiVersion: apps/v1 3 kind: StatefulSet 4 metadata: 5 annotations: 6 kubectl.kubernetes.io/last-applied-configuration: | 7 {"apiVersion":"apps/v1","kind":"StatefulSet","metadata":{"annotations":{},"name":"web","namespace":"default"},"spec":{"replicas":3,"selector":{"matchLabels":{"app":"nginx"}},"serviceName":"nginx","template":{"metadata":{"labels":{"app":"nginx"}},"spec":{"containers":[{"image":"nginx:alpine","name":"nginx","ports":[{"containerPort":80,"name":"web"}]}]}}}} 8 creationTimestamp: "2022-10-02T03:06:17Z" 9 generation: 1 10 name: web 11 namespace: default 12 resourceVersion: "5343757" 13 uid: b68fa0b0-ce5e-428c-b39e-b41956ddcc12 14 spec: 15 #pod管理策略,v1.7+可以通过.spec.podManagementPolicy设置pod的管理策略,支持以下俩中方式 16 #OrderedReady:默认方式,按照pod的次序依次创建每个pod并等待ready之后才创建后面的pod。 17 #Parallel:并行创建或删除pod,和deployment类型的pod一样。(不等待前面的pod ready就开始创建所有的pod)。 18 podManagementPolicy: OrderedReady 19 replicas: 3 20 revisionHistoryLimit: 10 21 selector: 22 matchLabels: 23 app: nginx 24 serviceName: nginx 25 template: 26 metadata: 27 creationTimestamp: null 28 labels: 29 app: nginx 30 spec: 31 containers: 32 - image: nginx:alpine 33 imagePullPolicy: IfNotPresent 34 name: nginx 35 ports: 36 - containerPort: 80 37 name: web 38 protocol: TCP 39 resources: {} 40 terminationMessagePath: /dev/termination-log 41 terminationMessagePolicy: File 42 dnsPolicy: ClusterFirst 43 restartPolicy: Always 44 schedulerName: default-scheduler 45 securityContext: {} 46 terminationGracePeriodSeconds: 30 47 updateStrategy: 48 rollingUpdate: 49 partition: 0 50 type: RollingUpdate 51 status: 52 availableReplicas: 3 53 collisionCount: 0 54 currentReplicas: 3 55 currentRevision: web-6d796b6548 56 observedGeneration: 1 57 readyReplicas: 3 58 replicas: 3 59 updateRevision: web-6d796b6548 60 updatedReplicas: 3 61查看Pod清单
$ k get pod web-0 -o yaml apiVersion: v1 kind: Pod metadata: creationTimestamp: "2022-10-02T03:06:17Z" generateName: web- labels: app: nginx controller-revision-hash: web-6d796b6548 statefulset.kubernetes.io/pod-name: web-0 name: web-0 namespace: default ownerReferences: - apiVersion: apps/v1 blockOwnerDeletion: true controller: true kind: StatefulSet name: web uid: b68fa0b0-ce5e-428c-b39e-b41956ddcc12 resourceVersion: "5343727" uid: 04b8e1f1-eed1-493e-a9b3-3b0791eca087 spec: containers: - image: nginx:alpine imagePullPolicy: IfNotPresent name: nginx ports: - containerPort: 80 name: web protocol: TCP resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /var/run/secrets/kubernetes.io/serviceaccount name: kube-api-access-v2xb5 readOnly: true dnsPolicy: ClusterFirst enableServiceLinks: true hostname: web-0 nodeName: docker-desktop preemptionPolicy: PreemptLowerPriority priority: 0 restartPolicy: Always schedulerName: default-scheduler securityContext: {} serviceAccount: default serviceAccountName: default subdomain: nginx terminationGracePeriodSeconds: 30 tolerations: - effect: NoExecute key: node.kubernetes.io/not-ready operator: Exists tolerationSeconds: 300 - effect: NoExecute key: node.kubernetes.io/unreachable operator: Exists tolerationSeconds: 300 volumes: - name: kube-api-access-v2xb5 projected: defaultMode: 420 sources: - serviceAccountToken: expirationSeconds: 3607 path: token - configMap: items: - key: ca.crt path: ca.crt name: kube-root-ca.crt - downwardAPI: items: - fieldRef: apiVersion: v1 fieldPath: metadata.namespace path: namespace status: conditions: - lastProbeTime: null lastTransitionTime: "2022-10-02T03:06:17Z" status: "True" type: Initialized - lastProbeTime: null lastTransitionTime: "2022-10-02T03:06:18Z" status: "True" type: Ready - lastProbeTime: null lastTransitionTime: "2022-10-02T03:06:18Z" status: "True" type: ContainersReady - lastProbeTime: null lastTransitionTime: "2022-10-02T03:06:17Z" status: "True" type: PodScheduled containerStatuses: - containerID: docker://bd6e1b11a24457b4892fd83fb306ec2bac9adca1a280b079b9502a0672a9d521 image: nginx:alpine imageID: docker-pullable://nginx@sha256:082f8c10bd47b6acc8ef15ae61ae45dd8fde0e9f389a8b5cb23c37408642bf5d lastState: {} name: nginx ready: true restartCount: 0 started: true state: running: startedAt: "2022-10-02T03:06:18Z" hostIP: 192.168.65.4 phase: Running podIP: 10.1.0.72 podIPs: - ip: 10.1.0.72 qosClass: BestEffort startTime: "2022-10-02T03:06:17Z"
DaemonSet
作用及概念
DaemonSet确保集群中每个(部分)node运行一份po副本,当node加入集群时创建pod,当node离开集群时回收pod。
如果删除DaemonSet,其创建的所有pod也被删除, DaemonSet中的pod覆盖整个集群。
当需要在集群内每个node运行同一个pod,使用 DaemonSet是有价值的,以下是典型使用场景:
- 运行集群存储守护进程,如 glusterd、ceph
- 运行集群日志收集守护进程,如 fluent、 logstash
- 运行节点监控守护进程,如 Prometheus Node Exporter, collectd, Datadog agent,
配置清单
$ cat daemonset-demo.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: deamonset-demo
namespace: default
spec:
selector:
matchLabels:
app: nginx-ds
template:
metadata:
labels:
app: nginx-ds
spec:
containers:
- name: nginx
image: nginx:1.17.1
查看效果
# mosp @ mospdeMacBook-Pro in ~/study/k8s/resource/daemonset [18:51:51]
$ k get ds -A
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
default deamonset-demo 1 1 1 1 1 <none> 10m
kube-system kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 68d
# mosp @ mospdeMacBook-Pro in ~/study/k8s/resource/daemonset [18:53:22]
$ k get rs -A
NAMESPACE NAME DESIRED CURRENT READY AGE
guestbook-system guestbook-controller-manager-84cd65964f 1 1 1 63d
kube-system coredns-78fcd69978 2 2 2 68d
kubernetes-dashboard dashboard-metrics-scraper-7c857855d9 1 1 1 19d
kubernetes-dashboard kubernetes-dashboard-6b79449649 1 1 1 19d
# mosp @ mospdeMacBook-Pro in ~/study/k8s/resource/daemonset [18:53:28]
$ k get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
default deamonset-demo-lbmmq 1/1 Running 0 10m
Job
作用及概念
详见:k8s Job详解
配置清单
$ cat job-demo.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: echo-time
spec:
completions: 10 #任务个数
parallelism: 5 #并行数
backoffLimit: 2 #失败最多执行几次
template:
spec:
containers:
- name: echo-time
image: centos:latest
imagePullPolicy: IfNotPresent
command:
- /bin/bash
- "-c"
- "for i in `seq 1 100`;do echo $i: `date` && sleep 1;done"
restartPolicy: OnFailure
查看效果
# mosp @ mospdeMacBook-Pro in ~/study/k8s/resource/job [20:17:06]
$ k get job -A
NAMESPACE NAME COMPLETIONS DURATION AGE
default echo-time 10/10 3m28s 5m40s
# mosp @ mospdeMacBook-Pro in ~/study/k8s/resource/job [20:20:49]
$ k get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
default deamonset-demo-lbmmq 1/1 Running 1 (9h ago) 5d1h
default echo-time--1-24lfm 0/1 Completed 0 4m7s
default echo-time--1-5drjv 0/1 Completed 0 4m9s
default echo-time--1-869rd 0/1 Completed 0 4m7s
default echo-time--1-8fd7m 0/1 Completed 0 4m9s
default echo-time--1-cqfjs 0/1 Completed 0 5m52s
default echo-time--1-f276r 0/1 Completed 0 5m52s
default echo-time--1-h4v9l 0/1 Completed 0 5m52s
default echo-time--1-lx4ww 0/1 Completed 0 5m52s
default echo-time--1-qd4kc 0/1 Completed 0 4m8s
default echo-time--1-zfchg 0/1 Completed 0 5m52s
每个Pod日志都能从1输出到100。
cronJob
作用及概念
CronJobs 对于创建周期性的、反复重复的任务很有用,例如执行数据备份或者发送邮件。 CronJobs 也可以用来计划在指定时间来执行的独立任务,例如计划当集群看起来很空闲时 执行某个 Job。
配置清单
$ cat cronjob-demo.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjob-demo
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: cronjob-demo
image: busybox
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
查看效果
# mosp @ mospdeMacBook-Pro in ~/study/k8s/resource [20:27:32]
$ k get cronjobs.batch -A
NAMESPACE NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
default cronjob-demo */1 * * * * False 0 40s 7m53s
# mosp @ mospdeMacBook-Pro in ~/study/k8s/resource [20:27:40]
$ k get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
default cronjob-demo-27761065--1-bjdj7 0/1 Completed 0 2m47s
default cronjob-demo-27761066--1-z9ttq 0/1 Completed 0 107s
default cronjob-demo-27761067--1-9x5fn 0/1 Completed 0 47s
通过观察发现,它只保留最新的3个pod,其他的将被删除掉免得占用资源。
HPA
作用及概念
Label&Annotation&Selector
Label
详见:k8s中label和label selector的基本概念及使用方法
Annotation
Selector
Label selector的使用场景:
1.kube-controller进程通过资源对象RC上定义的Label Selector来筛选要监控的Pod副本的数量,从而实现Pod副本的数量始终符合预期设定的全自动控制流程
2.kupe-proxy进程通过Service的Label Selector来选择对应的Pod,自动建立器每个Service到对应Pod的请求转发路由表,从而实现Service的智能负载均衡机制
3.通过对某些Node定义特定的Label,并且在Pod定义文件中使用NodeSelector这种标签调度策略,Kube-scheduler进程可以实现Pod定向调度的特性
详见: k8s selector_k8s之Label与Selector
参考资料
1.k8s之terminationMessagePath
2.Kubernetes之DNS
3.Kubernetes——调度器Scheduler
4.k8s之securityContext
5.Kubernetes的所有者和依赖
6.k8s之pod详解
7.kubernetes 之 pod 调度策略(一)
8.污点(taints)和容忍度(tolerations)
9.k8s网络模型-服务内部流量策略
10.k8s中statefulset资源类型的深入理解
11.k8s job简介和访问
12.k8s-HPA
作者:mospan
微信关注:墨斯潘園
本文出处:http://mospany.github.io/2022/09/28/resource/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
