Kubernetes中的cm存储

news2024/11/24 4:21:23

华子目录

  • 1.`configmap`
    • 1.1`configmap`功能
    • 1.2`configmap`应用场景
    • 1.3`configmap`的使用场景
    • 1.4configmap创建方式
      • 1.4.1键值对创建
      • 1.4.2通过文件创建
      • 1.4.3通过`目录`创建
      • 1.4.4通过`yaml`文件创建
    • 1.5configmap的应用示例
      • 1.5.1使用cm填充环境变量
      • 1.5.2通过数据卷使用configmap
      • 1.5.3利用`configmap`填充`pod中容器的配置文件`

1.configmap

1.1configmap功能

  • configmap用于保存配置数据,以键值对形式存储
  • configmap资源提供了向pod注入配置数据的方法,让pod在运行的时候能够识别configmap资源
  • 镜像配置文件可以不在同一个主机上,以便实现镜像可移植性可复用性
  • etcd中记录了configmap状态限制了configmap文件大小不能超过1M
  • configmap资源中的数据明文

1.2configmap应用场景

比如我们需要运行一个nginx服务器,但是nginx镜像中的配置文件不能适用于所有生产场景,经常需要我们自建配置文件。但是在k8s环境中,我们不能保证运行nginx容器pod和我们自建配置文件同一个主机上,同时我们在运行pod的时候,也不会因为自建的配置文件在哪个主机上,就让pod哪台主机上运行。所以我们要把自建的配置文件放到k8s集群中,并且每次启动pod的时候,能够让pod自动去加载这些东西,换句话说就是把我们自建的配置文件变成k8s中的资源每个pod(不管在哪个node节点上)在运行的时候都可以对这些资源进行使用。这个时候就要使用configmap

1.3configmap的使用场景

  • 填充环境变量
  • 设置容器内命令行参数
  • 填充卷配置文件

1.4configmap创建方式

  • configmap简称cm
[root@k8s-master ~]# mkdir configmap
[root@k8s-master ~]# cd configmap/

#kube-root-ca.crt是k8s自带的configmap资源,用来对所有运行的pod进行身份认证
[root@k8s-master configmap]# kubectl get configmaps
NAME               DATA   AGE
kube-root-ca.crt   1      28d

比如这里我们运行一个简单的pod,观察一下

[root@k8s-master configmap]# kubectl run testpod --image myapp:v1
pod/testpod created
[root@k8s-master configmap]# kubectl describe pods testpod

在这里插入图片描述
我们可以看到testpod这个podConfigMapNamekube-root-ca.crt

[root@k8s-master configmap]# kubectl delete pods testpod
pod "testpod" deleted

1.4.1键值对创建

  • 通过--from-literal指定键值对
#创建一个名为userlist的configmap
[root@k8s-master configmap]# kubectl create configmap userlist --from-literal name=huazi --from-literal age=22
configmap/userlist created
[root@k8s-master configmap]# kubectl get configmaps
NAME               DATA   AGE
kube-root-ca.crt   1      28d
userlist           2      103s

#我们可以看到创建的键值对
[root@k8s-master configmap]# kubectl describe configmaps userlist
Name:         userlist
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
age:
----
22
name:
----
huazi

BinaryData
====

Events:  <none>

在这里插入图片描述

1.4.2通过文件创建

  • 通过--from-file指定文件名
#我们首先看一下/etc/hosts这个文件中的内容
[root@k8s-master configmap]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.100   k8s-master.org
172.25.254.10    k8s-node1.org
172.25.254.20    k8s-node2.org
172.25.254.250   harbor.huazi.org
172.25.254.50    www.huazi.com   myappv1.huazi.com    myappv2.huazi.com
#创建一个名为host的configmap资源
[root@k8s-master configmap]# kubectl create configmap host --from-file /etc/hosts
configmap/host created
[root@k8s-master configmap]# kubectl get configmaps
NAME               DATA   AGE
host               1      86s
kube-root-ca.crt   1      28d
userlist           2      7m40s

[root@k8s-master configmap]# kubectl get configmaps host
NAME   DATA   AGE
host   1      106s

[root@k8s-master configmap]# kubectl describe configmaps host
Name:         host
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
hosts:
----
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.100   k8s-master.org
172.25.254.10    k8s-node1.org
172.25.254.20    k8s-node2.org
172.25.254.250   harbor.huazi.org
172.25.254.50    www.huazi.com   myappv1.huazi.com    myappv2.huazi.com


BinaryData
====

Events:  <none>

我们可以发现通过文件创建的configmap资源文件名文件内容
在这里插入图片描述

1.4.3通过目录创建

  • 通过--from-file指定目录
[root@k8s-master configmap]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.100   k8s-master.org
172.25.254.10    k8s-node1.org
172.25.254.20    k8s-node2.org
172.25.254.250   harbor.huazi.org
172.25.254.50    www.huazi.com   myappv1.huazi.com    myappv2.huazi.com
[root@k8s-master configmap]# cat /etc/resolv.conf
# Generated by NetworkManager
search org
nameserver 114.114.114.114

#创建一个目录,将/etc/hosts和/etc/resolv.conf文件复制到这个目录下
[root@k8s-master configmap]# mkdir testdir
[root@k8s-master configmap]# cp /etc/hosts  testdir/
[root@k8s-master configmap]# cp /etc/resolv.conf  testdir/
[root@k8s-master configmap]# ls testdir/
hosts  resolv.conf
#创建一个名为test的configmap资源
[root@k8s-master configmap]# kubectl create cm test --from-file testdir/
configmap/test created
[root@k8s-master configmap]# kubectl get cm
NAME               DATA   AGE
host               1      13m
kube-root-ca.crt   1      28d
test               2      81s
userlist           2      19m

[root@k8s-master configmap]# kubectl get cm test
NAME   DATA   AGE
test   2      118s


[root@k8s-master configmap]# kubectl describe cm test
Name:         test
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
hosts:
----
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.100   k8s-master.org
172.25.254.10    k8s-node1.org
172.25.254.20    k8s-node2.org
172.25.254.250   harbor.huazi.org
172.25.254.50    www.huazi.com   myappv1.huazi.com    myappv2.huazi.com

resolv.conf:
----
# Generated by NetworkManager
search org
nameserver 114.114.114.114


BinaryData
====

Events:  <none>

在这里插入图片描述
我们发现通过目录创建文件创建升级版目录中可以存放多个文件文件名文件内容

1.4.4通过yaml文件创建

#创建一个名为dict的configmap资源,通过--from-literal指定它的键值对
[root@k8s-master configmap]# kubectl create configmap dict --from-literal db_host="172.25.254.100" --from-literal db_port="3306" -o yaml > db.yml

[root@k8s-master configmap]# vim db.yml
[root@k8s-master configmap]# cat db.yml
apiVersion: v1   #Kubernetes API版本是v1
data:    #ConfigMap中存储的实际数据。这些数据是以键值对的形式存储的。
  db_host: 172.25.254.100
  db_port: "3306"
kind: ConfigMap   #资源对象的类型是ConfigMap
metadata:   #ConfigMap的元数据
  name: dict   #configmap的名字
[root@k8s-master configmap]# kubectl apply -f db.yml
configmap/dict configured

[root@k8s-master configmap]# kubectl describe cm dict
Name:         dict
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
db_host:
----
172.25.254.100
db_port:
----
3306

BinaryData
====

Events:  <none>

1.5configmap的应用示例

  • 通过环境变量的方式直接传递给pod
  • 通过pod的命令行运行方式
  • 作为volume方式挂载到pod

1.5.1使用cm填充环境变量

[root@k8s-master configmap]# cat db.yml
apiVersion: v1
data:
  db_host: 172.25.254.100
  db_port: "3306"
kind: ConfigMap
metadata:
  name: dict

[root@k8s-master configmap]# kubectl apply -f db.yml
#查看创建名为dict的configmap资源
[root@k8s-master configmap]# kubectl describe cm dict
Name:         dict
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
db_port:
----
3306
db_host:
----
172.25.254.100

BinaryData
====

Events:  <none>
  • 将名为dictcm资源中的内容映射为指定的变量
#创建一个名为testpod的自主式pod
[root@k8s-master configmap]# vim pod1.yml
[root@k8s-master configmap]# cat pod1.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  containers:
    - image: busyboxplus
      name: busyboxplus
      command: ["/bin/sh","-c","env"]  #容器启动时执行的命令,这里使用/bin/sh执行env命令,用于打印环境变量。
      env:    #定义了容器内的环境变量
      - name: key1    #环境变量的名字
        valueFrom:   #指定了环境变量的值来源
          configMapKeyRef:   #表示环境变量的值是从一个ConfigMap中获取的
            name: dict   #ConfigMap的名称为dict
            key: db_host   #在指定的ConfigMap中,db_host键对应的值将被用作环境变量key1的值
      - name: key2   #环境变量的名字
        valueFrom:    #指定了环境变量的值来源
          configMapKeyRef:    #表示环境变量的值是从一个ConfigMap中获取的
            name: dict    #ConfigMap的名称为dict
            key: db_port   #在指定的ConfigMap中,db_host键对应的值将被用作环境变量key1的值
  restartPolicy: Never     #pod的启动规则
[root@k8s-master configmap]# kubectl apply -f pod1.yml
pod/testpod created
[root@k8s-master configmap]# kubectl get pods testpod
NAME      READY   STATUS      RESTARTS   AGE
testpod   0/1     Completed   0          22s

[root@k8s-master configmap]# kubectl logs pods/testpod
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=testpod
SHLVL=1
HOME=/
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
key1=172.25.254.100    #我们发现了创建的key1变量
key2=3306        #我们发现了创建的key2变量
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
PWD=/
KUBERNETES_SERVICE_HOST=10.96.0.1
#回收pod1.yml
[root@k8s-master configmap]# kubectl delete -f pod1.yml
pod "testpod" deleted
  • 将名为dictcm资源中的内容直接映射为变量
[root@k8s-master configmap]# vim pod2.yml
[root@k8s-master configmap]# cat pod2.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  containers:
  - image: busyboxplus
    name: busyboxplus
    command: ["/bin/sh","-c","env"]   #容器启动时执行的命令,这里使用/bin/sh执行env命令,用于打印环境变量。
    envFrom:    #这是一个列表,用于指定一个或多个ConfigMap或Secret,它们的内容将被作为环境变量直接导入到Pod的容器中。
    - configMapRef:   #环境变量的来源是一个ConfigMap
        name: dict   #ConfigMap的名称为dict。这意味着Kubernetes将查找名为dict的ConfigMap
  restartPolicy: Never
[root@k8s-master configmap]# kubectl apply -f pod2.yml
pod/testpod created

[root@k8s-master configmap]# kubectl logs pods/testpod
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=testpod
SHLVL=1
HOME=/
db_port=3306    #我们可以发现直接映射为了变量
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
PWD=/
KUBERNETES_SERVICE_HOST=10.96.0.1
db_host=172.25.254.100   #我们发现直接映射为了变量
#回收
[root@k8s-master configmap]# kubectl delete -f pod2.yml
pod "testpod" deleted
  • command中直接使用变量
#创建名为testpod的自主式pod
[root@k8s-master configmap]# vim pod3.yml
[root@k8s-master configmap]# cat pod3.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  containers:
  - image: busyboxplus
    name: busyboxplus
    command: ["/bin/sh","-c","echo ${db_host} ${db_port}"]
    envFrom:    ##这是一个列表,用于指定一个或多个ConfigMap或Secret,它们的内容将被作为环境变量直接导入到Pod的容器中。
    - configMapRef:   ##环境变量的来源是一个ConfigMap
        name: dict   #ConfigMap的名称为dict。这意味着Kubernetes将查找名为dict的ConfigMap
  restartPolicy: Never
[root@k8s-master configmap]# kubectl apply -f pod3.yml
pod/testpod created
[root@k8s-master configmap]# kubectl logs pods/testpod
172.25.254.100 3306
#我们发现使用到了dict中的db_host和db_port
#回收
[root@k8s-master configmap]# kubectl delete -f pod3.yml
pod "testpod" deleted

1.5.2通过数据卷使用configmap

#创建一个名为testpod的自主式pod
[root@k8s-master configmap]# vim pod4.yml
[root@k8s-master configmap]# cat pod4.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  containers:
  - image: busyboxplus
    name: busyboxplus
    command: ["/bin/sh","-c","sleep 10000"]
    volumeMounts:   #这是一个列表,定义了Pod中容器要挂载的卷。
    - name: config-volume   #指定了要挂载的卷的名称,这个名称必须与volumes列表中定义的某个卷的名称相匹配。
      mountPath: /config/   #卷在容器内的挂载路径。这意味着ConfigMap dict中的数据将被挂载到容器内的/config/目录下。
  volumes:  #这是一个列表,定义了Pod中可以使用的卷
  - name: config-volume   #定义了卷的名称,这个名称将在volumeMounts中被引用
    configMap:   #表示这个卷是由一个ConfigMap支持的。
      name: dict   #指定了ConfigMap的名称为dict。这意味着Kubernetes将查找名为dict的ConfigMap,并将其内容挂载到Pod中容器的指定路径下。
  restartPolicy: Never
[root@k8s-master configmap]# kubectl apply -f pod4.yml
pod/testpod created
[root@k8s-master configmap]# kubectl describe pods testpod

在这里插入图片描述

[root@k8s-master configmap]# kubectl exec -it pods/testpod -- /bin/sh
/ # ls
bin      dev      home     lib64    media    opt      root     sbin     tmp      var
config   etc      lib      linuxrc  mnt      proc     run      sys      usr
/ # cd config/
/config # ls
db_host  db_port
/config # cat db_host
172.25.254.100
/config # cat db_port
3306

我们发现:cmdictdb_host和db_port两个变成了pod中容器里文件名变成了文件内容

#回收
[root@k8s-master configmap]# kubectl delete -f pod4.yml
pod "testpod" deleted

1.5.3利用configmap填充pod中容器的配置文件

  • 自建nginx.conf配置文件
[root@k8s-master configmap]# vim nginx.conf
[root@k8s-master configmap]# cat nginx.conf
server {
        listen 8000;
        server_name _;
        root /usr/share/nginx/html;
        index index.html;
}
  • 利用nginx.conf模板生成cm资源
  • 使用参数--from-file
#创建名为nginx-conf的cm资源
[root@k8s-master configmap]# kubectl create configmap nginx-conf --from-file nginx.conf
configmap/nginx-conf created
#我们发现文件名为键,文件内容为值
[root@k8s-master configmap]# kubectl describe cm nginx-conf
Name:         nginx-conf
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
nginx.conf:
----
server {
  listen 8000;
  server_name _;
  root /usr/share/nginx/html;
  index index.html;
}


BinaryData
====

Events:  <none>
#创建名为deployment的deployment控制器,控制器中运行一个pod,pod中运行一个myapp的镜像
[root@k8s-master configmap]# kubectl create deployment deployment1 --image myapp:v1 --dry-run=client -o yaml > deployment1.yml


[root@k8s-master configmap]# vim deployment1.yml
[root@k8s-master configmap]# cat deployment1.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: deployment1
  name: deployment1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: deployment1
  template:
    metadata:
      labels:
        app: deployment1
    spec:
      containers:
      - image: myapp:v1
        name: myappv1
        volumeMounts:   #这是一个列表,定义了Pod中容器要挂载的卷。
        - name: config-volume   #指定了要挂载的卷的名称,这个名称必须与volumes列表中定义的某个卷的名称相匹配。
          mountPath: /etc/nginx/conf.d/   #卷在容器内的挂载路径。这意味着ConfigMap nginx-conf中的数据将被挂载到容器内的/etc/nginx/conf.d/目录下
      volumes:   #这是一个列表,定义了Pod中可以使用的卷
        - name: config-volume  #定义了卷的名称,这个名称将在volumeMounts中被引用
          configMap:  #表示这个卷是由一个ConfigMap支持的。
            name: nginx-conf  #指定了ConfigMap的名称为nginx-conf。这意味着Kubernetes将查找名为nginx-conf的ConfigMap资源,并将其内容挂载到Pod中容器的指定路径下。
[root@k8s-master configmap]# kubectl apply -f deployment1.yml
deployment.apps/deployment1 created


[root@k8s-master configmap]# kubectl get pods -o wide
NAME                           READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
deployment1-5cc776ddcb-lxd55   1/1     Running   0          21s   10.244.2.24   k8s-node2.org   <none>           <none>

因为我们通过cm改了nginx.conf中的端口,现在端口监听8000

#访问80端口失败
[root@k8s-master configmap]# curl 10.244.2.24
curl: (7) Failed to connect to 10.244.2.24 port 80: 拒绝连接

#访问8000端口成功
[root@k8s-master configmap]# curl 10.244.2.24:8000
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@k8s-master configmap]# kubectl edit cm nginx-conf
#退出编辑自动保存

在这里插入图片描述

[root@k8s-master configmap]# kubectl get pods -o wide
NAME                           READY   STATUS    RESTARTS   AGE     IP            NODE            NOMINATED NODE   READINESS GATES
deployment1-5cc776ddcb-lxd55   1/1     Running   0          9m29s   10.244.2.24   k8s-node2.org   <none>           <none>

#查看pod容器中的配置文件,发现监听的端口确实修改了
[root@k8s-master configmap]# kubectl exec pods/deployment1-5cc776ddcb-lxd55 -- cat /etc/nginx/conf.d/nginx.conf
server {
        listen 80;
        server_name _;
        root /usr/share/nginx/html;
        index index.html;
}

#但是还是要重启pod中的容器才能得到应用
[root@k8s-master configmap]# curl 10.244.2.24
curl: (7) Failed to connect to 10.244.2.24 port 80: 拒绝连接
#删掉这个pod,deployment控制器会再起一个
[root@k8s-master configmap]# kubectl delete pods deployment1-5cc776ddcb-lxd55
pod "deployment1-5cc776ddcb-lxd55" deleted


[root@k8s-master configmap]# kubectl get pods -o wide
NAME                           READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
deployment1-5cc776ddcb-hbhx2   1/1     Running   0          20s   10.244.2.25   k8s-node2.org   <none>           <none>
#重新起一个pod后,修改的配置才得到了应用
[root@k8s-master configmap]# curl 10.244.2.25:80
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

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

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

相关文章

tauri开发中如果取消了默认的菜单项,复制黏贴撤销等功能也就没有了,解决办法

取消默认的菜单项&#xff1a;清除tauri默认的菜单项&#xff0c;让顶部的菜单menu不显示-CSDN博客 就是通过配置空菜单&#xff0c;让菜单不显示&#xff0c;但是这个引发的问题就是复制黏贴撤销等功能也就没有了&#xff0c;解决办法&#xff1a; 新增加编辑下的子菜单&…

【SpringCloud详细教程】-01-一文了解微服务

精品专题&#xff1a; 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12789841.html?spm1001.20…

Redis数据结构:List类型全面解析

文章目录 一、List数据类型1.1 简介1.2 应用场景1.3 底层结构 二、数据结构2.1 压缩列表ZipList2.2 双向链表LinkedList&#xff08;后续已废弃&#xff09;2.3 快速链表QuickList 三、List常见命令 一、List数据类型 1.1 简介 详细介绍&#xff1a;Redis五种数据类型、Strin…

kafka相关面试题

文章目录 什么是消息中间件&#xff1f;kafka 是什么&#xff1f;有什么作用&#xff1f;kafka 的架构是怎么样的&#xff1f;Kafka Replicas是怎么管理的&#xff1f;如何确定当前能读到哪一条消息&#xff1f;生产者发送消息有哪些模式&#xff1f;发送消息的分区策略有哪些&…

异步回调之Join

join:异步阻塞之闷葫芦 阻塞模式实现泡茶实例首先从基础的多线程join合并实验入手.join操作的原理是阻塞当前线程,直到待合并的目标线程执行完成. 线程的合并流程 Java中线程的合并流程是:假设线程A调用线程B的join()方法去合并B线程,那么线程A进入阻塞状态,直到线程B执行完…

光耦合器的关键作用和创新---腾恩科技

光耦合器或光隔离器已成为电路中必不可少的器件&#xff0c;它允许信号在无需直接电接触的情况下跨不同电压域传输。这种隔离能力对于保护低压元件免受高压电路的潜在损坏至关重要。本文将仔细研究光耦合器在当今技术中发挥的独特作用&#xff0c;并探讨其在各种应用中不断扩展…

“揭开Ajax:实现无缝客户端与服务器通信的秘密”

一、概述 &#xff08;一&#xff09;概念&#xff1a; 1.概念&#xff1a; Ajax是一种web应用技术&#xff0c;可以借助客户端脚本与服务器端应用进行异步通讯&#xff0c;获取服务器数据以后&#xff0c;进行局部刷新进而提高数据响应和渲染速度。 2.开发基础&#xff1a…

自定义日志打成jar包引入项目后不生效

背景&#xff1a;写了一个请求响应日志包&#xff0c;打包后在另一个项目使用pom引入后不生效 package com.example.qqllog.aspect;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean;…

Java基于微信小程序的美食推荐系统(附源码,文档)

博主介绍&#xff1a;✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

HTML 基础标签——文本内容标签 <ul>、<ol>、<blockquote> 、<code> 等标签的用法详解

文章目录 1. 标题标签2. 段落标签3. 文本格式化标签4. 列表标签4.1 无序列表 `<ul>`4.2 有序列表 `<ol>`5. 引用标签5.1 块引用 `<blockquote>`5.2 行内引用 `<q>`5.3 作品引用 `<cite>`6. 代码和预格式文本标签6.1 代码标签 `<code>`6.2 …

一文读懂曲线调色原理

文章目录 1. 光学三原色2. 印刷三原色3. 互补关系4. 颜色混合结果5. 如何应用6. 总结 1. 光学三原色 红、绿、蓝三个颜色组成光学三原色&#xff0c;当他们三个颜色等量混合的时候就会变成白色&#xff0c;而白色代表亮&#xff0c;所以也称为加色模式。 2. 印刷三原色 青、品、…

sql专场练习(一)(最后五题 21-25)

第21题&#xff1a;找出恶意购买用户 create table sql1_21(order_id int,user_id string,order_status string,operate_time string ) row format serde org.apache.hadoop.hive.serde2.RegexSerDe with serdeproperties(input.regex(\\d)\\s(.?)\\s(.?)\\s(.?) ); load d…

如何在Linux命令行中使用GhatGPT

2、验明正身&#xff0c;证明我的所在地是国内 3、第一次提问 4、第二次提问 5、问他一首古诗 6、话不多说&#xff0c;现在来展示他的安装过程 7、输入GitHub的网址 https://github.com/aandrew-me/tgpt 8、详情页向下翻 9、到终端输入 下列命令&#xff0c;等待安装&#x…

2024年最新:阿里内部流传的大模型(LLM)面试真题

随着人工智能技术的迅猛发展&#xff0c;计算机视觉&#xff08;CV&#xff09;、自然语言处理&#xff08;NLP&#xff09;、搜索、推荐、广告推送和风险控制等领域的岗位越来越受欢迎&#xff0c;而_对于大型模型技术的掌握成为了这些岗位的标配_。 但目前公开的大模型资源还…

Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList

文章目录 一、Redis数据结构概述1.1 Redis有哪些数据类型1.2 Redis本质是哈希表1.3 Redis的哈希冲突与渐进式rehash1.4 数据结构底层1.4.1 简单动态字符串SDS1.4.2 双向链表&#xff08;后续已废弃&#xff09;1.4.3 压缩列表ZipList1.4.4 哈希表HashTable1.4.5 跳表SkipList1.…

【STM32】INA3221三通道电压电流采集模块,HAL库

一、简单介绍 芯片的datasheet地址&#xff1a; INA3221 三通道、高侧测量、分流和总线电压监视器&#xff0c;具有兼容 I2C 和 SMBUS 的接口 datasheet (Rev. B) 笔者所使用的INA3221是淘宝买的模块 原理图 模块的三个通道的电压都是一样&#xff0c;都是POWER。这个芯片采用…

C语言之写一个修改数组内容的函数

问题代码: 函数ltrim是为了消除buf字符数组中左边空格&#xff0c; memmove函数介绍 如果对c语言指针运用非常熟练的人,结合函数功能就会发现这个代码非常的傻逼&#xff0c;你会发现为什么需要返回&#xff0c;buf不用接收返回值&#xff0c;执行这个函数后buf中的内容就已经…

StandardThreadExecutor源码解读与使用(tomcat的线程池实现类)

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java源码解读-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 目录 1.前言 2.线程池基础知识回顾 2.1.线程池的组成 2.2.工作流程 2…

解决pytorch问题:received an invalid combination of arguments - got

问题表现 今天跑模型时报了一个非常奇怪的错误&#xff1a; 意思是“你的lstm层输入的参数是无效的&#xff0c;要求接收参数的类型是(Tensor, tuple of (Tensor, Tensor), list of [Parameter, Parameter, Parameter, Parameter], float, int, float, bool, bool, bool)&am…

Springboot与easypoi(2):合并单元格、二级表头、动态导出

一、纵向合并单元格 使用Excel(needMerge true)标记的属性表示此单元格需要合并。ExcelCollection表示一对多的集合&#xff0c;下面是合并单元格案例。 实体类 企业类&#xff1a; package com.ywz.entity;import cn.afterturn.easypoi.excel.annotation.Excel; import cn.…