kubernetes(K8S)学习(五):K8S进阶(Lifecycle......偏理论)

K8S进阶(Lifecycle......偏理论)

  • 一、Pod进阶学习之路
    • 1.1 Lifecycle
    • 1.2 重启策略
    • 1.3 静态Pod
    • 1.4 健康检查
    • 1.5 ConfigMap
    • 1.6 Secret
    • 1.7 指定Pod所运行的Node
  • 二、Controller进阶学习之路
    • 2.1 Job & CronJob
    • 2.2 StatefulSet
    • 2.3 DaemonSet
    • 2.4 Horizontal Pod Autoscaler

一、Pod进阶学习之路

1.1 Lifecycle

官网:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/

  • 挂起(Pending): Pod 已被 Kubernetes 系统接受,但有一个或者多个容器镜像尚未创建。等待时间包括调度 Pod 的时间和通过网络下载镜像的时间,这可能需要花点时间。
  • 运行中(Running): 该 Pod 已经绑定到了一个节点上,Pod 中所有的容器都已被创建。至少有一个容器正在运行,或者正处于启动或重启状态。
  • 成功(Succeeded): Pod 中的所有容器都被成功终止,并且不会再重启。
  • 失败(Failed): Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。
  • 未知(Unknown): 因为某些原因无法取得 Pod 的状态,通常是因为与 Pod 所在主机通信失败。

1.2 重启策略

官网:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy
 
PodSpec有一个restartPolicy字段,可能值为Always、OnFailure、Never,缺省值为Always。restartPolicy应用于Pod中的所有容器。restartPolicy仅指kubelet在同一节点上重启容器。kubelet重新启动的退出容器以指数级的回退延迟(10s、20s、40s……)重新启动,上限为5分钟,并在成功执行10分钟后重新启动。正如Pods文档中所讨论的,一旦绑定到一个节点,一个Pod将永远不会被rebound(反弹)到另一个节点。

  • Always:容器失效时,即重启
  • OnFailure:容器终止运行且退出码不为0时重启
  • Never:永远不重启

1.3 静态Pod

静态Pod是由kubelet进行管理的,并且存在于特定的Node上。

不能通过API Server进行管理,无法与ReplicationController,Ddeployment或者DaemonSet进行关联,也无法进行健康检查。


1.4 健康检查

官网:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes

The kubelet can optionally perform and react to three kinds of probes on running Containers:
kubelet可以在运行的容器上选择性地执行和响应三种探针:

  • livenessProbe: Indicates whether the Container is running. If the liveness probe fails, the kubelet kills the Container, and the Container is subjected to its restart policy. If a Container does not provide a liveness probe, the default state is Success.
  • readinessProbe: Indicates whether the Container is ready to service requests. If the readiness probe fails, the endpoints controller removes the Pod’s IP address from the endpoints of all Services that match the Pod. The default state of readiness before the initial delay is Failure. If a Container does not provide a readiness probe, the default state is Success.
  • startupProbe: Indicates whether the application within the Container is started. All other probes are disabled if a startup probe is provided, until it succeeds. If the startup probe fails, the kubelet kills the Container, and the Container is subjected to its restart policy. If a Container does not provide a startup probe, the default state is Success.

LivenessProbe探针:判断容器是否存活

ReadinessProbe探针:判断容器是否启动完成


1.5 ConfigMap

官网:https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/
 
ConfigMaps allow you to decouple configuration artifacts from image content to keep containerized applications portable. (ConfigMaps允许您将配置工件与图像内容解耦,以保持容器化的应用程序的可移植性。)
 

说白了就是用来保存配置数据的键值对,也可以保存单个属性,也可以保存配置文件。
 
所有的配置内容都存储在etcd中,创建的数据可以供Pod使用。


1.5.1 命令行创建
<pre data-index="0" class="set-code-show prettyprint"><code class="prism language-shell has-numbering" onclick="mdcp.copyCode(event)" style="position: unset;"><span class="token comment"># 创建一个名称为my-config的ConfigMap,key值时db.port,value值是'3306'</span>
kubectl create configmap my-config --from-literal<span class="token operator">=</span>db.port<span class="token operator">=</span><span class="token string">'3306'</span>
kubectl get configmap
<div class="hljs-button {2}" data-title="复制"></div></code><ul class="pre-numbering" style=""><li style="color: rgb(153, 153, 153);">1</li><li style="color: rgb(153, 153, 153);">2</li><li style="color: rgb(153, 153, 153);">3</li></ul></pre> 

详情信息

apiVersion: v1
data:
db.port: "3306"
kind: ConfigMap
metadata:
creationTimestamp: "2019-11-22T09:50:17Z"
name: my-config
namespace: default
resourceVersion: "691934"
selfLink: /api/v1/namespaces/default/configmaps/my-config
uid: 7d4f338b-0d0d-11ea-bb46-00163e0edcbd

查看命令:kubectl get configmap myconfig -o yaml


1.5.2 从配置文件中创建

创建一个文件,名称为app.properties

内容:

name=jack
age=17

命令:

kubectl create configmap app --from-file=./app.properties
kubectl get configmap
kubectl get configmap app -o yaml

1.5.3 从目录中创建
mkdir config
cd config
mkdir a
mkdir b
cd ..

命令:

kubectl create configmap config --from-file=config/
kubectl get configmap

1.5.4 通过yaml文件创建

创建configmaps.yaml:

apiVersion: v1
kind: ConfigMap
metadata:name: special-confignamespace: default
data:special.how: very
---
apiVersion: v1
kind: ConfigMap
metadata:name: env-confignamespace: default
data:log_level: INFO

命令:

kubectl apply -f configmaps.yaml
kubectl get configmap

1.5.5 ConfigMap的使用
  • 使用方式(3种)

(1) 通过环境变量的方式,直接传递给pod
      使用configmap中指定的key
      使用configmap中所有的key
(2) 通过在pod的命令行下运行的方式(启动命令中)
(3) 作为volume的方式挂载到pod内

注意:
(1) ConfigMap必须在Pod使用它之前创建
(2) 使用envFrom时,将会自动忽略无效的键
(3) Pod只能使用同一个命名空间的ConfigMap


1.5.5.1 通过环境变量使用

使用valueFrom、configMapKeyRef、name

key的话指定要用到的key

创建test-pod.yaml

apiVersion: v1
kind: Pod
metadata:name: dapi-test-pod
spec:containers:- name: test-containerimage: busyboxcommand: [ "/bin/sh", "-c", "env" ]env:# Define the environment variable- name: SPECIAL_LEVEL_KEYvalueFrom:configMapKeyRef:# The ConfigMap containing the value you want to assign to SPECIAL_LEVEL_KEYname: special-config# Specify the key associated with the valuekey: special.howrestartPolicy: Never

参考命令:
kubectl logs pod-name


1.5.5.2 用作命令行参数

在命令行下引用时,需要先设置为环境变量,之后可以用过$(VAR_NAME)设置容器启动命令的启动参数

创建test-pod2.yaml

apiVersion: v1
kind: Pod
metadata:name: dapi-test-pod2
spec:containers:- name: test-containerimage: busyboxcommand: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY)" ]env:- name: SPECIAL_LEVEL_KEYvalueFrom:configMapKeyRef:name: special-configkey: special.howrestartPolicy: Never

参考命令:
kubectl logs pod-name


1.5.5.3 作为volume挂载使用

将创建的ConfigMap直接挂载至Pod的/etc/config目录下,其中每一个key-value键值对都会生成一个文件,key为文件名,value为内容。

apiVersion: v1
kind: Pod
metadata:name: pod-configmap2
spec:containers:- name: test-containerimage: busyboxcommand: [ "/bin/sh", "-c", "ls /etc/config/" ]volumeMounts:- name: config-volumemountPath: /etc/configvolumes:- name: config-volumeconfigMap:name: special-configrestartPolicy: Never

参考命令:
kubectl apply -f pod-myconfigmap-v2.yml

kubectl exec -it pod-name bash

kubectl logs pod-name


1.5.6 ConfigMap在Ingress Controller中实战【测试】

在之前ingress网络中的mandatory.yaml文件中使用了ConfigMap,于是我们可以打开
可以发现有nginx-configuration、tcp-services等名称的cm(ConfigMap), 而且也可以发现最后在容器的参数中使用了这些cm(ConfigMap)。

containers:- name: nginx-ingress-controllerimage: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1args:- /nginx-ingress-controller- --configmap=$(POD_NAMESPACE)/nginx-configuration- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services- --udp-services-configmap=$(POD_NAMESPACE)/udp-services- --publish-service=$(POD_NAMESPACE)/ingress-nginx- --annotations-prefix=nginx.ingress.kubernetes.io

开启证明之旅和cm(ConfigMap)的使用方式

(1)查看nginx ingress controller的pod部署

kubectl get pods -n ingress-nginx -o wide

NAME                                        READY   STATUS    RESTARTS   AGE
nginx-ingress-controller-7c66dcdd6c-v8grg   1/1     Running   0          8dNAME                                        READY   STATUS    RESTARTS   AGE   IP              NODE   NOMINATED NODE   READINESS GATES
nginx-ingress-controller-7c66dcdd6c-v8grg   1/1     Running   0          8d    172.16.31.150   w1     <none>           <none>

(2)发现运行在w1节点上,说明w1上一定有对应的container,来到w1节点

docker ps | grep ingress

ddde4b354852        quay.io/kubernetes-ingress-controller/nginx-ingress-controller   "/usr/bin/dumb-init …"   8 days ago          Up 8 days                               k8s_nginx-ingress-controller_nginx-ingress-controller-7c66dcdd6c-v8grg_ingress-nginx_b3e2f9a5-0943-11ea-b2b3-00163e0edcbd_0b6b7412855c5        k8s.gcr.io/pause:3.1                                             "/pause"                 8 days ago          Up 8 days                               k8s_POD_nginx-ingress-controller-7c66dcdd6c-v8grg_ingress-nginx_b3e2f9a5-0943-11ea-b2b3-00163e0edcbd_0

(3)进入容器查看

docker exec -it ddde4b354852 bash


(4)发现其就是一个nginx
/etc/nginx/nginx.conf

(5)打开nginx.conf文件查看

假如已经配置过ingress,不妨尝试搜索一下"k8s.demoxxx"/“itcrazy2016.com”

server {server_name k8s.itcrazy2016.com ;

原来nginx ingress controller就是一个nginx,而所谓的ingress.yaml文件中配置的内容像itcrazy2016.com就会对应到nginx.conf中。

但是,不可能每次都进入到容器里面来修改,而且还需要手动重启nginx,很麻烦。所以在K8s中有对应的方式,修改了什么就能修改nginx.conf文件。


(6)测试修改属性

先查看一下nginx.conf文件中的内容,比如找个属性:proxy_connect_timeout 5s

proxy_connect_timeout属性,对应ConfigMap中的属性proxy-read-timeout,测试如下:

①创建nginx-config.yaml,设置cm(ConfigMap)的proxy-read-timeout属性值:

kind: ConfigMap
apiVersion: v1
metadata:name: nginx-configurationnamespace: ingress-nginxlabels:app: ingress-nginx
data:proxy-read-timeout: "208"

② 执行相关命令:

kubectl apply -f nginx-config.yaml

kubectl get cm -n ingress-nginx

③再次查看nginx.conf文件,发现其proxy-read-timeout属性值被修改了。

注: ConfigMap和nginx属性定义规则都在nginx ingress controller的官网中:

https://kubernetes.github.io/ingress-nginx/

https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/


1.6 Secret

官网:https://kubernetes.io/docs/concepts/configuration/secret/

Kubernetes秘密对象允许您存储和管理敏感信息,如密码、OAuth令牌和ssh密钥。


1.6.1 Secret类型
  • (1)Opaque: 使用base64编码存储信息,可以通过base64 --decode解码获得原始数据,因此安全性弱。
  • (2)kubernetes.io/dockerconfigjson: 用于存储docker registry的认证信息。
  • (3)kubernetes.io/service-account-token: 用于被 serviceaccount 引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。

1.6.2 Opaque Secret

Opaque类型的Secret的value为base64位编码后的值

1.6.2.1 从文件中创建
echo -n "admin" > ./username.txt
echo -n "1f2d1e2e67df" > ./password.txt
kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
kubectl get secret

1.6.2.2 使用yaml文件创建

(1)对数据进行64位编码

echo -n 'admin' | base64
echo -n '1f2d1e2e67df' | base64

(2)定义mysecret.yaml文件

apiVersion: v1
kind: Secret
metadata:name: mysecret
type: Opaque
data:username: YWRtaW4=password: MWYyZDFlMmU2N2Rm

(3)根据yaml文件创建资源并查看

kubectl create -f ./secret.yaml
kubectl get secret
kubectl get secret mysecret -o yaml

1.6.3 Secret使用
  • 以Volume方式
  • 以环境变量方式
1.6.3.1 将Secret挂载到Volume中

创建mypod.yaml:

apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: mypodimage: redisvolumeMounts:- name: foomountPath: "/etc/foo"readOnly: truevolumes:- name: foosecret:secretName: mysecret

创建pod:

kubectl apply -f mypod.yaml

进入容器查看:

kubectl exec -it pod-name bash
ls /etc/foo
cat /etc/foo/username
cat /etc/foo/password

1.6.3.2 将Secret设置为环境变量
apiVersion: v1
kind: Pod
metadata:name: secret-env-pod
spec:containers:- name: mycontainerimage: redisenv:- name: SECRET_USERNAMEvalueFrom:secretKeyRef:name: mysecretkey: username- name: SECRET_PASSWORDvalueFrom:secretKeyRef:name: mysecretkey: passwordrestartPolicy: Never

1.6.4 kubernetes.io/dockerconfigjson

kubernetes.io/dockerconfigjson用于存储docker registry的认证信息,可以直接使用kubectl create secret命令创建


1.6.5 kubernetes.io/service-account-token

用于被 serviceaccount 引用。

serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。

kubectl get secret   # 可以看到service-account-token
kubectl run nginx --image nginx
kubectl get pods
kubectl exec -it nginx-pod-name bash
ls /run/secrets/kubernetes.io/serviceaccount
kubectl get secret
kubectl get pods pod-name -o yaml   
#  找到volumes选项,定位到-name,secretName
#  找到volumeMounts选项,定位到mountPath: /var/run/secrets/kubernetes.io/serviceaccount

小结:无论是ConfigMap,Secret,还是DownwardAPI,都是通过ProjectedVolume实现的,可以通过APIServer将信息放到Pod中进行使用。


1.7 指定Pod所运行的Node

(1)给node打上label
kubectl get nodes
kubectl label nodes worker02-kubeadm-k8s name=jack
(2)查看node是否有上述label
kubectl describe node worker02-kubeadm-k8s
(3)部署一个mysql的pod

vi mysql-pod.yaml

apiVersion: v1
kind: ReplicationController
metadata:name: mysql-rclabels:name: mysql-rc
spec:replicas: 1selector:name: mysql-podtemplate:metadata:labels: name: mysql-podspec:nodeSelector: name: jackcontainers:- name: mysqlimage: mysqlimagePullPolicy: IfNotPresentports:- containerPort: 3306env:- name: MYSQL_ROOT_PASSWORDvalue: "mysql"    
---
apiVersion: v1
kind: Service
metadata:name: mysql-svclabels: name: mysql-svc
spec:type: NodePortports:- port: 3306protocol: TCPtargetPort: 3306name: httpnodePort: 32306selector:name: mysql-pod
(4)查看pod运行详情
kubectl apply -f mysql-pod.yaml
kubectl get pods -o wide


二、Controller进阶学习之路

既然学习了Pod进阶,对于管理Pod的Controller肯定也要进阶一下,之前我们已经学习过的Controller有RC、RS和Deployment,除此之外还有吗?
 
官网:https://kubernetes.io/docs/concepts/architecture/controller/

2.1 Job & CronJob

2.1.1 Job

官网:https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/

A Job creates one or more Pods and ensures that a specified number of them successfully terminate. As pods successfully complete, the Job tracks the successful completions. When a specified number of successful completions is reached, the task (ie, Job) is complete. Deleting a Job will clean up the Pods it created.(Job创建一个或多个pod,并确保指定数量的pod成功终止。当pod成功完成时,Job将跟踪成功完成情况。当达到指定数量的成功完成时,任务(即Job)就完成了。删除Job将清理它创建的pod。)
 

    对于RS,RC之类的控制器,能够保持Pod按照预期数目持久地运行下去,它们针对的是持久性的任务,比如web服务。而有些操作其实不需要持久,比如压缩文件,我们希望任务完成之后,Pod就结束运行,不需要保持在系统中,此时就需要用到Job。
    所以可以这样理解,Job是对RS、RC等持久性控制器的补充。负责批量处理短暂的一次性任务,仅执行一次,并保证处理的一个或者多个Pod成功结束。


示例

下面是一个job配置示例:大约需要10秒才能完成,打印到日志中。

创建job.yaml:

apiVersion: batch/v1
kind: Job
metadata:name: job-demo
spec:template:metadata:name: job-demospec:restartPolicy: Nevercontainers:- name: counterimage: busyboxcommand:- "bin/sh"- "-c"- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"

命令:

kubectl apply -f job.yaml

kubectl describe jobs/pi

kubectl logs pod-name

  • 非并行Job: 通常只运行一个Pod,Pod成功结束Job就退出。
  • 固定完成次数的并行Job: 并发运行指定数量的Pod,直到指定数量的Pod成功,Job结束。
  • 带有工作队列的并行Job:

(1)用户可以指定并行的Pod数量,当任何Pod成功结束后,不会再创建新的Pod
(2)一旦有一个Pod成功结束,并且所有的Pods都结束了,该Job就成功结束。
(3)一旦有一个Pod成功结束,其他Pods都会准备退出。


2.1.2 CronJob

官网:https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/
 
cronJob是基于时间进行任务的定时管理。
一个CronJob对象类似于crontab (cron表)文件的一行。它以Cron格式编写,按照给定的调度周期运行作业。

  • 在特定的时间点运行任务
  • 反复在指定的时间点运行任务:比如定时进行数据库备份,定时发送电子邮件等等。

2.2 StatefulSet

官网:https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

StatefulSet is the workload API object used to manage stateful applications.
Manages the deployment and scaling of a set of Pods, and provides guarantees about the ordering and uniqueness of these Pods.
  • Stable, unique network identifiers.
  • Stable, persistent storage.
  • Ordered, graceful deployment and scaling.
  • Ordered, automated rolling updates.

之前接触的Pod的管理对象比如RC、Deployment、DaemonSet和Job都是面向无状态的服务,但是现实中有很多服务是有状态的,比如MySQL集群、MongoDB集群、ZK集群等,它们都有以下共同的特点:

  • 每个节点都有固定的ID,通过该ID,集群中的成员可以互相发现并且通信
  • 集群的规模是比较固定的,集群规模不能随意变动
  • 集群里的每个节点都是有状态的,通常会持久化数据到永久存储中
  • 如果磁盘损坏,则集群里的某个节点无法正常运行,集群功能受损

而之前的RC/Deployment没办法满足要求,所以从Kubernetes v1.4版本就引入了PetSet资源对象,在v1.5版本时更名为StatefulSet。从本质上说,StatefulSet可以看作是Deployment/RC对象的特殊变种

  • StatefulSet里的每个Pod都有稳定、唯一的网络标识,可以用来发现集群内其他的成员
  • Pod的启动顺序是受控的,操作第n个Pod时,前n-1个Pod已经是运行且准备好的状态
  • StatefulSet里的Pod采用稳定的持久化存储卷,通过PV/PVC来实现,删除Pod时默认不会删除与StatefulSet相关的存储卷
  • StatefulSet需要与Headless Service配合使用

Have a try

kubectl apply nginx-st.yaml

watch kubectl get pods # 观察pod的创建顺序,以及pod的名字

# 定义Service
apiVersion: v1
kind: Service
metadata:name: nginxlabels:app: nginx
spec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx
---
# 定义StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:name: web
spec:selector:matchLabels:app: nginx serviceName: "nginx"  replicas: 3 template:metadata:labels:app: nginx spec:terminationGracePeriodSeconds: 10containers:- name: nginximage: nginxports:- containerPort: 80name: web

2.3 DaemonSet

官网:https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/

A DaemonSet ensures that all (or some) Nodes run a copy of a Pod. As nodes are added to the cluster, Pods are added to them. As nodes are removed from the cluster, those Pods are garbage collected. Deleting a DaemonSet will clean up the Pods it created.

DaemonSet应用场景

  • 运行集群存储 daemon,例如在每个节点上运行 glusterdceph
  • 在每个节点上运行日志收集 daemon,例如fluentdlogstash
  • 在每个节点上运行监控 daemon,例如 Prometheus Node Exporter、collectd、Datadog 代理、New Relic 代理,或 Ganglia gmond

2.4 Horizontal Pod Autoscaler

官网:https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/

The Horizontal Pod Autoscaler automatically scales the number of pods in a replication controller, deployment or replica set based on observed CPU utilization (or, with custom metrics support, on some other application-provided metrics). Note that Horizontal Pod Autoscaling does not apply to objects that can’t be scaled, for example, DaemonSets.
 

使用Horizontal Pod Autoscaling,Kubernetes会自动地根据观察到的CPU利用率(或者通过一些其他应用程序提供的自定义的指标)自动地缩放在replication controller、deployment或replica set上pod的数量。

在这里插入图片描述


(0)创建nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:app: nginx
spec:
containers:- name: nginximage: nginxports:- containerPort: 80

命令:

kubectl apply -f nginx-deployment.yaml

(1)创建hpa
# 使nginx pod的数量介于2和10之间,CPU使用率维持在50%
kubectl autoscale deployment nginx-deployment --min=2 --max=10 --cpu-percent=50
(2)查看所有创建的资源
kubectl get pods
kubectl get deploy
kubectl get hpa
(3)修改replicas值为1或者11

可以发现最终最小还是2,最大还是10

kubectl edit deployment nginx-deployment
(4)再次理解什么是hpa

Horizontal Pod Autoscaling可以根据CPU使用率或应用自定义metrics自动扩展Pod数量(支持replication controller、deployment和replica set)

 

01-控制管理器每隔30s查询metrics的资源使用情况
02-通过kubectl创建一个horizontalPodAutoscaler对象,并存储到etcd中
03-APIServer:负责接受创建hpa对象,然后存入etcd



03 Resource

3.1 Resource

因为K8S的最小操作单元是Pod,所以这里主要讨论的是Pod的资源。

官网:https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/

在K8S的集群中,Node节点的资源信息会上报给APIServer。

requests&limits

可以通过这两个属性设置cpu和内存

When Containers have resource requests specified, the scheduler can make better decisions about which nodes to place Pods on. And when Containers have their limits specified, contention for resources on a node can be handled in a specified manner.(当容器指定了资源请求时,调度器可以更好地决定将pod放置在哪些节点上。当容器指定了它们的限制时,可以以指定的方式处理节点上资源的争用。)

apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:- name: dbimage: mysqlenv:- name: MYSQL_ROOT_PASSWORDvalue: "password"resources:requests:memory: "64Mi"     # 表示64M需要内存cpu: "250m"        # 表示需要0.25核的CPUlimits:memory: "128Mi"    cpu: "500m"- name: wpimage: wordpressresources:requests:memory: "64Mi"cpu: "250m"limits:memory: "128Mi"cpu: "500m"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Adobe Illustrator 2023 for Mac/Win:创意无限,设计无界

在数字艺术与设计领域&#xff0c;Adobe Illustrator 2023无疑是一颗璀璨的明星。这款专为Mac和Windows用户打造的矢量图形设计软件&#xff0c;以其强大的功能和卓越的性能&#xff0c;赢得了全球设计师的广泛赞誉。 Adobe Illustrator 2023在继承前代版本优点的基础上&#…

鸿蒙 UIAbility和Compent 生命周期

一、UIAbility的生命周期 在UIAbility的使用过程中&#xff0c;会有多种生命周期状态&#xff0c;掌握UIAbility的生命周期&#xff0c;对于应用的开发非常重要。 1、UIAbility的生命周期 UIAbility的生命周期主要分为以下4个&#xff1a; Create---Foreground---Background---…

多模态大模型:解析未来智能汽车的新引擎

多模态大模型&#xff1a;解析未来智能汽车的新引擎 1. 多模态大模型简介2. 多模态大模型在智能汽车中的应用2.1 感知与认知2.2 智能驾驶辅助2.3 智能交互 随着人工智能技术的不断进步&#xff0c;智能汽车已经从概念变成了现实&#xff0c;成为了当今科技领域的焦点之一。而在…

大模型预测,下一个token何必是文字?

太快了太快了… 大模型的生成技能&#xff0c;已经到了普通人看不懂的境界&#xff01; 它可以根据用户过去5年的体检报告&#xff0c;生成未来第1年、第2年、第3年的体检报告。 你看&#xff0c;这个生成的过程&#xff0c;是不是像极了ChatGPT&#xff0c;根据历史单词预测…

顺序栈、链式栈、顺序队列、链式队列的ADT及其实现

顺序栈ADT及其实现 链式栈ADT及其实现 顺序队列的ADT及其实现 在数组中队首队尾的分配方案 第三中方案&#xff0c;即达到入队出队操作的时间代价是O&#xff08;1&#xff09; 同时可充分利用空间&#xff0c;不会出现空间似乎用完了的假象 时间性能和空间性能发挥到最大 链…

快速上手Spring Cloud 九:服务间通信与消息队列

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

短视频矩阵系统---开发源头交付

短视频矩阵系统---开发源头交付 短视频矩阵系统的核心开发步骤包括以下几个方面&#xff1a; 1. 系统设计&#xff1a;根据需求分析&#xff0c;设计出相应的系统架构&#xff0c;包括数据库设计、系统功能模块设计等。 2. 开发基础功能&#xff1a;基础功能包括短视频的上传、…

数据库工具——DBeaver的安装及使用

目录 一、DBeaver介绍 1.定义 2.支持的数据库 3.支持的操作系统 4.特点 二、DBeaver安装及使用 1.服务启动 2.查看连接类型 3.演示连接Mysql数据库 4.连接配置 5.成功连接 6.远程控制 6.1新建数据库 6.2新建数据表 6.3添加字段列 6.4使用SQL编辑器进行编辑 一…

双向长短期BiLSTM的回归预测-附MATLAB代码

BiLSTM是一种带有正反向连接的长短期记忆网络&#xff08;LSTM&#xff09;。 BiLSTM通过两个独立的LSTM层&#xff0c;一个按时间顺序处理输入&#xff0c;另一个按时间倒序处理输入&#xff0c;分别从正向和反向两个方向捕捉输入序列的特征。具体地&#xff0c;正向LSTM按时…

蓝桥杯物联网竞赛_STM32L071_13_定时器

CubeMx配置LPTIM: counts internal clock events 计数内部时钟事件 prescaler 预分频器 updata end of period 更新期末 kil5配置&#xff1a; 中断回调函数完善一下&#xff1a; void HAL_LPTIM_AutoReloadMatchCallback(LPTIM_HandleTypeDef *hlptim){if(cnt ! 10) cnt…

Python:执行py命令,提示: Can‘t find a default Python.

1.Python运行环境罢工 今天&#xff0c;要运行一个前年用python编写的爬虫程序&#xff0c;先检测python运行环境是否正常&#xff1a; D:\Python38-32\works>c:\windows\py.exe Cant find a default Python. 再试&#xff1a; D:\Python38-32\works>py --list Installe…

基于单片机的便携式瓦斯检测仪系统设计

**单片机设计介绍&#xff0c;基于单片机的便携式瓦斯检测仪系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的便携式瓦斯检测仪系统设计是一个针对煤矿等工业环境中瓦斯气体浓度检测的重要项目。以下是该设计…

RN在android/ios手机剪切图片的操作

之前写过一个React Native调用摄像头画面及拍照和保存图片到相册全流程但是这个仅限于调用摄像头拍照并保存图片,今天再写一个版本的操作,这个博客目前实现的有三点操作: 调用摄像头拍照对照片进行剪切从相册选取图片 功能上面来说有两点: 点击按钮可以对摄像头进行拍照,拍完照…

C++进阶,手把手带你学继承

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;c大冒险 总有光环在陨落&#xff0c;总有新星在闪烁 【本节目标】 1.继…

引领2024年的人工智能前景:趋势、预测和可能性(万字长文)

欢迎来到2024年人工智能和技术的可能性之旅。在这里&#xff0c;每一个预测都是一个潜在的窗口&#xff0c;未来充满了创新、变化&#xff0c;更重要的是&#xff0c;机会类似于20世纪50年代的工业革命。50年代见证了数字计算的兴起&#xff0c;重塑了行业和社会规范。今天&…

【面经】2023年软件测试面试题大全(持续更新)附答案

前阵子一位读者告诉我&#xff0c;某位大厂HR给他发了我之前做的面试题答案合集。 这个消息让我开心了一整天&#x1f602;&#xff0c;因为这说明我之前做的面试题系列真的能帮助到部分测试同学&#xff0c;也算是侧面得到了一种认可吧。 坚持可是我们程序员家族的优良传统&a…

实时语音识别(Python+HTML实战)

项目下载地址&#xff1a;FunASR 1 安装库文件 项目提示所需要下载的库文件&#xff1a;pip install -U funasr 和 pip install modelscope 运行过程中&#xff0c;我发现还需要下载以下库文件才能正常运行&#xff1a; 下载&#xff1a;pip install websockets&#xff0c;pi…

【爬虫开发】爬虫从0到1全知识md笔记第2篇:requests模块,知识点:【附代码文档】

爬虫开发从0到1全知识教程完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;爬虫课程概要&#xff0c;爬虫基础爬虫概述,,http协议复习。requests模块&#xff0c;requests模块1. requests模块介绍,2. response响应对象,3. requests模块发送请求,4. request…

【C++的奇迹之旅】C++关键字命名空间使用的三种方式C++输入输出命名空间std的使用惯例

文章目录 &#x1f4dd;前言&#x1f320; C关键字(C98)&#x1f309; 命名空间&#x1f320;命名空间定义&#x1f309;命名空间使用 &#x1f320;命名空间的使用有三种方式&#xff1a;&#x1f309;加命名空间名称及作用域限定符&#x1f320;使用using将命名空间中某个成员…

跨境电商IP防关联是什么?有什么作用?

做跨境电商的朋友应该都知道IP防关联这个词,那么为何IP需要防关联呢&#xff1f;今天为大家来解答这个问题。 跨境电商IP防关联是指在跨境电商运营中&#xff0c;通过采取一系列技术手段&#xff0c;确保每个跨境电商账号使用独立的IP地址&#xff0c;以避免账号之间因为IP地址…