K8s投射数据卷

目录

一.Secret

1.secret介绍

2.secret的类型

3.创建secret

 4.使用secret

环境变量的形式

 volume数据卷挂载

二ConfigMap

1.创建ConfigMap的方式

 2.使用ConfigMap

2.1作为volume挂载使用

2.2.作为环境变量

 三.Downward API

 1.以环境变量的方式实现

2.Volume挂载


一.Secret

1.secret介绍

  • secret用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥。这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的风险。
  •  用户可以创建自己的secret,系统也会有自己的secret。
  •  Pod需要先引用才能使用某个secret; pod使用secret方式主要是作为volume的一个域被一个或多个容器挂载。

2.secret的类型

內建的Secret:

由ServiceAccount创建的API证书附加的秘钥k8s自动生成的用来访问apiserver的Secret,所有Pod会默认使用这个Secret与apiserver通信。

创建自己的Secret:

方式1:使用kubectl create secret命令
方式2:yaml文件创建Secret

3.创建secret

创建pod要访问数据库需要用户名密码,现在我们分别设置这个用户名和密码 Secret 对象要求这些数据必须是经过 Base64 转码。

 echo -n "123456" | base64
MTIzNDU2
 echo -n "test" | base64
dGVzdA==


手动base64解码方式:
[root@kube-master echo dGVzdA== | base64 --decode    #或者 -d
test[root@kube-master ~]# 

创建

[root@kube-master ~]# vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  password: MDAxMTIy
  database: dGVzdA==


## kubectl apply -f secret.yml 

[root@kube-master ~]# kubectl  get secret
NAME                  TYPE                                  DATA   AGE
default-token-j48pd   kubernetes.io/service-account-token   3      3d3h
mysecret              Opaque                                2      6h

 4.使用secret

secret可以作为数据卷挂载或者作为环境变量暴露给Pod中的容器使用,也可以被系统中的其他资源使用。

每一个被引用的Secret都要在spec.volumes中定义
 如果Pod中的多个容器都要引用这个Secret那么每一个容器定义中都要指定自己的volumeMounts,但是Pod定义中声明一次spec.volumes就好了。

  • 环境变量的形式
 env:        定义环境变量
      - name: MYSQL_ROOT_PASSWORD     #创建新的环境变量名称
        valueFrom:
           secretKeyRef:            #调用的key是什么
              name: mysecret        #变量的值来自于mysecret
              key: password            #username里面的值
      - name: MYSQL_DATABASE
        valueFrom:             
            secretKeyRef:
              name: mysecret
              key: database
  •  volume数据卷挂载
 volumeMounts:        #挂载一个卷
      - name: ljh        #这个名字需要与定义的卷的名字一致
        mountPath: "/opt/aaa"    #挂载到容器里哪个目录下
        readOnly: true    
  volumes:              #数据卷的定义
    - name: ljh        #卷的名字这个名字自定义
      secret:             #卷是直接使用的secret。
        secretName: mysecret 
        items:
          - key: password    #将那个key重新定义到那个目录下
            path: aren    #相对路径,相对于/opt/aaa的路径

映射secret key到指定的路径     和    以环境变量的形式使用Secret

[root@kube-master kubernetes]# vim  mysql.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  password: MDAxMTIy
  database: dGVzdA==

---
apiVersion: v1
kind: Pod
metadata:
  name: mysql
  labels:
    name: mysql
spec:
  containers:
  - name: mysql
    image: 10.36.192.206:8088/library/mysql:5.7
    resources:
      limits:
        memory: "512Mi"
        cpu: "1000m"
    ports:
      - containerPort: 3306
    env:        定义环境变量
      - name: MYSQL_ROOT_PASSWORD     #创建新的环境变量名称
        valueFrom:
           secretKeyRef:            #调用的key是什么
              name: mysecret        #变量的值来自于mysecret
              key: password            #username里面的值
      - name: MYSQL_DATABASE
        valueFrom:             
            secretKeyRef:
              name: mysecret
              key: database

    volumeMounts:        #挂载一个卷
      - name: ljh        #这个名字需要与定义的卷的名字一致
        mountPath: "/opt/aaa"    #挂载到容器里哪个目录下
        readOnly: true    
  volumes:              #数据卷的定义
    - name: ljh        #卷的名字这个名字自定义
      secret:             #卷是直接使用的secret。
        secretName: mysecret 
        items:
          - key: password    #将那个key重新定义到那个目录下
            path: aren    #相对路径,相对于/opt/aaa的路径

创建并查看

[root@kube-master kubernetes]# kubectl  apply -f mysql.yaml

4.1 从volume中读取secret的值

[root@kube-master kubernetes]# kubectl  exec -it -n default   mysql   -c mysql /bin/bash

bash-4.2# cat /opt/aaa/aren 
001122bash-4.2# 

 4.2 打印一下定义的变量

bash-4.2# echo $MYSQL_DATABASE
test

4.3 被挂载的secret内容自动更新

也就是如果修改一个Secret的内容,那么挂载了该Secret的容器中也将会取到更新后的值,但是这个时间间隔是由kubelet的同步时间决定的。

将password修改为123456 容器中挂在的数据也会改变。

bash-4.2# cat /opt/aaa/aren 
123456bash-4.2# 

二ConfigMap

1.创建ConfigMap的方式

创建ConfigMap的方式有4种:

命令行方式
方式1:通过直接在命令行中指定configmap参数创建,即--from-literal
方式2:通过指定文件创建,即将一个配置文件创建为一个ConfigMap,--from-file=<文件>
方式3:通过指定目录创建,即将一个目录下的所有配置文件创建为一个ConfigMap,--from-file=<目录>
配置文件方式
方式4:事先写好标准的configmap的yaml文件,然后kubectl create -f 创建

1.1 通过命令行参数创建

kubectl create configmap test-configmap --from-literal=user=root 


#结果如下面的data内容所示 
[root@kube-master kubernetes]# kubectl get configmap test-configmap -o yaml
apiVersion: v1
data:
  user: root
kind: ConfigMap
metadata:
  creationTimestamp: "2023-12-14T09:24:55Z"
  name: test-configmap
  namespace: default
  resourceVersion: "144400"
  uid: f1f3cd45-1880-444c-b30a-49a3f5345a2c

1.2.通过指定文件创建

kubectl create configmap test-yaml    --from-file=/etc

##结果如下面data内容所示
[root@kube-master kubernetes]# kubectl get configmap etc -o yaml
apiVersion: v1
data:
  passwd: |
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    chrony:x:998:996::/var/lib/chrony:/sbin/nologin
    aren:x:1000:1000:aren:/home/aren:/bin/bash
    nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
    ntp:x:38:38::/etc/ntp:/sbin/nologin
kind: ConfigMap
metadata:
  creationTimestamp: "2023-12-14T09:31:29Z"
  name: etc
  namespace: default
  resourceVersion: "144961"
  uid: 0243ada4-ee7a-4ef5-a6d9-3a1fdc88b6db

1.3通过yaml文件创建

[root@kube-master kubernetes]# vim configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  nginx.level: 1.20.2
  nginx.info:
    nginx配置文件
  nginx.conf: |
      # For more information on configuration, see:
      #   * Official English Documentation: http://nginx.org/en/docs/
      #   * Official Russian Documentation: http://nginx.org/ru/docs/

      user nginx;
      worker_processes auto;
      error_log /var/log/nginx/error.log;
      pid /run/nginx.pid;

      # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
      include /usr/share/nginx/modules/*.conf;

      events {
          worker_connections 1024;
      }

      http {
          log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                            '$status $body_bytes_sent "$http_referer" '
                            '"$http_user_agent" "$http_x_forwarded_for"';

          access_log  /var/log/nginx/access.log  main;

          sendfile            on;
          tcp_nopush          on;
          tcp_nodelay         on;
          keepalive_timeout   65;
          types_hash_max_size 4096;

          include             /etc/nginx/mime.types;
          default_type        application/octet-stream;

          # Load modular configuration files from the /etc/nginx/conf.d directory.
          # See http://nginx.org/en/docs/ngx_core_module.html#include
          # for more information.
          include /etc/nginx/conf.d/*.conf;

          server {
              listen       88;
              server_name  _;
              root         /usr/share/nginx/html;

              # Load configuration files for the default server block.
              include /etc/nginx/default.d/*.conf;

              error_page 404 /404.html;
              location = /404.html {
              }

              error_page 500 502 503 504 /50x.html;
              location = /50x.html {
              }
          }

      # Settings for a TLS enabled server.
      #
      #    server {
      #        listen       443 ssl http2;
      #        listen       [::]:443 ssl http2;
      #        server_name  _;
      #        root         /usr/share/nginx/html;
      #
      #        ssl_certificate "/etc/pki/nginx/server.crt";
      #        ssl_certificate_key "/etc/pki/nginx/private/server.key";
      #        ssl_session_cache shared:SSL:1m;
      #        ssl_session_timeout  10m;
      #        ssl_ciphers HIGH:!aNULL:!MD5;
      #        ssl_prefer_server_ciphers on;
      #
      #        # Load configuration files for the default server block.
      #        include /etc/nginx/default.d/*.conf;
      #
      #        error_page 404 /404.html;
      #            location = /40x.html {
      #        }
      #
      #        error_page 500 502 503 504 /50x.html;
      #            location = /50x.html {
      #        }
      #    }

      }



创建

[root@kube-master kubernetes]# kubectl  apply -f configmap.yaml 


#查看
[root@kube-master kubernetes]# kubectl  get configmap nginx-config  -o yaml

 可视化界面查看:

 2.使用ConfigMap

使用ConfigMap的方式,一种是通过环境变量的方式,直接传递pod,另一种是使用volume的方式挂载入到pod内。

2.1作为volume挂载使用
[root@kube-master kubernetes]# vim test-config.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  containers:
  - name: nginx
    image: 10.36.192.206:8088/library/nginx:1.20.2
    ports:
      - containerPort: 80
    volumeMounts:
      - name: nginx       ##挂载的名称
        mountPath: /etc/nginx/nginx.conf   #挂载路径
        subPath: nginx.conf    #这个文件不会覆盖其他文件,只代替原有的nginx.conf
  volumes:
    - name: nginx   #挂载的名称(与volumeMounts一样)
      configMap:
        name: nginx-config    #定义的configmap的名字


#启动
##  kubectl  apply -f test-config.yaml

 进入容器访问可以返回信息

2.2.作为环境变量

(1) 使用valueFrom、configMapKeyRef、name、key指定要用的key:

[root@kube-master kubernetes]# vim test-config.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  containers:
  - name: nginx
    image: 10.36.192.206:8088/library/nginx:1.20.2
    ports:
      - containerPort: 80
    env:         #专门在容器里面设置变量的关键字
      - name: NGINX_LEVEL        #这里的-name,是容器里设置的新变量的名字
        valueFrom:
          configMapKeyRef:
            name: nginx-config     #这里是来源于哪个configMap
            key: nginx.level    #configMap里的key



## kubectl  apply -f test-config.yaml

 (2) 通过envFrom、configMapRef、name使得configmap中的所有key/value对 都自动变成环境变量:(configmap中定义的数据都会自动变成环境变量)

envFrom:
     - configMapRef:
         name: nginx-config

进入容器查看环境变量生效

 三.Downward API

Downward API

用于在容器中获取 POD 的基本信息,kubernetes原生支持。

Downward API提供了两种方式用于将 POD 的信息注入到容器内部:
1.环境变量:用于单个变量,可以将 POD 信息直接注入容器内部。
2.Volume挂载:将 POD 信息生成为文件,直接挂载到容器内部中去。

 1.以环境变量的方式实现

通过Downward API来将 POD 的 IP、名称以及所对应的 namespace 注入到容器的环境变量中去,然后在容器中打印全部的环境变量。

使用fieldRef获取 POD 的基本信息

[root@kube-master kubernetes]# vim downword.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: test-downward
  labels:
    name: test-downward
spec:
  containers:
  - name: test-downward
    image: 10.36.192.206:8088/library/nginx:1.20.2
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
    ports:
      - containerPort: 80
    env:
      - name: POD_NAME    #第一个环境变量的名字
        valueFrom:        #使用valueFrom方式设置
          fieldRef:            #关联一个字段metadata.name    
            fieldPath: metadata.name    #这个字段从当前运行的pod详细信息查看
      - name: POD_NAMESPACE
        valueFrom:
          fieldRef:
            fieldPath: metadata.namespace
      - name: POD_IP
        valueFrom:
          fieldRef:
            fieldPath: status.podIP

注意: POD 的 name 和 namespace 属于元数据,是在 POD 创建之前就已经定下来了的,所以使用 metadata 获取就可以了,但是对于 POD 的 IP 则不一样,因为POD IP 是不固定的,POD 重建了就变了,它属于状态数据,所以使用 status 去获取。

 创建pod

#  kubectl  create  -f downword.yaml
pod/test-downward created

创建成功后进入容器查看环境变量

[root@kube-master ~]# kubectl  exec -it test-downward  /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@test-downward:/# env | grep POD
POD_NAME=test-downward
POD_NAMESPACE=default
POD_IP=10.244.233.251

2.Volume挂载

通过Downward API将 POD 的 Label、等信息通过 Volume 以文件的形式挂载到容器的某个文件中去,然后在容器中打印出该文件的值来验证。

apiVersion: v1
kind: Pod
metadata:
  name: test-downward
  labels:
    name: test-downward
spec:
  containers:
  - name: test-downward
    image: 10.36.192.206:8088/library/nginx:1.20.2
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
    ports:
      - containerPort: 80
    volumeMounts:
      - name: podinfo
        mountPath: /opt/podinfo
  volumes:
    - name: podinfo
      downwardAPI:
        items:
        - path: labels
          fieldRef:
            fieldPath: metadata.labels             

创建pod

#  kubectl  create  -f downword.yaml
pod/test-downward created

进入容器查看数据已经挂在进来。

[root@kube-master ~]# kubectl  exec -it test-downward  /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@test-downward:/# cat /opt/podinfo/labels 
name="test-downward"root@test-downward:/# 

1. 使用 fieldRef 可以声明使用:
spec.nodeName - 宿主机名字
status.hostIP - 宿主机 IP
metadata.name - Pod 的名字
metadata.namespace - Pod 的 Namespace
status.podIP - Pod 的 IP
spec.serviceAccountName - Pod 的 Service Account 的名字
metadata.uid - Pod 的 UID
metadata.labels['<KEY>'] - 指定 <KEY> 的 Label 值
metadata.annotations['<KEY>'] - 指定 <KEY> 的 Annotation 值
metadata.labels - Pod 的所有 Label
metadata.annotations - Pod 的所有 Annotation

基本信息使用 下面方式查看需要什么数据在里面截取。

# kubectl  get pod nginx -o yaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    cni.projectcalico.org/containerID: 079e38db69022ad5436d47df8ffa99f0f624e75a17cf5eb7215ce52253c270b5
    cni.projectcalico.org/podIP: 10.244.9.118/32
    cni.projectcalico.org/podIPs: 10.244.9.118/32
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"labels":{"name":"mysql"},"name":"mysql","namespace":"default"},"spec":{"containers":[{"env":[{"name":"MYSQL_ROOT_PASSWORD","valueFrom":{"secretKeyRef":{"key":"password","name":"mysecret"}}},{"name":"MYSQL_DATABASE","valueFrom":{"secretKeyRef":{"key":"database","name":"mysecret"}}}],"image":"10.36.192.206:8088/library/mysql:5.7","name":"mysql","ports":[{"containerPort":3306}],"resources":{"limits":{"cpu":"1000m","memory":"512Mi"}},"volumeMounts":[{"mountPath":"/opt/aaa","name":"ljh","readOnly":true}]}],"volumes":[{"name":"ljh","secret":{"items":[{"key":"password","path":"aren"}],"secretName":"mysecret"}}]}}
  creationTimestamp: "2023-12-15T12:24:55Z"
  labels:
    name: mysql
  name: mysql
  namespace: default
  resourceVersion: "213151"
  uid: 34802837-648b-41f0-a77a-d59e784ee403
spec:
  containers:
  - env:
    - name: MYSQL_ROOT_PASSWORD
      valueFrom:
        secretKeyRef:
.........
.........

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++相关闲碎记录(16)

1、正则表达式 &#xff08;1&#xff09;regex的匹配和查找接口 #include <regex> #include <iostream> using namespace std;void out (bool b) {cout << ( b ? "found" : "not found") << endl; }int main() {// find XML/H…

0/1背包问题

实验要求 随机生成500个0/1背包问题&#xff08;问题规模可以相对较小&#xff09;&#xff0c;分别使用贪心算法和动态规划进行求解&#xff0c; 要求&#xff1a;1&#xff09;统计贪心算法求得最优值的概率&#xff0c; 2&#xff09;计算比值 3&#xff09;应用贪心算法…

Postman中参数填写方式

Postman中参数填写和请求方法有关&#xff0c;一般接口用例请求方法GET与POST常用&#xff0c;所以主要是这两种请求方法请求参数填写 一、GET请求方法参数填写 1、直接在URL中填写请求参数,如直接在URL中填写&#xff1a; http://www.example.com:8089/userapi?unamelisi&…

直播原理,直播CDN及相关协议

一、直播原理 直播是一对多的完整的视频解编码原理&#xff1a; 那么直播的原理无疑也是要基于视频的解编码原理的 参考视频 二、直播CDN 什么是CDN就不多说了&#xff0c;可参考亚马逊的文章 三、相关协议 RTMP及HTTP-FLV&#xff08;都是在FLV封装格式基础上的&#xf…

串口通信(6)-C#串口通信Modbus协议完整实例

本文讲解C#基于ModbusRTU协议串口通信完整实例。 前言 关于modbus的协议从上一篇中有介绍,本篇不在阐述。 串口通信(5)-C#串口通信数据接收不完整解决方案 创建实例 添加控件和事件等 参考界面文件 namespace ModbusRTUDemo {partial class MainForm{/// <summary>…

go学习redis的学习与使用

文章目录 一、redis的学习与使用1.Redis的基本介绍2.Redis的安装下载安装包即可3.Redis的基本使用1&#xff09;Redis的启动&#xff1a;2&#xff09;Redis的操作的三种方式3&#xff09;说明&#xff1a;Redis安装好后&#xff0c;默认有16个数据库&#xff0c;初始默认使用0…

Toyota Programming Contest 2023#8(AtCoder Beginner Contest 333)

A - Three Threes 题目大意&#xff1a;给你一个整数n&#xff0c;将这个数n输出n次。 呃呃 B - Pentagon 题目大意&#xff1a;给你一个正五边形ABCDE&#xff0c;给你任意两条边&#xff0c;判断是否相等 主要问题要判断一下内边&#xff1a;AD&#xff0c;AC&#xff0c;…

深入探讨敏捷开发项目管理流程与Scrum工具:构建高效团队与卓越产品的秘诀

目录 前言 敏捷开发项目管理流程&#xff1a; 项目启动&#xff1a; Sprint规划&#xff1a; Sprint执行&#xff1a; Sprint评审&#xff1a; 回顾与持续改进&#xff1a; Scrum 工具&#xff1a; Jira&#xff1a; Trello&#xff1a; VersionOne&#xff1a; Con…

重要通知!中国电信警告:用户须关闭路由器“双频合一”功能

在网络的无尽时空里&#xff0c;一场电信官方的宣战正酝酿中&#xff0c;目标锁定在我们日常生活中不可或缺的WiFi身上~ 最新消息曝光&#xff0c;竟然是路由器内藏的一个名为“双频合一”的功能引发了这场轰轰烈烈的网络风暴。 我们时常觉得WiFi就像是隐身在我们生活中的超级英…

算法模板之单链表图文讲解

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;算法模板、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️使用数组模拟单链表讲解1.1 &#x1f514;为什么我们要使用数组去模拟单链表…

全国职业院校技能大赛“大数据应用开发”赛项说明

1、赛项介绍 &#xff08;1&#xff09;赛项名称 全 国 职 业 院 校 技 能 大 赛 “大数据应用开发” 赛 项 https://www.vcsc.org.cn/ 大赛组织机构介绍 全国职业院校技能大赛(以下简称大赛)是教育部发起并牵头&#xff…

关于反射机制的简单理解

1、反射的简单认识 1.1 定义 Java的反射&#xff08;reflection&#xff09;机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff0c;既然能拿到,那么我…

低代码开发入局,同飞股份应用云表自主开发MES管理系统

近日&#xff0c;为了贯彻落实《“十四五”智能制造发展规划》&#xff0c;推动中国从制造大国向制造强国转变&#xff0c;工业和信息化部发布了2023年度“智能制造优秀场景”名单。经过省级有关部门和中央企业的推荐、专家评审、网上公示等程序&#xff0c;同飞股份凭借其“先…

Spring boot basePackages 通配符* 找不到Bean

Spring boot basePackages 通配符* 找不到Bean 今天遇到了一个关于spring boot 组件ComponentScan 中basePackages 使用通配符* 找不到Bean的问题 目录结构中BussinessPerson与Dog类中都有标注有Component注解&#xff0c;结果扫描不到。 然后删除通配符&#xff0c;结果运行成…

leetcode砍竹子1

现需要将一根长为正整数 bamboo_len 的竹子砍为若干段&#xff0c;每段长度均为正整数。请返回每段竹子长度的最大乘积是多少。 1.根据公式看出取等是在所有n相等的情况&#xff0c;可以得出只有均分 乘积最大 2.转为求下面的最大值 3.求导&#xff0c;得出驻点为e2.7左右 …

HPM6750系列--第九篇 GPIO详解(基本操作)

一、目的 在之前的博文中我们主要介绍了不同系统不同开发编译调试环境的配置和操作&#xff08;命令行方式、Visual Studio Code、Segger Embedded Studio for RISC-V&#xff09;&#xff0c;以帮助大家准备好学习环境为目的&#xff0c;但是未涉及到芯片本身以及外设的讲解。…

Linux——进程中被打开的文件

C语言中有着许多对文件操作的函数&#xff0c;包括其他语言也有&#xff0c;但是从语言来了解文件有点浅显计算机的一切都离不开操作系统&#xff0c;那么文件跟操作系统也有着密切的关系&#xff0c;所以我们从系统层面来了解文件&#xff08;在进程中打开的文件&#xff09;文…

openGauss学习笔记-162 openGauss 数据库运维-备份与恢复-导入数据-通过INSERT语句直接写入数据

文章目录 openGauss学习笔记-162 openGauss 数据库运维-备份与恢复-导入数据-通过INSERT语句直接写入数据162.1 使用openGauss数据库提供的客户端工具向openGauss数据库写入数据162.2 通过JDBC/ODBC驱动连接数据库执行INSERT语句向openGauss数据库写入数据162.2.1 函数原型162.…

在Node.js中MongoDB排序的方法

本文主要介绍在Node.js中MongoDB排序的方法。 目录 Node.js中MongoDB排序使用原生的mongodb驱动程序进行排序使用Mongoose库中的排序 Node.js中MongoDB排序 在Node.js中使用MongoDB进行排序&#xff0c;可以使用原生的mongodb驱动程序或者Mongoose库。 使用原生的mongodb驱动…

SpringBoot之响应的详细解析

2. 响应 前面我们学习过HTTL协议的交互方式&#xff1a;请求响应模式&#xff08;有请求就有响应&#xff09; 那么Controller程序呢&#xff0c;除了接收请求外&#xff0c;还可以进行响应。 2.1 ResponseBody 在我们前面所编写的controller方法中&#xff0c;都已经设置了…