【云原生kubernetes】k8s中控制器使用详解

news2024/9/20 20:40:31

一、什么是控制器

  • 控制器是管理pod的中间层,只需要告诉Pod控制器,想要创建多少个什么样的Pod,它会创建出满足条件的Pod ;
  • 控制器相当于一个状态机,用来控制Pod的具体状态和行为 ;
  • controller会自动创建相应的pod资源,并在当pod发生故障的时候按照策略进行重新编排;
  • 通过它来实现对pod的管理,比如启动pod、停止pod、扩展pod的数量等等 ; 

通俗来说就是,控制器就是pod的幕后老板

二、k8s中常用的控制器

k8s发展到今天,产生了很多种控制器,以下列举常用的几类控制器;

ReplicaSet

ReplicaSet 主要具备下面的特点:

  • 一种副本控制器,简称rs,主要是控制由其管理的pod,使pod副本的数量始终维持在预设的个数 ;
  • 并支持pod数量扩缩容,镜像版本升级 ;
  • 官方建议不要直接使用ReplicaSet,用Deployments更好,并提供很多其它有用的特性 ;

Deployment

通过控制ReplicaSet来控制Pod,并支持滚动升级、回退版本,适合无状态的服务部署

主要特点如下:

  • 当某个应用有新版本发布时,Deployment会同时操作两个版本的ReplicaSet ;
  • 内置多种滚动升级策略,会按照既定策略降低老版本的Pod数量,同时也创建新版本的Pod ;
  • Deployment控制器不直接管理Pod对象,而是 Deployment 管理ReplicaSet, 再由ReplicaSet管理Pod对象 ;

DaemonSet

在K8S集群部署中由于节点数量不定,那么如果我们需要对每个节点中都运行一个守护进程、日志收集进程等情况时,在k8s中如何实现呢?这个时候就是DaemonSet应用场景了

其主要特点如下:

  • 这类Pod 运行在K8S 集群里的每一个节点(Node)上,确保所有节点上有且仅有一个pod ;
  • 有新的节点加入 K8S集群后,该 Pod 会自动地在新节点上被创建出来 ;
  • 而当旧节点被删除后,它上面的 Pod也相应地会被回收掉 ;
  • 应用场景:监控告警Agent、日志组件、监控组件等 ;

StatefulSet

像RS、Deployment、DaemonSet都是面向无状态的服务,所管理的Pod的IP、名字,启停顺序都是随机 ,StatefulSet就是有状态的集合,管理所有有状态的服务

其特点如下:

  • StatefulSet 中的 Pod 具有黏性的、独一无二的身份标识,重新调度后PodName和HostName不变 ;
  • Pod重新调度后还是能访问到相同的持久化数据,基于PVC实现 ;
  • 分配给每个 Pod 的唯一顺序索引,Pod 的名称的形式为 :<statefulset name>-<ordinal index> ;

应用场景:比如MySQL、MongoDB集群

Horizontal Pod Autoscaler

  • 可以基于 CPU 利用率或其他指标实现Pod水平自动扩缩 ;
  • 被伸缩的pod需要是通过deployment或者replica set管理 ;
  • HPA不能应用于不可伸缩的对象,如:DaemonSets ;
  • 由资源来决定控制器行为,控制器周期性调整目标pod的副本数量,让目标pod的实际cpu使用率符合用户指定的数值 ;

Job

  • 普通任务容器控制器,只会执行一次,只要完成任务就立即退出,不需要重启或重建 ;
  • 容器中的进程在正常运行结束后不会对其进行重启,而是将pod对象置于completed状态 ;
  • 若容器中的进程因错误而终止,则需要依据配置确定是否需要重启 ;
  • 应用场景:批处理程序,完成后容器就退出等 ;

Cronjob

顾名思义,Linux 中有 cron 程序定时执行任务,K8s的 CronJob 提供了类似的功能,可以定时执行 Job;

  • 创建的Pod负责周期性任务控制 ;
  • 应用场景:执行周期性的重复任务,如备份数据、发送邮件、数据报表、报告生成等 ;

三、k8s控制器之ReplicaSet

上文系统介绍了k8s中常用的几类控制器,接下来以ReplicaSet这种控制器为例进行详细的说明;

早期k8s没那么多控制器,使用Replication Controller 来部署、升级Pod,简称RC ,也被称为下一代Replication Controller

1、关于ReplicaSet特性

  • 一种副本控制器,简称rs,主要是控制由其管理的pod,使pod副本的数量始终维持在预设的个数 ;
  • 并支持pod数量扩缩容,镜像版本升级 ;
  • 官方建议不要直接使用ReplicaSet,用Deployments更好,并提供很多其它有用的特性 ;

2、ReplicaSet控制器配置模板样例

通常在实际业务中,控制器的设置,也是通过在yaml中通过一些标签元素进行设置,如下:

apiVersion: apps/v1 # 版本号
kind: ReplicaSet  #资源文件 
metadata: # 元对象信息
  name: test-rs #rs控制器名称
  namespace: default #名称空间
spec: #具体详情
  replicas: 2 #副本数量
  selector: # 选择器,指定rs控制器管理哪些pod资源
    matchLabels: # 标签匹配规则
      app: test-nginx-pod #标签key是app,值是xdclass-nginx-pod
      
  template: # pod模板,当数量不满足的时候,根据下面编码创建pod副本
    metadata: # 元对象信息
      labels: # pod资源标签
        app: test-nginx-pod
    spec: #具体详情
      containers: # 容器数组列表
      - name: test-nginx  #容器名称
        image: nginx:1.23.0  # 镜像和版本

在当前目录下创建一个yaml,拷贝上面的内容,然后执行 apply命令创建pod

kubectl apply -f rep-nginx.yaml

执行完成后,可以看到,上面创建了2个副本的pod 

3、使用ReplicaSet命令行进行缩容

如果在业务的低峰期,不需要开启那么多pod的时候,就可以考虑缩减pod的个数,使用ReplicaSet的操作命令很容易达到这个目的;

kubectl scale rs test-rs --replicas=1 -n default

参数说明:

  • test-rs , 上面的rs名称;
  • -n default ,pod所在的namespace名称;

执行完成后,可以看到 pod只剩1个了;

4、删除rs创建的pod

可以直接删除rs;也可以通过yaml删除

kubectl delete -f rep-nginx.yaml

执行之后,可以看到下面的效果,pod就被删掉了

四、k8s控制器之Deployment

Deployment 也是一种控制器,在之前的文章中也在反复的使用它创建pod,其特点如下:

  • 通过控制ReplicaSet来控制Pod,并支持滚动升级、回退版本,适合无状态的服务部署 ;
  • 当某个应用有新版本发佈时,Deployment会同时操作两个版本的ReplicaSet ;
  • 内置多种滚动升级策略,会按照既定策略降低老版本的Pod数量,同时也创建新版本的Pod ;
  • Deployment控制器不直接管理Pod对象,而是 Deployment 管理ReplicaSet, 再由ReplicaSet管理Pod对象 ;

总的来说,Deployment、ReplicaSet、Pod三者之间是一种阶梯控制的关系

1、Deployment 控制器配置模板样例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-deploy
  namespace: default
spec:
  replicas: 2
  selector: 
    matchLabels:
      app: test-nginx-pod
  template:
    metadata:
      labels:
        app: test-nginx-pod
    spec:
      containers:
      - name: test-nginx
        image: nginx:1.23.0

在当前目录下创建一个yaml,拷贝上面的内容,然后执行 apply命令创建pod

kubectl apply -f pod-nginx.yaml

执行完成后,可以看到,上面创建了2个副本的pod 

2、查看集群中的Deployment详细信息

kubectl get deploy -o wide -n default

结果参数说明:

  • NAME : 列出了集群中 Deployment 的名称;
  • READY 显示应用程序的可用的“副本”数,格式是“就绪个数/期望个数” ;
  • UP-TO-DATE 显示为了达到期望状态已经更新的副本数 ;
  • AVAILABLE 显示可用的副本数;
  • AGE 应用程序运行的时间;

3、删除Deployment 的pod

通过apply创建的pod直接使用 delete -f 删除即可

kubectl delete -f pod-nginx.yaml

五、基于Deployment 使用rollout 实现滚动升级

滚动升级在日常的生产变更过程中可以说是非常常见的业务了,简单来说,滚动升级的目的就是为了保证在升级过程中不停服,减少因升级带来服务不可用造成的用户不好的产品体验;

通常,传统的滚动升级,一般是针对无状态的应用服务,而且是集群部署的那种,升级的时候,先通过一定的手段,控制集群中的部分节点服务先升级,然后再逐步完成全部节点的升级;

一般这个过程可以通过脚本控制,或者可视化操作界面手工来完成,在k8s中,Deployment这种控制器提供了一种很好的控制机制,基于rollout就可以完成服务的滚动升级;

1、Deployment控制器核心介绍

  • 适合部署无状态的应用服务 ;
  • 用来管理pod和replicaset ;
  • 上线部署、副本控制、滚动更新、回滚等功能 ;

2、使用Deployment控制器滚动升级 (金丝雀发布 or 灰度发布)

  • 对各个实例批次进行单独更新,而非同一时刻对所有实例进行全部更新,达到不中断服务的更新升级方式 ;
  • Deployment控制器 给旧版本(old_rs)副本数减少至0、给新版本(new_rs)副本数量增至期望值(replicas) ;

3、Deployment 更新策略

对应于yaml中的核心配置参数

spec:
  strategy:  # 策略 RollingUpdate Recreate 
    type: RollingUpdate

策略1:Recreate

删除全部旧的pod,然后创建新的pod

策略2:RollingUpdate

滚动升级更新,删除部分,更新部分,在整个更新过程中,存在两个版本的pod

经验来讲,RollingUpdate实际应用场景更多,RollingUpdate根据业务需求的不同,又有下面两个重要的参数可供选择:

  • maxUnavailable

1、升级过程中不可用Pod的最大数量,默认为25%;
2、在滚动更新时,我们可以忍受多少个 Pod 无法提供服务;
3、值越小越能保证服务稳定,更新越平滑;

  • maxSurge

1、升级过程中可以超过期望的Pod的最大数量,默认为25%;
2、在滚动更新时,可以有多少个额外的 Pod;
3、值调的越大,副本更新速度越快;

4、yaml 模板配置样例

在当前目录下创建一个deploy-rollout.yaml的文件,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: congge-deploy
  namespace: default
spec:
  replicas: 5
  revisionHistoryLimit: 5  #保留历史版本5个
  strategy: 
    type: RollingUpdate
  selector: 
    matchLabels:
      app: congge-nginx-pod
  template:
    metadata:
      labels:
        app: congge-nginx-pod
    spec:
      containers:
      - name: congge-nginx
        image: nginx:1.23.0

在当前的目录下执行命令

kubectl apply -f deploy-rollout.yaml 

执行后,可以看到一个5副本的pod就创建出来 

5、查看控制器参数

使用下面的命令,可以查看上面控制器的详细描述信息

kubectl describe deploy congge-deploy -n default

关于图中展示的信息中的几点补充说明:

  • MaxUnavailable为0,在新 Pod 启动并就绪之前,不要关闭任何旧Pod;
  • MaxSurge 为100%, 立即启动所有新 Pod,也就是有足够的资源希望尽快完成更新,默认两个值都是 25%;

  •  如果更新一个 100 Pod 的 Deployment,会立刻创建 25 个新 Old,同时会关闭 25 个旧 Pod;

  • 每次有 Pod 启动就绪,就可以关闭旧 Pod;

6、实现滚动升级

在上面部署的nginx的版本为1.23.0,现在来实现一个需求,将现有的版本降至1.15.8,直接使用下面的命令:

kubectl set image deployment/congge-deploy congge-nginx=nginx:1.15.8 -n default

注意:命令里面的参数主要涉及到deploy的名称和一个container的名称,与上面的yaml中保持一致即可;

当前的状态

执行之后的状态,从状态上来看,有一个短暂的切换状态,并不是一下子就把所有现有的容器停止掉,而是一个很明显的中间状态,也就是滚动升级的过程;

 稍等一会儿再看,这时候5个pod对应的nginx就全部完成了版本的降级;

补充参数说明:

可以在上面的命令行后面追加 --record 以保存正在更改资源的 kubectl 命令,方便查看history版本列表修改命令

kubectl set image deployment/congge-deploy congge-nginx=nginx:1.15.8 -n default --record=true

升级过程中,如果涉及到的pod非常多,也可以动态查看升级过程中存在的不同版本的pod

kubectl get pods -n dev -w

7、发布回滚

如果在升级之后发现问题,需要进行回退,就可以用上回退相关的操作命令了;

kubectl rollout 版本升级(回滚)相关参数介绍

  • history 升级(回滚)历史记录 ;
  • undo 默认回滚上一版本 ,使用--to-revision回滚到指定版本 ;
  • pause 暂停版本升级发布 ;
  • resume 继续恢复刚暂停的版本升级 ;
  • status 升级状态 ;

查看历史版本列表

kubectl rollout history deployment/congge-deploy -n default

这里会展示出版本回退的相关历史记录信息 

查看具体某一个历史版本信息

kubectl rollout history deployment/congge-deploy -n default --revision=3

回滚到上一版本

kubectl rollout undo deployment/congge-deploy -n default

查看升级情况

kubectl rollout status deployment/congge-deploy -n default

回滚到指定版本

如果历史版本比较多的情况下,也可以根据实际需要回滚到某个指定的版本

kubectl rollout undo deployment/congge-deploy -n default --to-revision=3

删除deployment

kubectl delete -f deploy-nginx-pod.yaml

六、K8S控制器之DaemonSet控制器

在K8S集群部署中由于节点数量不定,那么如果我们需要对每个节点中都运行一个守护进程、日志收集进程等情况时,在k8s中如何实现呢?这个时候就是DaemonSet应用场景了

DaemonSet特点

  • 这类Pod 运行在K8S 集群里的每一个节点(Node)上,确保所有节点上有且仅有一个pod ;
  • 有新的节点加入 K8S集群后,该 Pod 会自动地在新节点上被创建出来 ;
  • 而当旧节点被删除后,它上面的 Pod也相应地会被回收掉 ;
  • 应用场景:监控告警Agent、日志组件、监控组件等 ;

daemonset 配置样例模板

在当前目录下创建一个daemonset-nginx.yaml的文件,配置如下:

apiVersion: apps/v1
kind: DaemonSet   
metadata:
  name: congge-ds
  namespace: default
spec:
  selector: 
    matchLabels:
      app: congge-nginx-pod
  template:
    metadata:
      labels:
        app: congge-nginx-pod
    spec:
      containers:
      - name: congge-nginx
        image: nginx:1.23.0
        imagePullPolicy: IfNotPresent

内容和上面的差不多,主要把kind那里调整下即可,执行apply命令创建pod,创建成功后,使用命令查看:

kubectl get pod,deploy,ds,rs -o wide -n default

可以看到,通过这种方式创建的pod,在其他节点上也会开启一个pod,类似于JVM中的守护进程;

七、K8S控制器之job控制器

job控制器是一种普通任务容器控制器,只会执行一次,只要完成任务就立即退出,不需要重启或重建 ;

job控制器特点

  • 容器中的进程在正常运行结束后不会对其进行重启,而是将pod对象置于completed状态 ;
  • 若容器中的进程因错误而终止,则需要依据配置确定是否需要重启 ;
  • 启动pod在运行完毕任务后,就会变成Completed状态,job的状态会更新为complete,这个job任务已经执行完成,pod不在系统中继续运行 ;

应用场景:批处理程序,完成后容器就退出等

daemonset 核心配置参数说明

apiVersion: batch/v1
kind: Job
metadata:
  name: test-job
  namespace: default
spec:
  parallelism: 2 #job并发运行Pods的数量,默认 1
  completions: 3 #job需要成功运行Pods的次数,默认 1
  backoffLimit: 5 #job失败后进行重试的次数,默认是6
  activeDeadlineSeconds: 100 #job运行超时时间,当job超过timeout时间,则job的状态也会更新为failed
  template:
    spec:
      restartPolicy: Never #job重启策略,OnFailure或Never 
      containers:
      - name: demo
        image: busybox:1.35.0 
				# 容器的启动命令列表,在pod中的容器初始化完毕后运行命令
				command: ["echo","hello k8s job"]  

BusyBox  参数补充说明:

  • 是一个集成了三百多个最常用Linux命令和工具的软件 ;
  • 包含了简单的工具,例如ls、cat和echo等等,还包含了一些更复杂的工具,例grep、find、telnet ;

daemonset 配置样例模板

在当前目录下创建一个job-test.yaml的文件,配置内容如下:

apiVersion: batch/v1
kind: Job
metadata:
  name: test-job
spec:
  parallelism: 2
  completions: 3
  backoffLimit: 5
  activeDeadlineSeconds: 100
  template:
    spec:
      restartPolicy: Never
      containers:
      - name: demo
        image: busybox:1.35.0 
        command: ["echo","hello k8s job"]

使用apply命令执行创建pod;

查看创建的job

kubectl get job -n default -o wide

 查看pod容器中的输出日志

在yaml中,容器那一栏里面输出了一段内容,可以查看下容器的日志看看是否输出了,选择其中一个job,执行下面的命令进行查看,发现内容成功输出了;

kubectl logs test-job-bl9n7

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

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

相关文章

【数据库概论】3.2 SQL的查询、更新和删除语句

一、 数据查询 SQL提供SELECT语句用于查询&#xff0c;一般格式为&#xff1a; 根据WHERE子句条件表达式从FROM子句指定的基本表、视图中找出满足条件的元组 GROUP BY语句则用作将结果按照<列名1>的值进行分组&#xff0c;该属性列值相等的元组为一个组&#xff1b;ORD…

Essential C++第五章习题

目录 5.1 5.2 5.3 5.4 5.1 C代码&#xff1a; //Stack.h#include<vector> #include<string> #include<iostream> using namespace std;#pragma once#ifndef _STACK_H_ #define _STACK_H_typedef string elemType;class Stack { public://基类的析构函数…

【JavaSE专栏5】Java 基本数据类型和取值范围

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

Mine Goose Duck 0.2版本发布

本次我增加了模组的1.16.5和1.18.2的适用版本&#xff0c;新增了一些职业和装扮 1.新职业 1.冒险家 你不会死于摔伤、溺水、火烧、冰冻。 2.工程师 你可以修改888范围内红石设备的状态。 3.模仿者 怪物认为你是他们的一员。 4.加拿大鹅 你会自动报警并召唤警车。 5.…

深度卷积对抗神经网络 基础 第三部分 (WGAN-GP)

深度卷积对抗神经网络 基础 第三部分 (WGAN-GP&#xff09; Wasserstein GAN with Gradient Penalty (WGAN-GP) 我们在训练对抗神经网络的时候总是出现各种各样的问题。比如说模式奔溃 (mode collapse)和 梯度消失&#xff08;vanishing gradient&#xff09;的问题。 比如说…

在linux下安装docker

文章目录 目录 文章目录 前言 一、docker 二、使用步骤 1.环境准备 2.安装 三、配置阿里云镜像加速 四、卸载 总结 前言 一、docker 镜像&#xff08;image&#xff09;&#xff1a; docker镜像就好比是一个模板&#xff0c;可以通过这个模板来创建容器服务&#xff0c;tomc…

【攻坚克难】详解k8s持久化存储数据pv、pvc存储问题

问题 如图:pod中的容器,创建一个包含文件的目录,重启pod或系统重启后,此目录及其文件都会丢失,如何保证其不会丢失? 图 1 创建包含文件的目录 方法 分析:用pv、pvc为k8s持久化存储数据是最好的选择,可解决上述问题。流程:pv → pvc → pod把创建的目录挂载到pvc上步…

路由 OSPF 优化(FA地址、路由汇总、路由过滤、区域认证、接口认证)

1.2.0 路由 OSPF 优化&#xff08;FA地址、路由汇总、路由过滤、区域认证、接口认证&#xff09; 一、FA地址 该文章介绍的FA地址说辞简单易懂&#xff1a;路由协议系列之六&#xff1a;OSPF FA地址 产生条件 ASBR在其连接外部网络的接口&#xff08;外部路由的出接口&#xf…

CS61A 2022 fall HW 01: Functions, Control

CS61A 2022 fall HW 01: Functions, Control 文章目录CS61A 2022 fall HW 01: Functions, ControlQ1: A Plus Abs BQ2: Two of ThreeQ3: Largest FactorQ4: HailstoneHW01对应的是Textbook的1.1和1.2 Q1: A Plus Abs B 题目&#xff1a; Fill in the blanks in the following f…

Java | 解决并发修改异常问题【CurrentModificationException】

今日碰到Java中的一个异常&#xff0c;名为CurrentModificationException&#xff0c;从属于RunTimeException运行时异常&#xff0c;故作此记录 异常解析 首先来说明一下什么是【并发修改异常】❓ 因为迭代器依赖集合而存在&#xff0c;因为当你在操作集合中元素的时候&#…

springboot中restful风格请求的使用

springboot中restful风格请求的使用restful风格springboot中的使用1.创建html表单页面2.在yml配置文件中开启rest表单支持3.编写controller层及对应映射处理4.启动服务&#xff0c;逐个访问restful风格 Rest风格支持&#xff08;使用HTTP请求方式动词来表示对资源的操作&#…

【手写 Vue2.x 源码】第四十二篇 - 组件部分 - 组件挂载流程简述

一&#xff0c;前言 上篇&#xff0c;组件部分-生成组件的真实节点&#xff1b; 本篇&#xff0c;组件部分-组件挂载流程分析&#xff1b; 二&#xff0c;组件挂载流程分析 1&#xff0c;示例 全局组件&#xff1a;my-button&#xff0c;name&#xff1a;‘全局组件’&…

什么是软件架构中的ASRs(架构需求文档)?

作者&#xff1a;非妃是公主 专栏&#xff1a;《软件工程》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 专栏地址 软件工程专栏地址 专栏系列文章 软件工程复习01&#xff1a;软件工程概述 软件工程复习02&#xf…

十大经典排序算法(动态演示+代码)-快速排序与希尔排序

快速排序 1.什么是快速排序 我们知道排序有很多种&#xff0c;常见的如希尔排序&#xff0c;插入排序&#xff0c;选择排序&#xff0c;堆排序等等&#xff0c;而快速排序也是排序家族中的一员。因为其在大多数情况下有着优秀的综合性能&#xff0c;快速排序的快速也算是实至…

结构型模式-享元模式

1.概述 运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销&#xff0c;从而提高系统资源的利用率。 2.结构 享元&#xff08;Flyweight &#xff09;模式中存在以下两种状态&#xff1a; 内…

信息论复习—信源编码的基本方法

目录 信源编码的目的&#xff1a;提高传输效率 离散信源&#xff1a; 离散信源的分类&#xff1a; 离散无记忆信源 (DMS: Discrete Memoryless Source&#xff09;&#xff1a; 离散无记忆信源的特点&#xff1a; 离散无记忆信源编码与译码&#xff1a; 等长编码的编码速…

Day869.索引(下) -MySQL实战

索引&#xff08;下&#xff09; Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于索引&#xff08;下&#xff09;的内容。 先来看一下这个问题&#xff1a; 下面这个表 T 中&#xff0c;如果执行 select * from T where k between 3 and 5&#xff0c;需要执行几次…

【Java|golang】1828. 统计一个圆中点的数目

给你一个数组 points &#xff0c;其中 points[i] [xi, yi] &#xff0c;表示第 i 个点在二维平面上的坐标。多个点可能会有 相同 的坐标。 同时给你一个数组 queries &#xff0c;其中 queries[j] [xj, yj, rj] &#xff0c;表示一个圆心在 (xj, yj) 且半径为 rj 的圆。 对…

git 操作整理

git操作整理 git 配置 git config --global user.name “yuluo” git config --global user.email “1481556636qq.com” git config --global color.ui auto 启用命令行着色输出 git 操作 暂存区 git init . 初始化git仓库 git status 看仓库状态 git add index.html…

【C++】C++11简介 | 列表初始化 | 声明 | 范围for

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;C11简介&…