2024年k8s最新版本使用教程

如果需要K8S安装观看2024年k8s最新版本安装教程博客

3. YAML语言入门

YAML是一门简洁的非标记语言,常用来做配置文件,文件后缀是yaml。

3.1 基本语法规则

key: value键值对方式(:与value之间有空格)

name: buddha

key书写区分大小写

name: buddha

Name: buddha

使用缩进表示层级关系(缩进只能用空格,没有规定需要多少个空格,相同层级左对齐即可;不能用tab键替代空格键,除非编辑器内认可的tab键;)

person:
 name: buddha
 age: 18

支持单行注释,#是单号注释符

# 下面是开发环境配置
name: buddha

---...配合使用,如下就相当于写了两个配置文件

---
name: buddha
age: 18
...

---
name: jack
age: 12
...

3.2 支持的数据结构

字面量,单个、不能再分的值。date(日期、时间)、boolean、number(整数、浮点数)、null(~)、string(字符串一般不用引号,双引号特殊字符会转义,单引号不会转义处理)

name: buddha
age: 18
flag: true
remark: ~
day: 2024-01-01

对象,键值对的集合

# 行内写法,k与v之间可以不加空格
o: {k1: v1,k2: v2,k3: v3}

# 一般写法
o:
 k1: v1
 k2: v2
 k3: v3

数组,一组按次序排列的值

k: [v1,v2,v3]

k:
 - v1
 - v2
 - v3

3.3 其他语法

允许使用两个感叹号,强制转换数据类型

a: !!str 123
b: !!str true

多行字符串可以使用|保留换行符,也可以使用>折叠换行

this: |
  Foo
  Bar
that: >
  Foo
  Bar

可以用这个网站检验yaml文件书写是否正确

https://www.json2yaml.com/convert-yaml-to-json

4 资源管理

4.1 k8s资源查询

在k8s中,所有内容都抽象为资源进行管理。通过kubectl api-resources命令查看k8s有哪些资源。

常用资源有:

资源分类 资源名称 资源名称简写 说明
集群级别资源 nodes no 集群节点
namespaces ns 命名空间
pod资源 pods po 容器运行在pod里面
pod控制器资源 replicationcontrollers rc 控制pod资源
replicasets rs
deployments deploy
daemonsets ds
jobs
cronjobs cj
horizontalpodautoscalers hpa
statefulsets sts
服务发现资源 services svc 统一pod对外接口
ingress ing
存储资源 volumeattachments 存储
persistentvolumes pv
persistentvolumeclaims pvc
配置资源 configmaps cm 配置
secrets 配置

4.2 资源操作命令

k8s对资源如何操作,可以通过kubectl --help命令获取帮助信息

常用操作有:

操作分类 命令 说明
基本命令 create 创建资源
edit 编辑资源
patch 更新资源
get 获取资源
delete 删除资源
explain 展示资源文档
运行和调试 run 运行一个pod
expose 暴露资源为Service
describe 显示资源内部信息
logs 输出容器在pod中的日志
attach 进入运行中的容器
exec 执行容器中的一个命令
cp 在pod内外复制文件
rollout 管理资源的发布
scale 扩(缩)容pod的数量
autoscale 自动调整pod的数量
其他 apply 通过文件对资源进行配置
label 更新资源上的标签
cluster-info 显示集群信息
version 显示当前Server和Client的版本

4.3 资源操作方式

4.3.1 命令行方式

语法:

kubectl [command] [type] [name] [flags]

说明:

command,要对资源执行的操作,例如create、get、delete

type,资源类型,比如deployment、pod、service

name,资源名称

flags,额外可选参数

示例:

# kubectl [command] [type]
kubectl get pod

# kubectl [command] [type] [name]
kubectl get pod nginx-pod

# kubectl [command] [type] [name] [flags]
kubectl get pod nginx-pod -o yaml
4.3.2 YAML文件方式

创建nginx-pod.yaml文件

---
apiVersion: v1
kind: Namespace
metadata:
 name: prod
...

---
apiVersion: v1
kind: Pod
metadata:
 name: nginx-pod
 namespace: prod
spec:
 containers:
  - name: nginx-container
    image: nginx:latest
...
# 执行create命令,创建资源
kubectl create -f nginx-pod.yaml

# 使用apply操作资源,如果资源不存在,就创建;如果资源已存在,就更新
[root@k8s-master ~]# kubectl apply -f nginx-pod.yaml
namespace/prod created
pod/nginx-pod created
[root@k8s-master ~]# kubectl apply -f nginx-pod.yaml
namespace/prod unchanged
pod/nginx-pod unchanged
[root@k8s-master ~]# kubectl create -f nginx-pod.yaml 
namespace/prod created
pod/nginx-pod created
[root@k8s-master ~]# kubectl get -f nginx-pod.yaml
NAME             STATUS   AGE
namespace/prod   Active   21s

NAME            READY   STATUS    RESTARTS   AGE
pod/nginx-pod   1/1     Running   0          21s

小结:

# 创建/更新资源
kubectl apply -f  xxx.yaml

# 删除资源
kubectl delete -f  xxx.yaml

# 查看资源
kubectl get -f  xxx.yaml
kubectl describe -f  xxx.yaml

5 Namespace

k8s的命名空间(Namespace)可以将集群的资源进行逻辑上的划分和隔离。

作用:

  • 隔离和资源划分:命名空间允许将集群资源进行逻辑上的划分和隔离。
  • 多租户支持:通过使用命名空间,可以在同一个Kubernetes集群中支持多个租户或团队。
  • 访问控制和权限管理:命名空间提供了一种在集群中实施访问控制和权限管理的机制。
  • 资源管理和监控:通过将相关的资源放置在同一个命名空间下,可以更方便地进行资源管理和监控。

在这里插入图片描述

5.1 查看命名空间

资源查看命名空间

[root@k8s-master ~]# kubectl api-resources | grep Namespace
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
namespaces                        ns           v1                                     false        Namespace

命名空间查看命令

常用命令

# 查看所有的命名空间
kubectl get ns

# 查看某个命名空间
kubectl get ns 命名空间名称

# 查看某个命名空间详情
kubectl describe ns 命名空间名称

# 查看命名空间指定格式输出
# 常见wide、json、yaml格式
kubectl get ns -o yaml
kubectl get ns 命名空间名称 -o yaml

示例:

[root@k8s-master ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   3d3h
kube-node-lease   Active   3d3h
kube-public       Active   3d3h
kube-system       Active   3d3h

[root@k8s-master ~]# kubectl get ns default
NAME      STATUS   AGE
default   Active   3d3h
[root@k8s-master ~]# kubectl describe ns default
Name:         default
Labels:       kubernetes.io/metadata.name=default
Annotations:  <none>
Status:       Active

No resource quota.

No LimitRange resource.

[root@k8s-master ~]# kubectl describe ns default
Name:         default
Labels:       kubernetes.io/metadata.name=default
Annotations:  <none>
Status:       Active

No resource quota.

No LimitRange resource.

[root@k8s-master ~]# kubectl get ns default -o yaml
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: "2023-12-18T07:51:02Z"
  labels:
    kubernetes.io/metadata.name: default
  name: default
  resourceVersion: "45"
  uid: e88e80f3-8a34-46c1-9978-41014cd3a179
spec:
  finalizers:
  - kubernetes
status:
  phase: Active

5.2 创建命名空间

kubectl create ns 命名空间名称

kubectl create -f 文件名.yaml

kubectl apply -f 文件名.yaml

示例:

[root@k8s-master ~]# kubectl create ns dev
namespace/dev created
# ns-dev.yaml
# create dev namespace yaml
apiVersion: v1
kind: Namespace
metadata:
  name: dev
[root@k8s-master ~]# kubectl apply -f ns-dev.yaml 
namespace/dev created

5.3 删除命名空间

kubectl delete ns 命名空间名称

kubectl delete -f 文件名.yaml

示例:

[root@k8s-master ~]# kubectl delete ns dev
namespace "dev" deleted
[root@k8s-master ~]# kubectl delete -f ns-dev.yaml 
namespace "dev" deleted

5.4 命名空间资源限额

通过ResourceQuota,可以对Namespace资源(包括CPU、内存、存储等)使用限制。编写YAML文件时,可以采用kubectl explain 资源类型或资源类型.属性获得帮助信息。

备注:如果命名空间做了限制,那么对应pod也要做资源限制

示例:

apiVersion: v1
kind: Namespace
metadata:
  name: dev
---
apiVersion: v1
kind: ResourceQuota
metadata:
  name: uat-quota
  namespace: dev
spec:
  hard:
    requests.cpu: 2
    requests.memory: 2Gi
    limits.cpu: 2
    limits.memory: 2Gi
[root@k8s-master ~]# kubectl apply -f ns-dev.yaml 
namespace/dev created
resourcequota/uat-quota created
[root@k8s-master ~]# kubectl get -f ns-dev.yaml
NAME            STATUS   AGE
namespace/dev   Active   7m35s

NAME                      AGE     REQUEST                                     LIMIT
resourcequota/uat-quota   7m35s   requests.cpu: 0/2, requests.memory: 0/2Gi   limits.cpu: 0/2, limits.memory: 0/2Gi

配置含义说明:

资源名称 说明
limits.cpu 所有非终止状态的 Pod,其 CPU 限额总量不能超过该值
limits.memory 所有非终止状态的 Pod,其内存限额总量不能超过该值
requests.cpu 所有非终止状态的 Pod,其 CPU 需求总量不能超过该值
requests.memory 所有非终止状态的 Pod,其内存需求总量不能超过该值
hugepages- 对于所有非终止状态的 Pod,针对指定尺寸的巨页请求总数不能超过此值
cpu 与 requests.cpu 相同
memory 与 requests.memory 相同

6 Pod

程序运行在容器中,容器运行在pod中,pod属于某个命名空间
在这里插入图片描述

[root@k8s-master ~]# kubectl api-resources | grep Pod
pods                              po           v1                                     true         Pod

6.1 创建pods

语法:

kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dry-run=server|client]
[--overrides=inline-json] [--command] -- [COMMAND] [args...] [options]
kubectl apply -f 文件名.yaml

kubectl create -f 文件名.yaml

示例:

[root@k8s-master ~]# kubectl run nginx-test --image=nginx --port=80 -n dev
pod/nginx-test created

6.2 查看pods

[root@k8s-master ~]# kubectl get pods -n dev
NAME         READY   STATUS    RESTARTS   AGE
nginx-test   1/1     Running   0          26s

[root@k8s-master ~]# kubectl get pods nginx-test -n dev
NAME         READY   STATUS    RESTARTS   AGE
nginx-test   1/1     Running   0          108s

[root@k8s-master ~]# kubectl get pods -o wide -n dev
NAME         READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
nginx-test   1/1     Running   0          51s   10.244.36.80   k8s-node1   <none>           <none>

[root@k8s-master ~]# kubectl describe pods nginx-test -n dev[root@k8s-master ~]# kubectl get pods -o wide -n dev
# 在k8s各个节点上都可以访问nginx-test pod里面的nginx服务
[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES           AGE     VERSION
k8s-master   Ready    control-plane   3d20h   v1.28.2
k8s-node1    Ready    <none>          3d19h   v1.28.2
k8s-node2    Ready    <none>          3d19h   v1.28.2
k8s-node3    Ready    <none>          3d19h   v1.28.2

[root@k8s-master ~]# curl 10.244.36.80:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

[root@k8s-node1 ~]# curl 10.244.36.80:80[root@k8s-node2 ~]# curl 10.244.36.80:80[root@k8s-node3 ~]# curl 10.244.36.80:80

6.3 删除pods

[root@k8s-master ~]# kubectl delete pods nginx-test
pod "nginx-test" deleted

6.4 资源清单

apiVersion: v1     #必选,版本号,例如v1
kind: Pod         #必选,资源类型,例如 Pod
metadata:         #必选,元数据
  name: string     #必选,Pod名称
  namespace: string  #Pod所属的命名空间,默认为"default"
  labels:           #自定义标签列表
    name: string                 
spec:  #必选,Pod中容器的详细定义
  containers:  #必选,Pod中容器列表
  - name: string   #必选,容器名称
    image: string  #必选,容器的镜像名称
    imagePullPolicy: [ Always|Never|IfNotPresent ]  #获取镜像的策略 
    command: [string]   #容器的启动命令列表,如不指定,使用打包时使用的启动命令
    args: [string]      #容器的启动命令参数列表
    workingDir: string  #容器的工作目录
    volumeMounts:       #挂载到容器内部的存储卷配置
    - name: string      #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
      mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
      readOnly: boolean #是否为只读模式
    ports: #需要暴露的端口库号列表
    - name: string        #端口的名称
      containerPort: int  #容器需要监听的端口号
      hostPort: int       #容器所在主机需要监听的端口号,默认与Container相同
      protocol: string    #端口协议,支持TCP和UDP,默认TCP
    env:   #容器运行前需设置的环境变量列表
    - name: string  #环境变量名称
      value: string #环境变量的值
    resources: #资源限制和请求的设置
      limits:  #资源限制的设置
        cpu: string     #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
        memory: string  #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
      requests: #资源请求的设置
        cpu: string    #Cpu请求,容器启动的初始可用数量
        memory: string #内存请求,容器启动的初始可用数量
    lifecycle: #生命周期钩子
		postStart: #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
		preStop: #容器终止前执行此钩子,无论结果如何,容器都会终止
    livenessProbe:  #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器
      exec:         #对Pod容器内检查方式设置为exec方式
        command: [string]  #exec方式需要制定的命令或脚本
      httpGet:       #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
        path: string
        port: number
        host: string
        scheme: string
        HttpHeaders:
        - name: string
          value: string
      tcpSocket:     #对Pod内个容器健康检查方式设置为tcpSocket方式
         port: number
       initialDelaySeconds: 0       #容器启动完成后首次探测的时间,单位为秒
       timeoutSeconds: 0          #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
       periodSeconds: 0           #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
       successThreshold: 0
       failureThreshold: 0
       securityContext:
         privileged: false
  restartPolicy: [Always | Never | OnFailure]  #Pod的重启策略
  nodeName: <string> #设置NodeName表示将该Pod调度到指定到名称的node节点上
  nodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上
  imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定
  - name: string
  hostNetwork: false   #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
  volumes:   #在该pod上定义共享存储卷列表
  - name: string    #共享存储卷名称 (volumes类型有很多种)
    emptyDir: {}       #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
    hostPath: string   #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
      path: string                #Pod所在宿主机的目录,将被用于同期中mount的目录
    secret:          #类型为secret的存储卷,挂载集群与定义的secret对象到容器内部
      scretname: string  
      items:     
      - key: string
        path: string
    configMap:         #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
      name: string
      items:
      - key: string
        path: string

7 Label标签

label标签的意思,给资源添加标签,实现对资源进行分类分组

标签是以键值对(key: value 或 key=value)添加到资源上(node、pods、pods控制器、service等)

一个标签可以添加到多个资源上;一个资源也可以添加多个标签

常见标签:

版本标签:version: “1.0”

环境标签:env: dev

7.1 标签操作

语法:

kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N
[--resource-version=version] [options]

示例:

1、前提工作

[root@k8s-master ~]# kubectl run nginx-pod --image=nginx --port=80 -n dev
pod/nginx-pod created

[root@k8s-master ~]# kubectl get pods -n dev
NAME        READY   STATUS    RESTARTS   AGE
nginx-pod   1/1     Running   0          19s

2、添加标签

[root@k8s-master ~]# kubectl label Pod nginx-pod env=dev version=1.0 -n dev
pod/nginx-pod labeled

3、更新标签

[root@k8s-master ~]# kubectl label --overwrite Pod nginx-pod version=2.0 -n dev
pod/nginx-pod labeled

4、查看标签

[root@k8s-master ~]# kubectl get pods nginx-pod -n dev --show-labels
NAME        READY   STATUS    RESTARTS   AGE     LABELS
nginx-pod   1/1     Running   0          7m26s   env=dev,run=nginx-pod,version=2.0

5、删除标签

[root@k8s-master ~]# kubectl label Pod nginx-pod version- -n dev
pod/nginx-pod unlabeled

# 验证标签是否删除
[root@k8s-master ~]# kubectl get pods nginx-pod -n dev --show-labels
NAME        READY   STATUS    RESTARTS   AGE     LABELS
nginx-pod   1/1     Running   0          9m18s   env=dev,run=nginx-pod

6、添加、更新、删除标签也都可以在文件中实施

# nginx-pod.yaml文件
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: dev
  labels:
    env: dev
    version: "2.0"
spec:
  containers:
    - name: nginx-container
      image: nginx:latest
[root@k8s-master ~]# kubectl apply -f nginx-pod.yaml 
pod/nginx-pod created

[root@k8s-master ~]# kubectl get pods -n dev --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod   1/1     Running   0          25s   env=dev,version=2.0

7.2 分组管理

Label Selector选择器通过一个过滤的语法进行查找到对应标签的资源

匹配规则:

  • key=value:这类是直接匹配

  • key!=value:匹配标签中没有key=value的资源

  • key in (A,B):匹配所有具有key=A和key=B标签的资源

  • key not in (A):匹配所有不具有标签A的资源

  • 多个条件匹配,用逗号隔开

示例:

[root@k8s-master ~]# kubectl get pods -n dev --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod   1/1     Running   0          19m   env=dev,version=2.0


[root@k8s-master ~]# kubectl get pods -l env=dev -n dev
NAME        READY   STATUS    RESTARTS   AGE
nginx-pod   1/1     Running   0          19m

[root@k8s-master ~]# kubectl get pods -l env!=dev -n dev
No resources found in dev namespace.

[root@k8s-master ~]# kubectl get pods -l env=dev,version=2.0 -n dev
NAME        READY   STATUS    RESTARTS   AGE
nginx-pod   1/1     Running   0          21m

在这里插入图片描述

selector: # 选择器,通过它指定该控制器管理哪些pod
  matchLabels: # Labels匹配规则
    app: nginx-pod
  matchExpressions: # Expressions匹配规则
    - { key: app, operator: In, values: [ nginx-pod ] }

通过类似上面这种方式实现资源的互相绑定,这个是后话。

8 Pod控制器

Pod是k8s最小管理单元,在k8s中,按照pods的创建方式分为两类:

  • 自主式pod:kubectl run直接创建,这种pods删除后就没有了,也不会重建

  • 控制器创建的pods:通过控制器创建的pods,直接删除pods会自动新建,得直接删除控制器才行

8.1 Pod控制器概念

Pod控制器是管理pod的中间层,通过Pod控制器,按照控制器的策略,维护pods
在这里插入图片描述

8.2 Pod控制器种类

在k8s中,有很多类型的Pod控制器,每种都有自己的适合的场景,常见的Pod控制器有下面这些:

kind 名称 简称 apiVersion 说明 备注
ReplicationController replicationcontrollers rc v1 比较原始的pod控制器,由ReplicaSet替代 废弃
ReplicaSet replicasets rs apps/v1 pod数量固定,支持pod数量扩缩容,镜像升级
Deployment deployments deploy apps/v1 控制ReplicaSet操作Pod,并支持滚动升级、回退版本
HorizontalPodAutoscaler horizontalpodautoscalers hpa autoscaling/v2 根据集群负载自动调整Pod数量,实现削峰填谷
DaemonSet daemonsets ds apps/v1 指定节点运行一个Pod,用于守护进程任务
Job jobs batch/v1 完成一次性任务
CronJob cronjobs cj batch/v1 定时任务,不需要持续后台运行
StatefulSet statefulsets sts apps/v1 管理有状态应用

8.3 ReplicaSet

pod数量固定,支持pod数量扩缩容,镜像升级
在这里插入图片描述

8.3.1 常见操作
# 查
kubectl get replicasets -n 命名空间

kubectl get replicasets -n 命名空间 -o wide/json/yaml

kubectl get replicasets rs控制器名 -n 命名空间 -o wide/json/yaml

kubectl describe replicasets rs控制器名 -n 命名空间

# 建
kubectl create/apply -f 文件名.yaml

# 编辑
kubectl edit replicasets rs控制器名 -n 命名空间
kubectl apply -f 文件名.yaml

kubectl set SUBCOMMAND [options]
# SUBCOMMAND选项,可以通过类似kubectl set image --help帮助信息
env              Update environment variables on a pod template
image            Update the image of a pod template
resources        使用 Pod 模板更新对象的资源请求/限制
selector         为资源设置选择器
serviceaccount   Update the service account of a resource
subject          Update the user, group, or service account in a role binding or cluster role

# 删除
kubectl delete -f 文件名.yaml
kubectl delete replicasets rs控制器名 -n 命名空间
8.3.2 资源清单
apiVersion: apps/v1 # 版本号
kind: ReplicaSet    # 类型       
metadata:           # 元数据
  name:             # rs名称 
  namespace:        # 所属命名空间 
  labels:           # 标签
    controller: rs
spec:               # 详情描述
  replicas: 3       # 副本数量
  selector:         # 选择器,通过它指定该控制器管理哪些pod
    matchLabels:    # Labels匹配规则
      app: nginx-pod
    matchExpressions: # Expressions匹配规则
      - { key: app, operator: In, values: [ nginx-pod ] }
  template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

示例:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rs-nginx
  namespace: dev
  labels:
    controller: rs-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-pod
    matchExpressions:
      - { key: app, operator: In, values: [ nginx-pod ] }
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80
[root@k8s-master ~]# kubectl get replicasets -n dev
NAME       DESIRED   CURRENT   READY   AGE
rs-nginx   3         3         3       3m50s

[root@k8s-master ~]# kubectl get pods -n dev
NAME             READY   STATUS    RESTARTS   AGE
rs-nginx-4znwr   1/1     Running   0          3m56s
rs-nginx-6g6t2   1/1     Running   0          3m56s
rs-nginx-6rtm2   1/1     Running   0          3m56s

[root@k8s-master ~]# kubectl get pods -o wide -n dev
NAME             READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
rs-nginx-4znwr   1/1     Running   0          6m50s   10.244.36.81     k8s-node1   <none>           <none>
rs-nginx-6g6t2   1/1     Running   0          6m50s   10.244.169.135   k8s-node2   <none>           <none>
rs-nginx-6rtm2   1/1     Running   0          6m50s   10.244.107.199   k8s-node3   <none>           <none>
8.3.3 pod数量固定

ReplicaSet管理的pod数量保持稳定,假如删除一个pod,马上又会重新启动一个pod

示例:

[root@k8s-master ~]# kubectl delete pods rs-nginx-4znwr -n dev
pod "rs-nginx-4znwr" deleted
[root@k8s-master ~]# kubectl get pods -n dev
NAME             READY   STATUS              RESTARTS   AGE
rs-nginx-6g6t2   1/1     Running             0          8m33s
rs-nginx-6rtm2   1/1     Running             0          8m33s
rs-nginx-ss8kw   0/1     ContainerCreating   0          6s

[root@k8s-master ~]# kubectl get pods -n dev
NAME             READY   STATUS    RESTARTS   AGE
rs-nginx-6g6t2   1/1     Running   0          8m48s
rs-nginx-6rtm2   1/1     Running   0          8m48s
rs-nginx-ss8kw   1/1     Running   0          21s
8.3.4 pod数量扩缩容

ReplicaSet管理的pod数量可以进行扩缩容,增加pod数量,或者减少pod数量

示例:

1、查看replicasets名称

[root@k8s-master ~]# kubectl get replicasets -n dev
NAME       DESIRED   CURRENT   READY   AGE
rs-nginx   3         3         3       16m

2、方式一修改pod数量

# 修改数量为5
[root@k8s-master ~]# kubectl edit replicasets rs-nginx -n dev
replicaset.apps/rs-nginx edited

3、方式一修改pod数量是否生效

[root@k8s-master ~]# kubectl get replicasets -n dev
NAME       DESIRED   CURRENT   READY   AGE
rs-nginx   5         5         4       18m

4、方式二修改pod数量

# 修改数量为4
[root@k8s-master ~]# kubectl scale replicasets rs-nginx --replicas=4 -n dev
replicaset.apps/rs-nginx scaled

5、方式二修改pod数量是否生效

[root@k8s-master ~]# kubectl scale replicasets rs-nginx --replicas=4 -n dev
replicaset.apps/rs-nginx scaled

6、方式三修改pod数量

# # 修改数量为6
[root@k8s-master ~]# vim controller-rs-nginx.yaml 
[root@k8s-master ~]# kubectl apply -f controller-rs-nginx.yaml 
replicaset.apps/rs-nginx configured

7、方式三修改pod数量是否生效

[root@k8s-master ~]# kubectl get replicasets -n dev
NAME       DESIRED   CURRENT   READY   AGE
rs-nginx   6         6         4       24m
8.3.5 pod镜像更改

ReplicaSet管理的pod容器镜像进行更改

示例:

1、查看replicasets的镜像

[root@k8s-master ~]# kubectl get replicasets -n dev -o wide
NAME       DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES         SELECTOR
rs-nginx   3         3         0       6s    nginx        nginx:1.13.0   app=nginx-pod,app in (nginx-pod)

2、方式一修改容器镜像

# 修改容器镜像为nginx:1.15.0
[root@k8s-master ~]# kubectl edit replicasets rs-nginx -n dev
replicaset.apps/rs-nginx edited

3、方式一修改容器镜像验证

[root@k8s-master ~]# kubectl get replicasets -n dev -o wide
NAME       DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES         SELECTOR
rs-nginx   3         3         3       3m13s   nginx        nginx:1.15.0   app=nginx-pod,app in (nginx-pod)

4、方式二修改容器镜像

# 修改容器镜像为nginx:1.15.5
[root@k8s-master ~]# vim controller-rs-nginx.yaml 
[root@k8s-master ~]# kubectl apply -f controller-rs-nginx.yaml 
replicaset.apps/rs-nginx configured

5、方式二修改容器镜像验证

[root@k8s-master ~]# kubectl get replicasets -n dev -o wide
NAME       DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES         SELECTOR
rs-nginx   3         3         3       12m   nginx        nginx:1.15.5   app=nginx-pod,app in (nginx-pod)

6、方式三修改容器镜像

# 修改容器镜像为nginx:1.23.0
[root@k8s-master ~]# kubectl set image replicasets rs-nginx nginx=nginx:1.23.0  -n dev
replicaset.apps/rs-nginx image updated

7、方式三修改容器镜像验证

[root@k8s-master ~]# kubectl get replicasets -n dev -o wide
NAME       DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES         SELECTOR
rs-nginx   3         3         3       14m   nginx        nginx:1.23.0   app=nginx-pod,app in (nginx-pod)

注意:上面方式只是把ReplicaSet控制器容器镜像版本给更改了,但是现有pod容器镜像并不会发生改变,得一个个删掉现有的,重新生成的才是新镜像版本

[root@k8s-master ~]# kubectl delete pods rs-nginx-5gsxg -n dev
pod "rs-nginx-5gsxg" deleted

[root@k8s-master ~]# kubectl get pods -n dev
NAME             READY   STATUS              RESTARTS   AGE
rs-nginx-2s5wm   0/1     ContainerCreating   0          8s
rs-nginx-jjfbq   1/1     Running             0          26m
rs-nginx-tk4th   1/1     Running             0          26m

[root@k8s-master ~]# kubectl get pods -n dev
NAME             READY   STATUS    RESTARTS   AGE
rs-nginx-2s5wm   1/1     Running   0          6m30s
rs-nginx-jjfbq   1/1     Running   0          32m
rs-nginx-tk4th   1/1     Running   0          32m

8.4 Deployment

控制ReplicaSet操作Pod,就是控制器ReplicaSet该有的功能,控制器Deployment都实现。并在pod镜像方面做了升级,pod会自动更换镜像、暂停更换、继续更换、回滚操作
在这里插入图片描述

8.4.1 常见操作
# 查
kubectl get deployments -n 命名空间

kubectl get deployments -n 命名空间 -o wide/json/yaml

kubectl get deployments deploy控制器名 -n 命名空间 -o wide/json/yaml

kubectl describe deployments deploy控制器名 -n 命名空间

# 建
kubectl create/apply -f 文件名.yaml

# 编辑
kubectl edit deployments deploy控制器名 -n 命名空间
kubectl apply -f 文件名.yaml

kubectl set SUBCOMMAND [options]
# SUBCOMMAND选项,可以通过类似kubectl set image --help帮助信息
env              Update environment variables on a pod template
image            Update the image of a pod template
resources        使用 Pod 模板更新对象的资源请求/限制
selector         为资源设置选择器
serviceaccount   Update the service account of a resource
subject          Update the user, group, or service account in a role binding or cluster role

# 删除
kubectl delete -f 文件名.yaml
kubectl delete deployments deploy控制器名 -n 命名空间
8.4.2 资源清单
apiVersion: apps/v1  # 版本号
kind: Deployment     # 类型
metadata:            # 元数据
  name:              # rs名称
  namespace:         # 所属命名空间
  labels:            # 标签
    controller: deploy
spec:                # 详情描述
  replicas: 3        # 副本数量
  revisionHistoryLimit: 3 # 保留历史版本
  paused: false           # 暂停部署,默认是false
  progressDeadlineSeconds: 600 # 部署超时时间(s),默认是600
  strategy:               # 策略
    type: RollingUpdate   # 滚动更新策略
    rollingUpdate:        # 滚动更新
      maxSurge: 30%       # 最大额外可以存在的副本数,可以为百分比,也可以为整数
      maxUnavailable: 30% # 最大不可用状态的 Pod 的最大值,可以为百分比,也可以为整数
  selector:               # 选择器,通过它指定该控制器管理哪些pod
    matchLabels:          # Labels匹配规则
      app: nginx-pod
    matchExpressions:     # Expressions匹配规则
      - { key: app, operator: In, values: [ nginx-pod ] }
  template:               # 模板,当副本数量不足时,会根据下面的模板创建pod副本
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
        - name: nginx
          image: nginx:1.30.1
          ports:
            - containerPort: 80
8.4.3 pod镜像更改

Deployment控制器的容器镜像修改也同ReplicaSet控制器修改容器镜像方法相同,但是pod的容器镜像不需要手动删除,会根据策略进行自动版本更新。

spec.strategy.type有两个值:

  • RollingUpdate:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本Pod
  • Recreate:在创建出新的Pod之前会先杀掉所有已存在的Pod

spec.strategy.rollingUpdate.maxSurge:用来指定在升级过程中不可用Pod的最大数量,默认为25%

spec.strategy.rollingUpdate.maxSurge:用来指定在升级过程中可以超过期望的Pod的最大数量,默认为25%
在这里插入图片描述
示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx
  namespace: dev
  labels:
    controller: deploy
spec:
  replicas: 3
  revisionHistoryLimit: 3
  paused: false
  progressDeadlineSeconds: 600
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 30%
      maxUnavailable: 30%
  selector:
    matchLabels:
      app: nginx-pod
    matchExpressions:
      - { key: app, operator: In, values: [ nginx-pod ] }
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
        - name: nginx
          image: nginx:1.15.5
          ports:
            - containerPort: 80
[root@k8s-master ~]# kubectl apply -f controller-deploy-nginx.yaml 
deployment.apps/deploy-nginx created

[root@k8s-master ~]# kubectl get deployment -n dev -o wide
NAME           READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES         SELECTOR
deploy-nginx   3/3     3            3           103s   nginx        nginx:1.15.5   app=nginx-pod,app in (nginx-pod)

[root@k8s-master ~]# kubectl get pods -n dev
NAME                           READY   STATUS    RESTARTS   AGE
deploy-nginx-677f59dd8-2m9ph   1/1     Running   0          83s
deploy-nginx-677f59dd8-c5rbk   1/1     Running   0          83s
deploy-nginx-677f59dd8-t64bl   1/1     Running   0          83s

1、容器镜像版本更改

容器镜像版本更改方式参照ReplicaSet控制器方式

[root@k8s-master ~]# kubectl set image deployment deploy-nginx nginx=nginx:1.23.0  -n dev
deployment.apps/deploy-nginx image updated

2、容器镜像版本更改验证

[root@k8s-master ~]# kubectl get deployment -n dev -o wide
NAME           READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES         SELECTOR
deploy-nginx   3/3     2            3           3m1s   nginx        nginx:1.23.0   app=nginx-pod,app in (nginx-pod)

3、观看pods情况,是会进行镜像自动更新

[root@k8s-master ~]# kubectl get pods -n dev
NAME                            READY   STATUS              RESTARTS   AGE
deploy-nginx-677f59dd8-2m9ph    1/1     Running             0          3m12s
deploy-nginx-677f59dd8-t64bl    1/1     Running             0          3m12s
deploy-nginx-7cd566d98b-6sthc   0/1     ContainerCreating   0          12s
deploy-nginx-7cd566d98b-ztl65   1/1     Running             0          14s

[root@k8s-master ~]# kubectl get pods -n dev
NAME                            READY   STATUS    RESTARTS   AGE
deploy-nginx-7cd566d98b-6sthc   1/1     Running   0          2m35s
deploy-nginx-7cd566d98b-sxkn5   1/1     Running   0          101s
deploy-nginx-7cd566d98b-ztl65   1/1     Running   0          2m37s

[root@k8s-master ~]# kubectl describe pods deploy-nginx-7cd566d98b-6sthc -n dev
8.4.4 pod镜像更改操作

pod镜像也可以称为pod版本,通过kubectl rollout --help可知以下常见操作

kubectl rollout SUBCOMMAND [options]
# SUBCOMMAND
status        显示上线的状态
history       显示pod容器镜像(版本)更改记录
pause         暂停pod容器镜像(版本)更改操作
resume        继续已经暂停的pod容器镜像(版本)更改操作
restart       重启pod容器镜像(版本)更改操作
undo          默认回滚到上一次更改pod容器镜像(版本)更改记录(使用--to-revision指定回滚版本)

1、查看pod镜像(版本)更换情况

kubectl rollout status deployments deploy控制器名 -n 命名空间

示例:

[root@k8s-master ~]# kubectl rollout status deploy deploy-nginx -n dev
deployment "deploy-nginx" successfully rolled out

2、查看pod镜像(版本)更换历史

kubectl rollout history deployments deploy控制器名 -n 命名空间

示例:

[root@k8s-master ~]# kubectl rollout history deploy deploy-nginx -n dev
deployment.apps/deploy-nginx 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

3、暂停pod镜像(版本)更换操作

滚动更新是逐个替换,更新是需要一个时间段,暂停更换,就是维持目前pod容器镜像版本现状

kubectl rollout pause deployments deploy控制器名 -n 命名空间

4、暂停继续更换pod镜像(版本)

kubectl rollout resume deployments deploy控制器名 -n 命名空间

5、重启更改pod镜像(版本)

kubectl rollout restart deployments deploy控制器名 -n 命名空间

6、回滚操作

# 默认回滚到上一个版本
kubectl rollout undo deployments deploy控制器名 -n 命名空间

# 回滚到1的版本
kubectl rollout undo deployments deploy控制器名 --to-revision=1 -n 命名空间

8.5 HPA控制器

kubectl scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f
FILENAME | TYPE NAME) [options]

kubectl scale可以实现pod数量的更改,实际生产环境中,希望实现自动扩缩容。
在这里插入图片描述

[root@k8s-master ~]# kubectl api-resources | grep Horizontal
horizontalpodautoscalers          hpa          autoscaling/v2                         true         HorizontalPodAutoscaler
8.5.1 自动扩缩容

文档地址:https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/#autoscaling-on-multiple-metrics-and-custom-metrics

示例:

# hpa-nginx.yaml 文件
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
 name: hpa-nginx
 namespace: dev
 labels:
  controller: hpa
spec:
  scaleTargetRef: # 指定要控制的信息
    apiVersion: apps/v1
    kind: Deployment
    name: deploy-nginx
  minReplicas: 1 # 最小pod数量
  maxReplicas: 10 # 最大pod数量
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
# 执行
[root@k8s-master ~]# kubectl apply -f hpa-nginx.yaml 
horizontalpodautoscaler.autoscaling/hpa-nginx created

# 查看发现内存查看
[root@k8s-master ~]# kubectl get hpa -n dev
NAME        REFERENCE                 TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
hpa-nginx   Deployment/deploy-nginx   <unknown>/50%   1         10        3          6m4s

# 查看内存、cpu使用情况,发现指标API不可用
[root@k8s-master ~]# kubectl top node
error: Metrics API not available
8.5.2 指标API可用安装

kubectl top命令可用,则需要安装Metrics API

# 下载最新版本high-availability-1.21+.yaml
[root@k8s-master ~]# https://521github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability-1.21+.yaml# 改下面三处内容
hostNetwork: true
- --kubelet-insecure-tls
image: registry.aliyuncs.com/google_containers/metrics-server:v0.6.4

在这里插入图片描述

[root@k8s-master ~]# kubectl apply -f high-availability-1.21+.yaml

[root@k8s-master ~]# kubectl top nodes
NAME         CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
k8s-master   193m         4%     1641Mi          44%       
k8s-node1    68m          3%     755Mi           20%       
k8s-node2    70m          3%     651Mi           37%       
k8s-node3    70m          3%     559Mi           32%

[root@k8s-master ~]# kubectl top pods -n dev
NAME                            CPU(cores)   MEMORY(bytes)   
deploy-nginx-7cd566d98b-6sthc   0m           1Mi             
deploy-nginx-7cd566d98b-sxkn5   0m           1Mi             
deploy-nginx-7cd566d98b-ztl65   0m           7Mi
[root@k8s-master ~]# kubectl top --help
Display resource (CPU/memory) usage.

 The top command allows you to see the resource consumption for nodes or pods.

 This command requires Metrics Server to be correctly configured and working on the server.

Available Commands:
  node          Display resource (CPU/memory) usage of nodes
  pod           Display resource (CPU/memory) usage of pods

Usage:
  kubectl top [flags] [options]

Use "kubectl top <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).

常用命令:

# 查看所有节点cpu、内存情况
kubectl top nodes

# 查看某个节点cpu、内存情况
kubectl top nodes 节点ip/节点域名

# 查看某个命名空间所有pods的cpu、内存情况
kubectl top pods -n 命名空间名称

# 查看某个命名空间某个pods的cpu、内存情况
kubectl top pods pods名称 -n 命名空间名称

8.6 DaemonSet

[root@k8s-master ~]# kubectl api-resources | grep DaemonSet
daemonsets                        ds           apps/v1                                true         DaemonSet

节点级别的控制器,常用来日志收集、节点监控,会随着节点添加新增一个pod,节点移走减少一个pod
在这里插入图片描述

DaemonSet控制器生成的pods也支持使用kubectl rollout回滚操作、暂停、暂停继续、重启等操作。

8.6.1 资源清单
apiVersion: apps/v1 # 版本号
kind: DaemonSet # 类型
metadata: # 元数据
  name: # ds控制器称
  namespace: # 所属命名空间
  labels: #标签
    controller: daemonset
spec: # 详情描述
  revisionHistoryLimit: 3 # 保留历史版本
  updateStrategy: # 更新策略
    type: RollingUpdate # 滚动更新策略
    rollingUpdate: # 滚动更新
      maxUnavailable: 1 # 最大不可用状态的 Pod 的最大值,可以为百分比,也可以为整数
  selector: # 选择器,通过它指定该控制器管理哪些pod
    matchLabels: # Labels匹配规则
      app: nginx-pod
    matchExpressions: # Expressions匹配规则
      - { key: app, operator: In, values: [ nginx-pod ] }
  template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
        - name: nginx-containers
          image: nginx:latest
          ports:
            - containerPort: 80

示例:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ds-nginx
  namespace: dev
spec:
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
        - name: nginx
          image: nginx:latest
[root@k8s-master ~]# kubectl apply -f ds-nginx.yaml 
daemonset.apps/ds-nginx created

[root@k8s-master ~]# kubectl get pods -n dev -o wide
NAME             READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
ds-nginx-d7dtp   1/1     Running   0          75s   10.244.36.94     k8s-node1   <none>           <none>
ds-nginx-fwlrk   1/1     Running   0          75s   10.244.169.146   k8s-node2   <none>           <none>
ds-nginx-pjqxb   1/1     Running   0          75s   10.244.107.210   k8s-node3   <none>           <none>

8.7 Job控制器

[root@k8s-master ~]# kubectl api-resources | grep Job
jobs                                           batch/v1                               true         Job

在这里插入图片描述

运行一次就结束pods的控制器

8.7.1 资源清单
apiVersion: batch/v1 # 版本号
kind: Job # 类型       
metadata: # 元数据
  name: # Job控制器名称 
  namespace: # 所属命名空间 
  labels: #标签
    controller: job
spec: # 详情描述
  completions: 1 # 指定job需要成功运行Pods的次数。默认值: 1
  parallelism: 1 # 指定job在任一时刻应该并发运行Pods的数量。默认值: 1
  activeDeadlineSeconds: 30 # 指定job可运行的时间期限,超过时间还未结束,系统将会尝试进行终止。
  backoffLimit: 6 # 指定job失败后进行重试的次数。默认是6
  manualSelector: true # 是否可以使用selector选择器选择pod,默认是false
  selector: # 选择器,通过它指定该控制器管理哪些pod
    matchLabels: # Labels匹配规则
      app: counter-pod
    matchExpressions: # Expressions匹配规则
      - { key: app, operator: In, values: [ counter-pod ] }
  template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
    metadata:
      labels:
        app: counter-pod
    spec:
      restartPolicy: Never # 重启策略只能设置为Never或者OnFailure
      containers:
        - name: counter
          image: busybox:latest
          command: [ "bin/sh","-c","for i in {1..10}; do echo $i;sleep 2;done" ]
关于重启策略设置的说明:
    如果指定为OnFailure,则job会在pod出现故障时重启容器,而不是创建pod,failed次数不变
    如果指定为Never,则job会在pod出现故障时创建新的pod,并且故障pod不会消失,也不会重启,failed次数加1
    如果指定为Always的话,就意味着一直重启,意味着job任务会重复去执行了,当然不对,所以不能设置为Always

8.8 CronJob

[root@k8s-master ~]# kubectl api-resources | grep CronJob
cronjobs                          cj           batch/v1                               true         CronJob

在这里插入图片描述
执行类似定时任务的pods的控制器

8.8.1 资源清单
apiVersion: batch/v1 # 版本号
kind: CronJob # 类型
metadata: # 元数据
  name: # CronJob控制器名称
  namespace: # 所属命名空间
  labels: #标签
    controller: cronjob
spec: # 详情描述
  schedule: # cron格式的作业调度运行时间点,用于控制任务在什么时间执行
  concurrencyPolicy: # 并发执行策略,用于定义前一次作业运行尚未完成时是否以及如何运行后一次的作业
  failedJobHistoryLimit: # 为失败的任务执行保留的历史记录数,默认为1
  successfulJobHistoryLimit: # 为成功的任务执行保留的历史记录数,默认为3
  startingDeadlineSeconds: # 启动作业错误的超时时长
  jobTemplate: # job控制器模板,用于为cronjob控制器生成job对象;下面其实就是job的定义
    metadata:
    spec:
      completions: 1
      parallelism: 1
      activeDeadlineSeconds: 30
      backoffLimit: 6
      manualSelector: true
      selector:
        matchLabels:
          app: counter-pod
        matchExpressions: # 规则
          - { key: app, operator: In, values: [ counter-pod ] }
      template:
        metadata:
          labels:
            app: counter-pod
        spec:
          restartPolicy: Never
          containers:
            - name: counter
              image: busybox:latest
              command: [ "bin/sh","-c","for i in 1 2 3 4 5 6 7 8 9; do echo $i;sleep 20;done" ]
需要重点解释的几个选项:
schedule: cron表达式,用于指定任务的执行时间
	*/1    *      *    *     *
	<分钟> <小时> <日> <月份> <星期>

    分钟 值从 0 到 59.
    小时 值从 0 到 23.
    日 值从 1 到 31.
    月 值从 1 到 12.
    星期 值从 0 到 6, 0 代表星期日
    多个时间可以用逗号隔开; 范围可以用连字符给出;*可以作为通配符; /表示每...
concurrencyPolicy:
	Allow:   允许Jobs并发运行(默认)
	Forbid:  禁止并发运行,如果上一次运行尚未完成,则跳过下一次运行
	Replace: 替换,取消当前正在运行的作业并用新作业替换它

相关推荐

  1. K8s 教程

    2024-03-11 05:42:01       73 阅读
  2. 云原生周刊:2024 K8s 基准报告 | 2024.4.8

    2024-03-11 05:42:01       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-11 05:42:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-11 05:42:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-11 05:42:01       87 阅读
  4. Python语言-面向对象

    2024-03-11 05:42:01       96 阅读

热门阅读

  1. 在css中 height: 100vh;与height: 100%;有什么区别?

    2024-03-11 05:42:01       43 阅读
  2. windows下nginx配置https证书

    2024-03-11 05:42:01       45 阅读
  3. 【JVM】虚拟机调优 常用的调优参数

    2024-03-11 05:42:01       33 阅读
  4. react hook: useId

    2024-03-11 05:42:01       49 阅读
  5. leetcode299--猜数字游戏

    2024-03-11 05:42:01       41 阅读
  6. Vue3 重置&覆盖 reactive 数组数据的方法

    2024-03-11 05:42:01       48 阅读