k8s核心资源对象一(入门到精通)

        本文将深入探讨Kubernetes中的核心资源对象,包括Pod、Deployment、Service、Ingress、ConfigMap和Secret,详细解析其概念、功能以及实际应用场景,帮助读者全面掌握这些关键组件的使用方法。

一、pod

1 pod概念

       k8s最小调度单元,可以包含一个或多个容器。同一个pod的容器可以共享网络和存储。

2 pod示例

[root@master-1 pod]# cat 02-pods-nginx.yaml 
apiVersion: v1
kind: Pod
metadata:name: linux86-web
spec:containers:- name: webimage: nginx:1.24.0-alpineports:- containerPort: 80
[root@master-1 pod]# kubectl apply -f 02-pods-nginx.yaml
[root@master-1 pod]# kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
linux86-web   1/1     Running   0          82s   10.100.2.4   worker233   <none>           <none>
[root@master-1 pod]# curl -I  10.100.2.4

二、deployment

1 介绍

Deployment是用于部署服务的资源,是最常用的控制器

  • 管理RS,通过RS资源创建Pod;
  • 具有上线部署,副本设置,滚动升级,回滚等功能;
  • 提供声明式更新,即可以使用apply命令进行更新镜像版本之类的;

2 更新策略

蓝绿发布:不停止旧版本,直接部署新版本,新版本测试没有问题,就切换到新版本。
       优点:无需停机,风险较小
       缺点:切换是全量的,如果新版本有问题,则对用户体验有直接影响,需要双倍机器资源
灰度发布:旧版本和新版本共存
    将新版本部署到一部分生产环境,让一部分用户先试用,如果没有问题,再逐步扩大范围,把全部服务都切换到新环境。
        优点:用户体验影响小,灰度发布过程出现问题只影响部分用户
滚动更新:平滑地将服务更新

3  Deployment滚动发布

[root@master231 deployments]# cat 02-deploy-nginx-strategy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: deploy-nginx-strategy
spec:# 定义升级策略strategy:# 指定升级类型,有效值为Recreate和RollingUpdate.#    Recreate:#       先删除所有旧的Pod,再创建新的Pod。#    RollingUpdate:#       先删除部分旧的Pod,滚动更新旧的Pod,逐步使用新的Pod替代旧的Pod。#       默认就是基于滚动更新类型。# type: Recreatetype: RollingUpdate# 滚动更新rollingUpdate:# 在升级过程中,在原有旧的Pod基础之上启动的Pod数量。maxSurge: 2# 在升级过程中,指定最大不可用的数量。maxUnavailable: 1#maxSurge: "20%"#maxUnavailable: "10%"replicas: 5selector:matchExpressions:- key: appsvalues: - "v1"- "v2"operator: Intemplate:metadata:labels:apps: v1school: liuxspec:containers:- name: v1# image: harbor.liux.com/liux-apps/apps:v1image: harbor.liux.com/liux-apps/apps:v2imagePullPolicy: Always
---
apiVersion: v1
kind: Service
metadata:name: deploy-strategy
spec:type: NodePortselector:apps: v1school: liuxports:- port: 8888targetPort: 80nodePort: 30000
[root@master231 deployments]# 
升级过程
-------------> 第一波
旧的pod: 4
新的pod: 3 -------------> 第二波
旧的pod: 1
新的新的: 3  + 2[root@master231 deployments]# kubectl apply -f 02-deploy-nginx-strategy.yaml 
deployment.apps/deploy-nginx configured
service/deploy-strategy unchanged
[root@master231 deployments]# kubectl get po,svc -o wide
#切换版本
[root@master231 deployments]# vim 02-deploy-nginx-strategy.yaml #image: harbor.liux.com/liux-apps/apps:v1image: harbor.liux.com/liux-apps/apps:v2

4.Deloyment蓝绿发布

4.1 部署蓝环境

[root@master231 blue-green]# cat 01-blue.yaml 
kind: Deployment
apiVersion: apps/v1
metadata:name: liux-blue
spec:replicas: 3selector:matchLabels:app: bluetemplate:metadata:labels:app: bluespec:containers:- name: v1image: harbor.liux.com/liux-apps/apps:v1---kind: Service
apiVersion: v1
metadata:name: liux-app-svc
spec:type: NodePortports:- port: 80targetPort: 80nodePort: 30080selector:app: blue
[root@master231 blue-green]# 
[root@master231 blue-green]#  kubectl apply -f 01-blue.yaml 
deployment.apps/liux-blue created
service/liux-app-svc created
[root@master231 blue-green]#
#测试访问
[root@master231 blue-green]# while true ; do sleep 0.5;curl 10.0.0.233:30080; done

4.2 部署绿环境

[root@master231 blue-green]# cat 02-green.yaml 
kind: Deployment
apiVersion: apps/v1
metadata:name: liux-green
spec:replicas: 3selector:matchLabels:app: greentemplate:metadata:labels:app: greenspec:containers:- name: mywebimage: harbor.liux.com/liux-apps/apps:v2
[root@master231 blue-green]# 
[root@master231 blue-green]#  kubectl apply -f 02-green.yaml 
deployment.apps/liux-green created

4.4 切换svc的标签

[root@master231 blue-green]# cat 03-switch-svc-selector.yaml 
kind: Service
apiVersion: v1
metadata:name: liux-app-svc
spec:type: NodePortports:- port: 80targetPort: 80nodePort: 30080selector:# app: blueapp: green
[root@master231 blue-green]# 
[root@master231 blue-green]# kubectl apply -f 03-switch-svc-selector.yaml 
service/liux-app-svc configured

5.Deployment灰度发布

5.1 部署旧版本

 先将副本数设置为3,随着新版本的创建,将副本逐渐调低到0

[root@master231 canary-huidu]# cat 01-old.yaml 
kind: Deployment
apiVersion: apps/v1
metadata:name: liux-old
spec:replicas: 3selector:matchLabels:app: webtemplate:metadata:labels:app: webspec:containers:- name: mywebimage: harbor.liux.com/liux-apps/apps:v1
---
kind: Service
apiVersion: v1
metadata:name: liux-web-svc
spec:type: NodePortports:- port: 80targetPort: 80nodePort: 30080selector:app: web
[root@master231 canary-huidu]# 
[root@master231 canary-huidu]# kubectl apply -f 01-old.yaml 
deployment.apps/liux-old created
service/liux-web-svc created

5.2 部署新版本

  先将副本数设置为1,随着新版本的稳定,将副本逐渐调高到3

[root@master231 canary-huidu]# cat 02-new.yaml 
kind: Deployment
apiVersion: apps/v1
metadata:name: liux-new
spec:replicas: 1selector:matchLabels:app: webtemplate:metadata:labels:app: webspec:containers:- name: mywebimage: harbor.liux.com/liux-apps/apps:v2
[root@master231 canary-huidu]# 
[root@master231 canary-huidu]# 
[root@master231 canary-huidu]# kubectl apply -f 02-new.yaml 
deployment.apps/liux-new created

5.3 修改副本数量以及测试结果

  将旧的副本数量手动修改从3-0,与此同时,将新的副本数量从1-3

[root@master231 canary-huidu]# kubectl edit deploy liux-old 
deployment.apps/liux-old edited
[root@master231 canary-huidu]# kubectl edit deploy liux-new
deployment.apps/liux-new edited#测试访问
[root@master231 ~]# while true ; do sleep 0.5;curl  10.0.0.233:30080; done

三、service

1.概述

        service 用于服务发现和负载均衡。基于labels标签关联后端pod列表,以实现后端节点得动态发现,从而管理endpoints资源;负载均衡,底层借助于kube-proxy组件实现,基于iptables或者ipvs将用户请求转发给不同的Pod以均衡流量。

       Service配置Selector标签, Endpoints Controller(controller manager)会自动创建对应的endpoint对象,否则.不会生成endpoint对象。

2.service类型

  • ClusterIP(默认):集群内部访问,自动分配一个仅 Cluster 内部可以访问的虚拟 IP;
  • NodePort:通过节点IP和端口暴露服务,在ClusterIP基础上为service在所有worker节点绑定一个端口,通过nodeport端口来访问服务;
  • LoadBalancer:集成云厂商的负载均衡器(如AWS ELB);
  • ExternalName:映射到外部DNS。用于将K8S集群外部的服务映射至K8S集群内部访问,让集群内部的Pod能够通过固定的service名称访问集群外部的服务。

3.service示例

[root@master-1 nfs]# vim  nginx-demo.yaml
apiVersion: v1
kind: Service
metadata:labels:app: nginx-demoname: nginx-demo
spec:# 指定svc的类型为NodePort,也就是在默认的ClusterIP基础之上多监听所有worker节点的端口而已。type: NodePort# 配置端口映射ports:- nodePort: 30698# 指定Service服务本身的端口号port: 88protocol: TCP# 后端Pod提供服务的端口号targetPort: 80# 基于标签选择器关联Podselector:app: nginx-demo[root@master-1 nfs]# kubectl  apply -f nginx-demo.yaml
[root@master-1 nfs]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP        16d
nginx-demo   NodePort    10.0.0.187   <none>        88:30698/TCP   2d
[root@master-1 nfs]#  kubectl get endpoints
NAME             ENDPOINTS                                                  AGE
nginx-demo       172.17.1.3:80,172.17.77.11:80                              2d1h[root@master-1 nfs]# kubectl describe svc nginx-demo
Name:                     nginx-demo
Namespace:                default
Labels:                   app=nginx-demo
Annotations:              <none>
Selector:                 app=nginx-demo
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.0.0.187
IPs:                      10.0.0.187
Port:                     <unset>  88/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30698/TCP
Endpoints:                172.17.1.3:80,172.17.77.11:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>#访问
http://192.168.91.22:30698

4.endpoints

       Endpoint是Kubernetes集群中的一个资源对象,存储在etcd中,用来记录一个Service对应的所有pod的访问地址.

       Service配置Selector, 创建service时Endpoints Controller(controller manager)会自动创建对应的endpoint对象,否则.不会生成endpoint对象.

#查看endpoints
[root@master-1 nfs]#  kubectl get endpoints
NAME             ENDPOINTS                                                  AGE
fuseim.pri-ifs   <none>                                                     13d
kubernetes       192.168.91.18:6443,192.168.91.19:6443,192.168.91.20:6443   16d
nginx-demo       172.17.1.3:80,172.17.77.11:80                              2d1h
#查看etcd数据
[root@master-1 nfs]#  export ETCDCTL_API=3
[root@master-1 nfs]# export ETCD_ENDPOINTS=http://192.168.91.19:2390
[root@master-1 nfs]# etcdctl --endpoints=${ETCD_ENDPOINTS} get / --prefix --keys-only | grep 'endpoints/default/nginx-demo'
/registry/services/endpoints/default/nginx-demo

四、Ingress

1.概念

          Ingress是k8s中管理外部流量的核心组件,通过灵活的路由规则和丰富的控制器生态满足多样化需求。

        k8s使用ingress和ingress controller两者结合实现了完整的ingress负载均衡器。 负载分发时,ingress controller基于ingress规则将请求转发到service对应的endpoint上,用于将不同URL的访问请求转发到后端不同的service,以实现http层的业务路由机制。

        全过程:ingress controller-->ingress规则-->services-->endpoints(pod)

2.示例 编写ingress规则

访问nginx.liux.com,将会代理到svc中名称nginx.liux.com端口88上去
[root@master-1 ingress]# cat nginx-route-https.yaml 
#注意命名空间 namespace与要代理的服务需要在同一个名称空间
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:name: nginx-routenamespace: kube-system
spec:entryPoints:- webroutes:- match: Host(`nginx.liux.com`)kind: Ruleservices:- name: nginx-demoport: 88

3.Ingress与service的区别

       在 K8s 中,Ingress 和 Service 都是用于管理网络流量的核心组件,但它们的职责和使用场景有显著区别。

  • Service 是基础网络抽象,确保 Pod 的可访问性。
  • Ingress 是高级流量网关,专注于 HTTP 路由和集中管理。
  • 两者通常结合使用:Ingress 处理外部请求的路由,Service 负责内部流量的分发。

特性ServiceIngress
层级L4(TCP/UDP)L7(HTTP/HTTPS
核心功能服务发现、基础负载均衡高级路由、SSL 终止、流量管理
外部暴露方式NodePort、LoadBalancer通过 Ingress Controller + 规则
路由规则仅 IP/端口域名、路径、请求头等
资源成本每个 LoadBalancer 独立实例单一入口点管理多个服务
依赖组件无需额外组件

需要 Ingress Controller

示例:一个 Web 应用服务包含frontend-service(前端)和backend-service(后端 API),可进行如下配置:

配置方式:

  • Service:为 frontend-service 和 backend-service 创建 ClusterIP 类型的 Service,供集群内访问。
  • Ingress:定义规则将 www.example.com/ 路由到 frontend-service,将 www.example.com/api 路由到 backend-service,并启用 HTTPS。

       这样外部用户通过统一的域名访问,而 Ingress 根据路径将请求分发到不同的 Service,再由 Service 负载均衡到具体的 Pod。

五. ConfigMap 和 Secret

       ConfigMap 和 Secret 都是用于管理应用配置的核心资源,但它们的用途和安全性有显著区别。

1. ConfigMap

作用:

  • 存储 非敏感 的配置数据(如环境变量、配置文件、命令行参数等
  • 将配置与容器镜像解耦,便于应用配置的灵活管理

数据格式:

  • 数据以 明文 形式存储(如键值对、JSON、YAML 或纯文本文件)

典型场景:

  • 存储应用的配置文件(如 nginx.conf、application.properties)。
  • 定义环境变量(如 LOG_LEVEL=debug)。
  • 共享配置给多个 Pod 或多个容器。

安全性:

  • 不加密,数据对集群内用户可见,不适合存储敏感信息。

使用方式:

  • 通过环境变量注入容器。
  • 挂载为卷(Volume)到 Pod 的文件系统中。

示例:

#编写cm资源
[root@master231 cm]#  cat 02-cm-games.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: nginx-conf
# 指定cm的数据
data:games.conf: |server {listen        0.0.0.0:99;root          /usr/local/nginx/html/bird/;server_name   game01.liux.com;}#编写pod资源清单(在此引用cm资源)
[root@master231 pod]# vim 16-pods-volumes-configMap-games.yaml
apiVersion: v1
kind: Pod
metadata:name: liux-games-cm-008
spec:nodeName: worker233# hostNetwork: truevolumes:- name: data01# 指定存储卷类型是configMapconfigMap:# 指定configMap的名称name: nginx-conf# 引用configMap中的某个key,若不指定,则引用configMap资源的所有key。#items:# 指定configMap的key#- key: student.info# 暂时理解为在容器挂载点的文件名称。#path: banzhan.infocontainers:- name: gamesimage: harbor.liux.com/liux-games/games:v0.5volumeMounts:- name: data01#mountPath: /liux-linux86mountPath: /etc/nginx/conf.d/

2.Secret

作用:

  • 存储 敏感信息(如密码、API 密钥、TLS 证书、SSH 密钥等)。
  • 提供一定程度的安全保护(非完全加密,需结合其他机制增强安全性)。

数据格式:

  • 数据以 Base64 编码 形式存储(非加密,仅防意外泄露)。
  • 支持 stringData 字段直接写入明文(自动转换为 Base64)。

典型场景:

  • 存储数据库密码(如 mysql-password)。
  • 存储 TLS 证书(如 tls.crt 和 tls.key)。
  • 容器镜像仓库的认证信息(如 Docker harbor 凭据)。

安全性:

  • Base64 编码仅防止明文暴露,仍需配合以下措施
  • 启用 Kubernetes 的 Secret 加密机制(如使用 KMS、Vault)。
  • 限制集群内 RBAC 权限(避免未授权访问)。

使用方式:

  • 通过环境变量注入容器(不推荐,可能被日志记录)。
  • 挂载为卷到 Pod 的文件系统中(更安全)。

示例一创建:

#1.声明式创建
[root@master231 secrets]# echo admin |base64
YWRtaW4K
[root@master231 secrets]# echo 12366 |base64
MTIzNjYK
[root@master231 secrets]# vim 01-secret-userinfo.yaml apiVersion: v1
kind: Secret
metadata:name: my-secrets-01
data:# 对于Secret的值进行base64编码,当Pod的容器使用secret时会自动对数据进行解码username: YWRtaW4Kpassword: MTIzNjYK
[root@master231 secrets]# kubectl apply -f 01-secret-userinfo.yaml 
secret/my-secrets-01 created
[root@master231 secrets]# kubectl get secrets
NAME                                 TYPE                                  DATA   AGE
my-secrets-01                        Opaque                                2      82s#2. 响应式创建# - 基于命令行key=value的方式创建
[root@master231 secrets]# kubectl create secret generic my-secrets-02 --from-literal=username='admin' --from-literal=password='12366'# - 基于命令行读取文件的方式创建
[root@master231 secrets]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' -q
[root@master231 secrets]# kubectl create secret generic my-secrets-03 --from-file=ssh-privatekey=/root/.ssh/id_rsa --from-file=ssh-publickey=/root/.ssh/id_rsa.pub #响应式创建harbor的认证信息
[root@master231 secrets]#  kubectl create secret docker-registry liux-harbor --docker-username=admin --docker-password=12366 --docker-email=admin@liux.com --docker-server=harbor.liux.com

示例二引用:

#3.在pod中引用  基于存储卷、环境变量的方式挂载[root@master231 pod]# cat 31-pods-secrets-env-volumes.yaml 
apiVersion: v1
kind: Pod
metadata:name: linux86-web-secrets-env-cm-001
spec:volumes:- name: data01# 指定存储卷类型为secretsecret:# 指定secret的名称secretName: my-secrets-01- name: data02secret:secretName: my-secrets-01items:- key: usernamepath: username.info- key: passwordpath: password.txtcontainers:- name: webimage: harbor.liux.com/liux-web/nginx:1.25.1-alpine#基于存储卷的方式挂载volumeMounts:- name: data01mountPath: /liux-linux86-secrets- name: data02mountPath: /liux-linux86-secrets-2#基于环境变量的方式挂载env:- name: liux_USERNAMEvalueFrom:# 值引用自某个secretsecretKeyRef:# 指定secret的名称name: my-secrets-01# 指定引用secret对应的keykey: username- name: liux_SSH_PRIVATEKEYvalueFrom:secretKeyRef:name: my-secrets-03key: ssh-privatekey
[root@master231 pod]# 
[root@master231 pod]# kubectl apply -f 31-pods-secrets-env-volumes.yaml 
pod/linux86-web-secrets-env-cm-001 created
[root@master231 pod]# kubectl get pods
NAME                               READY   STATUS        RESTARTS      AGE
linux86-web-secrets-env-cm-001     1/1     Running       0             8s
[root@master231 pod]# kubectl exec -it linux86-web-secrets-env-cm-001 -- env#在pod中引用harbor登录信息 注意,请确保你创建的用户必须在harbor中对相应的项目有访问权限!
[root@master231 pod]# cat 32-pods-harbor-secrets.yaml 
apiVersion: v1
kind: Pod
metadata:name: linux86-secrets-harbor-001
spec:# 指定harbor的secret认证信息,可以指定多个。imagePullSecrets:- name: harbor-liuxing# - name: liux-harborcontainers:- name: webimage: harbor.liux.com/liux-apps/apps:v1# 指定镜像的拉取策略,若不指定,当tag为latest时,默认是Always,当tag非latest时,则默认策略为IfNotPresentimagePullPolicy: Always# imagePullPolicy: IfNotPresent

3.总结

特性ConfigMapSecret
数据类型非敏感配置(明文)敏感信息(Base64 编码)
安全性无加密,明文存储Base64 编码(非加密),需额外安全措施
典型用途配置文件、环境变量、命令行参数密码、密钥、证书
存储限制无大小限制每个 Secret 最大 1MiB
更新与热加载支持更新,挂载为卷时可自动同步同 ConfigMap,但需注意敏感数据更新策略

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

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

相关文章

《Sqoop 快速上手:安装 + 测试实战》

推荐原文 见&#xff1a;http://docs.xupengboo.top/bigdata/di/sqoop.html Sqoop&#xff08;SQL-to-Hadoop&#xff09; 是 Apache 开源的工具&#xff0c;专门用于在 Hadoop 生态系统&#xff08;如 HDFS、Hive、HBase&#xff09; 和 关系型数据库&#xff08;如 MySQL、O…

数据结构刷题之贪心算法

贪心算法&#xff08;Greedy Algorithm&#xff09; 是一种在每个步骤中都选择当前最优解的算法设计策略。它通常用于解决优化问题&#xff0c;例如最小化成本或最大化收益。贪心算法的核心思想是&#xff1a;在每一步选择中&#xff0c;都做出局部最优的选择&#xff0c;希望…

重新定义PPT创作!ChatPPT发布全球首个AI PPT专用MCP Server

在这个AI技术日新月异的时代&#xff0c;ChatPPT团队推出革命性的MCP Server&#xff08;Multimodal Collaboration Platform&#xff09;&#xff0c;这是全球首个专注于AI PPT生成领域的智能协作平台。该平台的诞生&#xff0c;标志着PPT创作正式迈入"智能协作"新纪…

未来蓉城:科技与生态共舞的诗意栖居-成都

故事背景 故事发生在中国四川成都的2075年&#xff0c;展现科技与自然深度交融的未来城市图景。通过六个充满想象力的生态装置场景&#xff0c;描绘市民在智慧城市中诗意栖居的生活状态&#xff0c;展现环境保护与人文传承的和谐共生。 故事内容 在电子竹林轻轨站&#xff0c;通…

计算机网络笔记-分组交换网中的时延

一、分组交换网络中的四种时延类型 1. 排队时延 在队列中&#xff0c;当分组在链路上等着被传输时的时延为排队时延&#xff0c;一个分组的排队时延长度取决于该分组前方等待传输的分组数量&#xff0c;如果排队队列为空&#xff0c;且没有正在传输的分组那么该分组的排队时延…

ubuntu20.04.6LTS 安装PCL 1.9.1

在虚拟机中&#xff0c;ubuntu20.04.6 LTS 安装PCL 1.9.1&#xff0c;实测成功了。 注意&#xff1a; 1、编译时选择双核&#xff0c;否则编译到一半报错&#xff0c;因为内存不够进程被杀死。 虚拟机是4核心、内存8G。可能选3核更快一点&#xff0c;双核编译了2个多小时。 …

SQL:JOIN 完全指南:从基础到实战应用

JOIN 是 SQL 中最重要也最常用的操作之一&#xff0c;它允许我们从多个表中获取关联数据。本文将全面解析 SQL 中的各种 JOIN 类型&#xff0c;包括 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN 以及 CROSS JOIN&#xff0c;并通过实际示例展示它们的应用场景。 一、JOIN 基…

IDEA 2024 Maven 设置为全局本地仓库,避免新建项目重新配置maven

使用idea创建Java项目时每次都要重新配置Maven&#xff0c;非常麻烦。其实IDEA可以配置全局Maven。方法如下&#xff1a; 1.关闭所有项目进入初始页面 2.选择所有配置 3.设置为自己的路径

UDP怎么样实现可靠传输?

如果需要在基于UDP的应用中实现可靠传输&#xff08;例如确保数据不丢失、按顺序到达等&#xff09;&#xff0c;通常需要在应用层实现相应的机制。 1. 确认应答机制 应用层可以使用确认应答机制来确保数据的可靠传输。当发送方发送一个数据包时&#xff0c;接收方收到数据包…

【CSS基础】- 02(emmet语法、复合选择器、显示模式、背景标签)

css第二天 一、emmet语法 1、简介 ​ Emmet语法的前身是Zen coding,它使用缩写,来提高html/css的编写速度, Vscode内部已经集成该语法。 ​ 快速生成HTML结构语法 ​ 快速生成CSS样式语法 2、快速生成HTML结构语法 生成标签 直接输入标签名 按tab键即可 比如 div 然后tab…

每日算法:洛谷U535992 J-C 小梦的宝石收集(双指针、二分)

题目描述 小梦有 n 颗能量宝石&#xff0c;其中第 i 颗的能量为 ai​&#xff0c;但这些能量宝石十分不稳定&#xff0c;随时有可能发生崩坏&#xff0c;导致他们全部消失&#xff01; 小梦想要留住宝石们&#xff0c;不希望他们发生崩坏&#xff0c;同时他发现&#xff1a;如…

Spring MVC 逻辑视图(JSP、Thymeleaf、FreeMarker)与非逻辑视图(JSON、Excel、PDF、XML)详解及示例

Spring MVC 逻辑视图与非逻辑视图详解及示例 一、逻辑视图与非逻辑视图的定义 类型定义逻辑视图通过视图解析器&#xff08;ViewResolver&#xff09;将逻辑名称&#xff08;如 success&#xff09;映射到具体视图实现。非逻辑视图直接返回具体视图对象&#xff08;如 JsonVie…

【AAOS】【源码分析】CarAudioService(二)-- 功能介绍

汽车音频是 Android 汽车操作系统 (AAOS) 的一项功能,允许车辆播放信息娱乐声音,例如媒体、导航和通信。AAOS 不负责具有严格可用性和时间要求的铃声和警告,因为这些声音通常由车辆的硬件处理。将汽车音频服务集成在汽车中,彻底改变了驾驶体验,为驾驶员和乘客提供了音乐、…

docker安装软件汇总(持续更新)

1、简介 本文介绍一些常用的软件通过docker安装并启动&#xff0c;持续更新。 2、docker安装软件 2.1、zookeeper & kafka # 1、拉取zookeeper镜像 git pull wurstmeister/zookeeper # 2、启动zookeeper容器 docker run -d --restartalways --log-driver json-file --lo…

MySQL的左连接、右连接、内连接、外连接

一、前言 MySQL中的左连接、右连接、内连接和全外连接是用于多表关联查询的核心操作。 二、内连接&#xff08;INNER JOIN&#xff09; 定义&#xff1a;返回两个表中完全匹配的行&#xff0c;即只保留两个表连接字段值相等的行。示例场景&#xff1a;查询所有有选课记录的学…

前端面试宝典---数据类型

基本数据类型 对于基本类型在创建时无需使用 new 关键字 Bigint在实际开发不常用&#xff0c;如果对于精度要求高可以使用第三方库&#xff0c;如decimal.js 基本数据类型介绍 undefined&#xff1a;当变量被声明但未赋值&#xff0c;或者函数没有返回值时&#xff0c;就会呈现…

Lua 函数使用的完整指南

在 Lua 中&#xff0c;函数是一等公民&#xff08;First-Class Citizen&#xff09;&#xff0c;这意味着函数可以像其他值一样被赋值、传递和操作。以下是 Lua 函数定义的完整指南&#xff0c;涵盖基础语法、高级特性、设计模式及性能优化。 在Lua 中&#xff0c;函数定义的完…

使用StockTV API对接印度金融市场数据全指南:K线、实时行情与IPO新股

一、印度金融市场数据特点 印度作为全球增长最快的主要经济体之一&#xff0c;其金融市场具有以下显著特征&#xff1a; 双交易所体系&#xff1a;国家证券交易所(NSE)和孟买证券交易所(BSE)高流动性品种&#xff1a;Nifty 50指数成分股、银行股等独特交易机制&#xff1a;T2…

2021-10-26 C++繁忙通信兵

缘由繁忙的通讯兵&#xff0c;可以解决一下吗-编程语言-CSDN问答 void 繁忙通信兵() {//缘由https://ask.csdn.net/questions/7544401?spm1005.2025.3001.5141int a 200, s1 8, s2 5, s3 45, p 0, n 0, c 0;std::cin >> n;while (a > n){a - s1 s2;if (a &l…

【Linux】进程控制:创建、终止、等待与替换全解析

文章目录 前言一、重谈进程创建二、进程终止2.1 正常终止的退出码机制2.2 异常终止的信号机制2.3 进程常见的退出方法 三、进程等待&#xff1a;避免僵尸进程的关键3.1 进程等待的必要性3.2 进程等待的两个系统调用接口3.2.1 wait()3.2.2 waitpid()区别 四、进程程序替换4.1 进…