认识K8s集群的声明式资源管理方法

news2025/5/25 8:17:14

前言

Kubernetes 集群的声明式资源管理方法是当今云原生领域中的核心概念之一,使得容器化应用程序的部署和管理变得更加高效和可靠。本文将认识了解 Kubernetes 中声明式管理的相关理念、实际应用以及优势。

目录

一、管理方法介绍

1. 概述

2. 语法格式

2.1 管理资源对象格式

2.2 YAML 语法格式

3. yaml 文件组成部分  

4. 如何快速编写 yaml 

5. 资源配置清单

5.1 查看资源配置清单

5.2 解释资源配置清单

6. 修改资源配置清单并应用

6.1 离线修改

6.2 在线修改

7. 查看 api 资源版本标签 

8. 删除资源配置清单

二、编写 ymal 文件

1. 部署 nginx-yaml 配置

1.1 编辑清单 yaml 文件

1.2 创建资源对象

1.3 创建 service 服务对外提供访问

1.4 创建 svc 资源对象

1.5 访问测试

1.6 port 端口类型

2. 部署 redis-yaml 配置

2.1 编辑清单、service yaml 文件

2.2 创建资源对象

2.3 连接 pod 实例

3. 部署 mysql-yaml 配置

3.1 生成模板 yaml 文件

3.2 创建资源

3.3 访问验证


一、管理方法介绍

1. 概述

通过使用 yaml 或 josn 文件对资源配置,然后再实现对资源的管理。

适合于对资源的修改操作

声明式资源管理方法依赖于资源配置清单文件对资源进行管理;资源配置清单文件有两种格式:yaml(人性化,易读),json(易于api接口解析)

对资源的管理,是通过事先定义在统一资源配置清单内,再通过陈述式命令应用到k8s集群里

2. 语法格式

2.1 管理资源对象格式

  • JSON 格式:主要用于 api 接口之间消息的传递
  • YAML 格式:用于配置和管理,YAML 是一种简洁的非标记性语言,内容格式人性化,较易读

2.2 YAML 语法格式

  • 大小写敏感
  • 使用缩进表示层级关系
  • 不支持Tab键制表符缩进,只使用空格缩进
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可,通常开头缩进两个空格
  • 符号字符后缩进一个空格,如冒号,逗号,短横杆(-)等
  • “---”表示YAML格式,一个文件的开始,用于分隔文件间
  • “#”表示注释 

kubectl create -f xxxx.yaml 

create 命令用于根据提供的配置文件创建新的 Kubernetes 资源。

  • 如果资源尚不存在,Kubernetes 会根据 YAML 文件中的定义新建对象(如 Deployments、Services、Pods 等)。
  • 如果资源已经存在,create 命令不会更改现有资源的状态,而是会报错,因为它旨在创建新资源而非修改现有资源。 

kubectl apply -f xxxx.yaml

apply 命令也用于根据配置文件创建或更新资源。

  • 与 create 不同的是,apply 会比较配置文件中定义的资源状态与集群中实际资源的状态。
  • 如果资源不存在,它将创建资源;
  • 如果资源已存在,它会尝试将实际资源的状态更新为配置文件中描述的状态。
  • 这意味着你可以多次运行 apply 来更新资源。

kubectl delete -f xxxx.yaml 

delete 命令用于根据配置文件删除 Kubernetes 资源;此命令非常直接,用于清理不再需要的资源。

  • 当你提供一个之前用于创建或更新资源的 YAML 文件时,kubectl 会识别出文件中定义的所有资源,并将其从集群中删除;
  • 这可以是单个资源,也可以是多个相关联的资源集合。 

3. yaml 文件组成部分  

在 K8s 中,控制器的定义是通过 YAML 文件完成的,该文件描述了资源的预期状态。这包括控制器的类型:如Deployment、statefulSet、Service 副本数量,使用的容器镜像,以及任何配置参数或环境变量。每一个控制器通常对应一种资源类型,如 Deployment、Service 等等。

在YAML中,我们可以指定这些资源的状态以及如何管理它们。Deployment 控制器在 YAML 文件中的定义可能包括:

  • metadata:例如控制器的名称和命名空间
  • spec:例如应用的副本数量,以及图像的 URL
  • selector:例如确定哪些 Pods 应由该控制器管理的标签
  • template:例如 Pod 的基本设计

4. 如何快速编写 yaml 

① 使用 kubectl create 命令生成 yaml 文件导出

示例:
kubectl create deployment nginx svc -o yaml > nginx-svc.yaml

② 使用 kubectl get 命令导出 yaml 文件

示例:
kubectl get svc nginx-service -o yaml > my-svc.yaml
或
kubectl edit svc nginx-service  #复制配置,再粘贴到新文件

③ 官网或者其他网站下载 yaml 模版,然后进行修改快速的方法

官网获取网址:Pods | Kubernetes

GITHUB获取地址:kubernetes/hack/testdata at master · kubernetes/kubernetes · GitHub

④ 查看字段帮助信息,可一层层的查看相关资源对象的帮助信息

kubectl explain deployments.spec.template.spec.containers
或
kubectl explain pods.spec.containers

⑤ 模拟运行 kubectl 陈述式创建资源的命令获取 

用 --dry-run 命令生成:
kubectl run my-deploy --image=nginx --dry-run=client -o yaml > my-deploy.yaml

5. 资源配置清单

资源配置清单是指用于定义 K8s 资源对象的配置文件。这些配置文件通常以 YAML 或 JSON 格式编写,用于描述要在 K8s 集群中创建、管理或删除的各种资源,如 Pod、Service、Deployment 等。

5.1 查看资源配置清单

返回nginx-01的Deployment资源的摘要信息,并以yaml格式显示:
[root@master01 ~]# kubectl get deployment nginx-01 -n fql -o yaml

获取nginx-service的Service资源,并以yaml格式输出该资源的详细信息:
[root@master01 ~]# kubectl get svc nginx-service -n fql -o yaml

5.2 解释资源配置清单

获取有关Kubernetes中Deployment资源的metadata字段的详细信息和说明:
[root@master01 ~]# kubectl explain deployment.metadata

获取有关Kubernetes中Service资源的metadata字段的详细信息和说明
[root@master01 ~]# kubectl explain service.metadata

在K8s中,metadata是用于描述资源对象的信息,metadata字段通常包括以下内容:
# name:资源对象的名称,用于在集群中唯一标识该对象
# namespace:资源对象所属的命名空间,用于对资源进行逻辑隔离和组织
# labels:一组键值对,用于标识和分类资源对象,以便于查询和选择
# annotations:一组键值对,用于存储额外的非标识性信息,如描述、构建信息等

6. 修改资源配置清单并应用

6.1 离线修改

[root@master01 ~]# kubectl create deployment nginx --image=nginx:1.14 --port=80 --replicas=2
[root@master01 ~]# kubectl expose deployment nginx --port=80 --target-port=80 --name=nginx-svc --type=NodePort

[root@master01 ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        5d22h
nginx-svc    NodePort    10.96.72.223   <none>        80:30997/TCP   4s
[root@master01 ~]# kubectl get pod,svc -o wide
NAME                        READY   STATUS    RESTARTS   AGE    IP            NODE     NOMINATED NODE   READINESS GATES
pod/nginx-d9d8cf5c7-6rhcs   1/1     Running   0          7m1s   10.244.1.40   node01   <none>           <none>
pod/nginx-d9d8cf5c7-p44sk   1/1     Running   0          7m1s   10.244.1.39   node01   <none>           <none>

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE     SELECTOR
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        5d22h   <none>
service/nginx-svc    NodePort    10.96.72.223   <none>        80:30997/TCP   26s     app=nginx

修改 yaml 文件,并用 kubectl apply -f xxxx.yaml 文件使之生效;注意:当 apply 不生效时,先使用 delete 清除资源,再 apply 创建资源。

[root@master01 ~]# kubectl get svc nginx-svc -o yaml > nginx-svc.yaml
[root@master01 ~]# vim nginx-svc.yaml 
    port: 8080   # 修改

[root@master01 ~]# kubectl delete -f nginx-svc.yaml  # 清除资源
service "nginx-svc" deleted
[root@master01 ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   5d22h
[root@master01 ~]# kubectl apply -f nginx-svc.yaml 
service/nginx-svc created
[root@master01 ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP          5d22h
nginx-svc    NodePort    10.96.72.223   <none>        8080:30997/TCP   2s

[root@master01 ~]# curl 10.96.72.223:8080
<title>Welcome to nginx!</title>

6.2 在线修改

直接使用 kubectl edit service nginx 在线编辑资源配置清单并保存退出即时生效(如port: 888)
PS:此修改方式不会对yaml文件内容修改

[root@master01 ~]# kubectl edit svc nginx-svc
service/nginx-svc edited
# i:编辑,wq:保存 

[root@master01 ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP         5d22h
nginx-svc    NodePort    10.96.72.223   <none>        888:30997/TCP   10m
[root@master01 ~]# vim nginx-svc.yaml 
    port: 8080    # 未对yaml文件内容进行修改
[root@master01 ~]# curl 10.96.72.223:888
<title>Welcome to nginx!</title>

7. 查看 api 资源版本标签 

[root@master01 ~]# kubectl api-versions
apps/v1					# 如果是业务场景一般首选使用 apps/v1
apps/v1beta1			# 带有beta字样的代表的是测试版本,不用在生产环境中

8. 删除资源配置清单

① 陈述式删除

kubectl delete service nginx
# 是一个命令,用于删除名为nginx的服务。这将从Kubernetes集群中删除该服务的定义和相关资源

② 声明式删除

kubectl delete -f nginx-svc.yaml
# 根据提供的YAML文件删除资源

区别:

  • 第一个命令是根据资源名称直接删除服务;
  • 第二个命令是根据提供的 YAML 文件中的定义删除资源。第二个命令更加灵活,可以一次性删除多个资源,而不仅限于服务。

二、编写 ymal 文件

1. 部署 nginx-yaml 配置

1.1 编辑清单 yaml 文件

[root@master01 ~]# mkdir /data/demo -p
[root@master01 ~]# cd /data/demo/
[root@master01 demo]# vim nginx-dp.yaml
apiVersion: apps/v1          # 指定api版本标签
kind: Deployment             # 定义资源的类型/角色,deployment为副本控制器,此处资源类型可以是Deployment、Job、Ingress、Service等
metadata:                    # 定义资源的元数据信息,比如资源的名称、namespace、标签等信息
  name: nginx-01             # 定义资源的名称,在同一个namespace空间中必须是唯一的
  labels:                    # 定义Deployment资源标签
    web: nginx-01            # 定义deployment资源需要的参数属性,诸如是否在容器失败时重新启动容器的属性
spec:                  
  replicas: 3                # 定义副本数量
  selector:                  # 定义标签选择器
    matchLabels:             # 定义匹配标签 
      web: nginx-01          # 需与 .spec.template.metadata.labels 定义的标签保持一致
  template:                  # 定义业务模板,如果有多个副本,所有副本的属性会按照模板的相关配置进行匹配
    metadata:                
      labels:                # 定义Pod副本将使用的标签,需与 .spec.selector.matchLabels 定义的标签保持一致
        web: nginx-01
    spec:
      containers:            # 定义容器属性
      - name: nginx          # 定义一个容器名,一个 - name: 定义一个容器
        image: nginx:1.14    # 定义容器使用的镜像以及版本
        ports:
        - containerPort: 80  # 定义容器的对外的端口

1.2 创建资源对象

[root@master01 demo]# kubectl apply -f nginx-dp.yaml 
deployment.apps/nginx-01 created
[root@master01 demo]# kubectl get pod
NAME                        READY   STATUS    RESTARTS   AGE
nginx-01-8449c47886-22tm4   1/1     Running   0          8s
nginx-01-8449c47886-csqhk   1/1     Running   0          8s
nginx-01-8449c47886-zq9z8   1/1     Running   0          8s

1.3 创建 service 服务对外提供访问

[root@master01 demo]# vim nginx-svc.yaml
apiVersion: v1      # Kubernetes API 的版本,指定为 v1
kind: Service       # 定义了一个 Service(服务)
metadata:           # 包含了服务的元数据,比如名称、标签等
  name: nginx-svc   # 服务的名称
  labels:           # 服务的标签,用于标识和选择相关的资源
    web: nginx-01   # 服务的标签
spec:               # 定义了服务的规格,包括服务类型、端口和选择器
  type: NodePort    # 服务的类型,被设置为 NodePort
  ports:            # 服务的端口列表
  - port: 80        # 服务的端口
    targetPort: 80  # 服务转发请求的目标端口,设置为 80,与后端 Pod 的容器端口匹配
  selector:         # 定义了用于选择后端 Pod 的标签
    web: nginx-01   # 选择器的标签,与 Deployment 或 Pod 的标签匹配

1.4 创建 svc 资源对象

[root@master01 demo]# kubectl apply -f nginx-svc.yaml 
service/nginx-svc created
[root@master01 demo]# kubectl get pod,svc -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
pod/nginx-01-8449c47886-22tm4   1/1     Running   0          24m   10.244.1.43   node01   <none>           <none>
pod/nginx-01-8449c47886-csqhk   1/1     Running   0          24m   10.244.2.34   node02   <none>           <none>
pod/nginx-01-8449c47886-zq9z8   1/1     Running   0          24m   10.244.1.44   node01   <none>           <none>

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE   SELECTOR
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        6d    <none>
service/nginx-svc    NodePort    10.96.60.107   <none>        80:31646/TCP   10s   web=nginx-01

1.5 访问测试

[root@master01 demo]# curl 10.96.60.107
<title>Welcome to nginx!</title>

[root@master01 demo]# curl 10.96.60.107 -I
Server: nginx/1.14.2

1.6 port 端口类型

① port

port 是 k8s 集群内部访问 service 的端口,即通过 clusterIP: port 可以从 Pod 所在的 Node 上访问到 service(四层)
② nodePort

nodePort 是外部访问 k8s 集群中 service 的端口,通过 nodeIP: nodePort 可以从外部访问到某个 service
③ targetPort

targetPort 是 Pod 的端口,从 port 或 nodePort 来的流量经过 kube-proxy 反向代理负载均衡转发到后端 Pod 的 targetPort 上,最后进入容器
④ containerPort

containerPort 是 Pod 内部容器的端口,targetPort 映射到 containerPort

2. 部署 redis-yaml 配置

2.1 编辑清单、service yaml 文件

[root@master01 demo]# vim redis-db-svc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-dp
  labels:
    nosql: redis-01
spec:
  replicas: 1
  selector:
    matchLabels:
        nosql: redis-01
  template:
    metadata:
      labels:
        nosql: redis-01
    spec:
      containers:
      - name: redis
        image: redis:latest
        ports:
        - containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
  name: redis-svc
  labels:
    nosql: redis-01
spec:
  selector:
    nosql: redis-01
  ports:
  - nodePort: 30001
    port: 6379
    protocol: TCP
    targetPort: 6379
  type: NodePort

2.2 创建资源对象

[root@master01 demo]# kubectl apply -f redis-db-svc.yaml

[root@master01 demo]# kubectl get pod,svc
NAME                            READY   STATUS    RESTARTS   AGE
pod/nginx-01-8449c47886-22tm4   1/1     Running   0          60m
pod/nginx-01-8449c47886-csqhk   1/1     Running   0          60m
pod/nginx-01-8449c47886-zq9z8   1/1     Running   0          60m
pod/redis-dp-cd9f5cff6-clhdr    1/1     Running   0          8m25s

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          6d1h
service/nginx-svc    NodePort    10.96.60.107    <none>        80:31646/TCP     36m
service/redis-svc    NodePort    10.96.203.220   <none>        6379:30002/TCP   77s

2.3 连接 pod 实例

3. 部署 mysql-yaml 配置

3.1 生成模板 yaml 文件

使用 yaml 格式导出生成模板,并进行修改以及删除一些不必要的参数

① 生成并修改命名空间创建 yaml 文件

[root@master01 ~]# kubectl create ns mysql-server -o yaml --dry-run=client > mysql.yaml
[root@master01 ~]# vim mysql.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: mysql-server
---

② 生成并修改清单创建 yaml 文件

  • 追加创建一个 Deployment YAML 文件模板,但不包含环境变量
  • 手动编辑 mysql.yaml 文件,添加环境变量、卷挂载
[root@master01 ~]# kubectl create deployment mysql-01 --image=mysql:latest --port=3306 --replicas=1 -n mysql-server --dry-run=client -o yaml >> mysql.yaml
apiVersion: v1             # Kubernetes API 的版本
kind: Namespace            # 定义了一个 Namespace
metadata:                  # 包含了资源的元数据,比如名称、标签等
  name: mysql-server       # Namespace 的名称
---                        # 这个分隔符表示 YAML 文件中的两个资源定义之间的分隔
apiVersion: apps/v1
kind: Deployment           # 指定了资源类型为 Deploymen
metadata:                  # 包含了 Deployment 的元数据,比如名称、标签等
  labels:                  # Deployment 的标签,用于标识和选择相关的资源
    app: mysql-01        
  name: mysql-01           # Deployment 的名称
  namespace: mysql-server  # Deployment 所属的 Namespace
spec:                      # 定义了 Deployment 的规格,包括副本数量、选择器和 Pod 模板
  replicas: 1              # Deployment 的副本数量
  selector:                # 定义了用于选择 Pod 的标签
    matchLabels:           # 这是选择器的标签,与 Pod 模板中的标签匹配
      app: mysql-01        
  template:                # 定义了要创建的 Pod 的模板
    metadata:              # 包含了 Pod 模板的元数据,比如标签等
      labels:              # Pod 模板的标签,用于标识和选择相关的资源
        app: mysql-01
    spec:                  # 定义了 Pod 的规格,包括容器和端口
      containers:
      - image: mysql:latest          # 容器的镜像,使用的是最新版本的 MySQL 镜像
        name: mysql                  # 容器的名称
        ports:                       # 容器的端口列表
        - containerPort: 3306        # 容器的端口
        env:                         # 定义环境变量列表
        - name: MYSQL_ROOT_PASSWORD  # 环境变量的名称
          value: "123123"            # 设置MySQL的root密码,也就是环境变量的值
# 当MySQL容器首次启动时,它会检查数据库是否已经初始化,并且如果没有提供密码相关的环境变量,它会报错并退出
        volumeMounts:                # 定义如何挂载卷到容器中
        - name: mysql-data           # 引用的卷的名称
          mountPath: /var/lib/mysql  # 卷在容器中的挂载路径
      volumes:                       # 定义Pod中使用的卷列表
      - name: mysql-data             # 卷的名称,与volumeMounts中的name相对应
        emptyDir: {}
# 一个空目录卷。这种类型的卷在Pod首次被调度到节点上时创建,并在Pod被删除时销毁。它不持久化数据,仅用于临时存储
---

③ 编辑 svc 资源 yaml 文件

由于集群中还未创建 mysql-01,无法使用命令生成模板:kubectl expose service mysql-01 --port=3306 --target-port=3306 --name=mysql-svc --type=NodePort --dry-run=client -o yaml >> mysql.yam

这里手动编辑 yaml 文件:

[root@master01 ~]# vim mysql.yaml 
apiVersion: v1             # Kubernetes API 的版本
kind: Namespace            # 定义了一个 Namespace
metadata:                  # 包含了资源的元数据,比如名称、标签等
  name: mysql-server       # Namespace 的名称
---                        # 这个分隔符表示 YAML 文件中的两个资源定义之间的分隔
apiVersion: apps/v1
kind: Deployment           # 指定了资源类型为 Deploymen
metadata:                  # 包含了 Deployment 的元数据,比如名称、标签等
  labels:                  # Deployment 的标签,用于标识和选择相关的资源
    app: mysql-01        
  name: mysql-01           # Deployment 的名称
  namespace: mysql-server  # Deployment 所属的 Namespace
spec:                      # 定义了 Deployment 的规格,包括副本数量、选择器和 Pod 模板
  replicas: 1              # Deployment 的副本数量
  selector:                # 定义了用于选择 Pod 的标签
    matchLabels:           # 这是选择器的标签,与 Pod 模板中的标签匹配
      app: mysql-01        
  template:                # 定义了要创建的 Pod 的模板
    metadata:              # 包含了 Pod 模板的元数据,比如标签等
      labels:              # Pod 模板的标签,用于标识和选择相关的资源
        app: mysql-01
    spec:                  # 定义了 Pod 的规格,包括容器和端口
      containers:
      - image: mysql:latest          # 容器的镜像,使用的是最新版本的 MySQL 镜像
        name: mysql                  # 容器的名称
        ports:                       # 容器的端口列表
        - containerPort: 3306        # 容器的端口
        env:                         # 定义环境变量列表
        - name: MYSQL_ROOT_PASSWORD  # 环境变量的名称
          value: "123123"            # 设置MySQL的root密码,也就是环境变量的值
# 当MySQL容器首次启动时,它会检查数据库是否已经初始化,并且如果没有提供密码相关的环境变量,它会报错并退出
        volumeMounts:                # 定义如何挂载卷到容器中
        - name: mysql-data           # 引用的卷的名称
          mountPath: /var/lib/mysql  # 卷在容器中的挂载路径
      volumes:                       # 定义Pod中使用的卷列表
      - name: mysql-data             # 卷的名称,与volumeMounts中的name相对应
        emptyDir: {}
# 一个空目录卷。这种类型的卷在Pod首次被调度到节点上时创建,并在Pod被删除时销毁。它不持久化数据,仅用于临时存储
--- 
apiVersion: v1              
kind: Service               # 定义了一个 Service(服务)
metadata:                   # 包含了服务的元数据,比如名称、标签等
  name: mysql-service       # 服务的名称
  namespace: mysql-server   # 服务所属的 Namespace
  labels:                   # 服务的标签,用于标识和选择相关的资源
    app: mysql-01           # 服务的标签,与 Deployment 或 Pod 的标签匹配
spec:                       # 定义了服务的规格,包括服务类型、端口和选择器
  type: NodePort            # 服务的类型,被设置为 NodePort
  ports:                    # 服务的端口列表
  - port: 3306              # 服务的端口
    targetPort: 3306        # 服务转发请求的目标端口
  selector:                 # 定义了用于选择后端 Pod 的标签
    app: mysql-01           # 选择器的标签,与 Deployment 或 Pod 的标签匹配

3.2 创建资源

[root@master01 ~]# kubectl apply -f mysql.yaml 
namespace/mysql-server created
deployment.apps/mysql-01 created
service/mysql-service created

[root@master01 ~]# kubectl get pod,svc -n mysql-server -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
pod/mysql-01-776dd57c9b-fb5hp   1/1     Running   0          48s   10.244.2.37   node02   <none>           <none>

NAME                    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE   SELECTOR
service/mysql-service   NodePort   10.96.103.121   <none>        3306:32316/TCP   68s   app=mysql-01

3.3 访问验证

[root@master01 ~]# kubectl exec -it mysql-01-776dd57c9b-fb5hp  -n mysql-server bash 
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@mysql-01-776dd57c9b-fb5hp:/# mysql -u root -p'123123'
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

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

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

相关文章

猫头虎 解析:为什么AIGC在国内适合做TOB,在国外适合做TOC?

猫头虎 解析&#xff1a;为什么AIGC在国内适合做TOB&#xff0c;在国外适合做TOC&#xff1f; 博主 猫头虎 的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面…

掩码生成蒸馏——知识蒸馏

摘要 https://arxiv.org/pdf/2205.01529 知识蒸馏已成功应用于各种任务。当前的蒸馏算法通常通过模仿教师的输出来提高学生的性能。本文表明&#xff0c;教师还可以通过指导学生的特征恢复来提高学生的表示能力。从这一观点出发&#xff0c;我们提出了掩码生成蒸馏&#xff08…

《图解支付系统设计与实现》电子书_V20240525

相较于上次公开发布的V20240503版本&#xff0c;变更内容如下&#xff1a; 根据掘金网友zz67373&#xff08;李浩铭&#xff09;的勘误建议&#xff0c;优化了部分描述。增加&#xff1a;金额处理规范&#xff0c;低代码报文网关实现完整代码&#xff0c;分布式流控等内容。扩…

Golang | Leetcode Golang题解之第111题二叉树的最小深度

题目&#xff1a; 题解&#xff1a; func minDepth(root *TreeNode) int {if root nil {return 0}queue : []*TreeNode{}count : []int{}queue append(queue, root)count append(count, 1)for i : 0; i < len(queue); i {node : queue[i]depth : count[i]if node.Left …

(十一)统计学基础练习题五(50道选择题)

本文整理了统计学基础知识相关的练习题&#xff0c;共50道&#xff0c;适用于想巩固统计学基础或备考的同学。来源&#xff1a;如荷学数据科学题库&#xff08;技术专项-统计学二&#xff09;。序号之前的题请看往期文章。 201&#xff09; 202&#xff09; 203&#xff09; 2…

LeetCode 第131场双周赛个人题解

100309. 求出出现两次数字的 XOR 值 原题链接 求出出现两次数字的 XOR 值 - 力扣 (LeetCode) 竞赛 思路分析 签到题&#xff0c;一次遍历 AC代码 class Solution:def duplicateNumbersXOR(self, nums: List[int]) -> int:cnt Counter(nums)res 0st set(nums)for x …

linux系统环境—基础开发工具

目录 1. yum工具&#xff0c;进行软件安装 示例&#xff1a;下载第一个软件 2. vim编辑器&#xff0c;学会vim的简单配置 vim的基本操作 vim末行模式命令集 插入模式与普通编辑器差不多。无命令集合 3. gcc/g编译器的使用&#xff0c;并了解其过程&#xff0c;原理 1预…

脚注:书籍的小秘密,躲藏在脚注间

脚注&#xff1a;书籍的小秘密&#xff0c;躲藏在脚注间 脚注是一种在文本中提供补充信息、引用出处或注解的方式&#xff0c;有助于读者更全面地理解文中内容&#xff0c;并为进一步研究提供参考和跳转点。 在一书本中&#xff0c;脚注是额外提供给读者的文字信息&#xff0…

java:static关键字用法

在静态方法中不能访问类的非静态成员变量和非静态方法&#xff0c; 因为非静态成员变量和非静态方法都必须依赖于具体的对象才能被调用。 从上面代码里看出&#xff1a; 1.静态方法不能调用非静态成员变量。静态方法test2()中调用非静态成员变量address&#xff0c;编译失败…

Java进阶学习笔记19——内部类

1、 内部类&#xff1a; 是类中五大成分之一&#xff08;成员变量、方法、构造函数、内部类、代码块&#xff09;&#xff0c;如果一个类定义在另一个 类的内部&#xff0c;这个类就是内部类。 场景&#xff1a;当一个类的内部&#xff0c;包含了一个完整的事物&#xff0c;且…

[笔试训练](三十三)097:跳台台阶扩展问题098:包含不超过两种字符的最长子串099:字符串的排列

目录 097:跳台台阶扩展问题 098:包含不超过两种字符的最长子串 099:字符串的排列 097:跳台台阶扩展问题 题目链接:跳台阶扩展问题_牛客题霸_牛客网 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 规律题: 1.跳上n级台阶的跳法等于前面1~(n-1)级台阶跳法的总和1。 2.跳…

[5] CUDA线程调用与存储器架构

CUDA线程调用与存储器架构 前几节简单讲了如何编写CUDA程序&#xff0c;利用GPU的处理能力并行执行多个线程和块。之前所有程序里的线程是相互独立的&#xff0c;没有多个线程之间的通信多是实际应用程序需要中间线程之间的通信&#xff0c;本文将仔细讲解线程调用以及CUDA的分…

Gradle的settings.gradle.kts你真的理解吗?

你还在用.gradle文件吗&#xff1f;例如build.gradle、settings.gradle&#xff0c;那么你就out了。现在我们有必要了解一下kts脚本了。在Android项目中&#xff0c;默认有3个文件可以替换成kts脚本&#xff0c;即project的build.gradle、app模块的build.gradle和project的sett…

关于在子线程中获取不到HttpServletRequest对象的问题

这篇文章主要分享一下项目里遇到的获取request对象为null的问题&#xff0c;具体是在登录的时候触发的邮箱提醒&#xff0c;获取客户端ip地址&#xff0c;然后通过ip地址定位获取定位信息&#xff0c;从而提示账号在哪里登录。 但是登录却发现获取request对象的时候报错了。 具…

数据插值之朗格朗日插值(一)

目录 一、引言 二、代码实现 2.1 Lagrange插值求插值多项式&#xff1a; 代码解析&#xff1a; 1.vpa解释 2.ploy&#xff08;x&#xff09;解释: 3.conv&#xff08;&#xff09;解释 4.poly2sym()解释 2.2 Lagrange插值求新样本值和误差估计&#xff1a; 代码解析&…

鲁教版七年级数学上册-笔记

文章目录 第一章 三角形1 认识三角形2 图形的全等3 探索三角形全等的条件4 三角形的尺规作图5 利用三角形全等测距离 第二章 轴对称1 轴对称现象2 探索轴对称的性质4 利用轴对称进行设计 第三章 勾股定理1 探索勾股定理2 一定是直角三角形吗3 勾股定理的应用举例 第四章 实数1 …

C++技能进阶指南——多态语法剖析

前言&#xff1a;多态是面向对象的三大特性之一。顾名思义&#xff0c; 多态就是多种状态。 那么是什么的多种状态呢&#xff1f; 这里的可能有很多。比如我们去买火车票&#xff0c; 有普通票&#xff0c; 学生票&#xff1b; 又比如我们去旅游&#xff0c; 有儿童票&#xff…

心链2---前端开发(整合路由,搜索页面,用户信息页开发)

心链——伙伴匹配系统 接口调试 说书人&#x1f4d6;&#xff1a;上回书说到用了两种方法查询标签1.SQL查询&#xff0c;2.内存查询&#xff1b;两种查询效率是部分上下&#xff0c;打的是难解难分&#xff0c;是时大地皴裂&#xff0c;天色聚变&#xff0c;老祖斟酌再三最后决…

数据库-SQL性能分析

SQL执行频率 慢查询日志 慢查询日志记录了所有执行时间超过指定参数&#xff08;long_query_time&#xff0c;单位&#xff1a;秒&#xff0c;默认10秒&#xff09;的所有 SQL语句的日志。 MySQL的慢查询日志默认没有开启&#xff0c;我们可以查看一下系统变量 slow_query_l…

leetcode328. 奇偶链表,附详细解析和代码注释

leetcode328. 奇偶链表 给定单链表的头节点 head &#xff0c;将所有索引为奇数的节点和索引为偶数的节点分别组合在一起&#xff0c;然后返回重新排序的列表。 第一个节点的索引被认为是 奇数 &#xff0c; 第二个节点的索引为 偶数 &#xff0c;以此类推。 请注意&#xff0…