Pod资源-持久化-网络暴露-env

news2024/11/16 12:02:16

一.资源清单

资源清单组成

apiVersion:v1    #对应不同的k8s版本中的api;
kind:Pod            #资源的名称(service、ConfigMap、hpa.....)
metadata:          #声明资源的元数据信息(资源的名称)
spec:                 #使用者期望的运行状态;
--- 代表同一个yaml文件中,多个资源

资源示例

编写资源清单

[root@master pod]# cat 01-pod-nginx.yaml 
apiVersion: v1
kind: Pod
metadata: 
  name: m-nginx
spec:
  containers:
    - name: c-nginx
      image: nginx:1.20.1-alpine

创建资源

可以使用create或者apply这两种方式创建

kubectl  apply -f  资源清单
kubectl  create -f 资源清单
[root@master pod]# kubectl apply -f 01-pod-nginx.yaml 

create与apply的区别:

        create创建的资源属于固定的资源,后期若想修改只能先delete删除资源,再create创建资源

        apply是一种实时更新的创建资源的方式,后期修改完配置文件后,再apply即可。这里若是apply未生效,需要先delete删除资源,再apply -f创建资源

查看资源

[root@master pod]# kubectl get pods -o wide

这里若发现状态不是running,describe查看pod的详细信息

模拟报错使用describe

故意写错镜像的标签,模拟创建pod的ststus不是running的错误

[root@master pod]# cat 01-pod-nginx.yaml 
apiVersion: v1
kind: Pod
metadata: 
  name: m-nginx
  labels:
    wangshuyuan: wsy
    wsy: wangshuyuan
spec:
  restartPolicy: Always
  containers:
    - name: c-nginx
      image: nginxL:1.20.1-alpine
      imagePullPolicy: IfNotPresent

创建资源

[root@master pod]# kubectl apply -f 01-pod-nginx.yaml 
pod/m-nginx created

查看pod,发现pod的ststus不是running

[root@master pod]# kubectl get pods -o wide

查看创建pod的详情,在events下有具体的报错信息:

[root@master pod]# kubectl describe pod m-nginx 

根据错误提示修改资源清单即可

排查问题步骤
1.发现错误报错

kubectl  get  资源类型   资源名   # 发现不是running;

2.查看资源的详细信息

kubectl  describe  资源类型  资源名  

3.找到问题所在Events字段下的创建过程信息

4.根据问题所在的原因,解决问题

--------------------------------------------------------------------
若describe资源没有发现任何问题,或者其他位置原因,可以先检查集群的节点状态
[root@master pod]# kubectl get nodes 
NAME      STATUS   ROLES                  AGE   VERSION
master    Ready    control-plane,master   8d    v1.23.17
worker1   Ready    <none>                 8d    v1.23.17
worker2   Ready    <none>                 8d    v1.23.17

二 .pod

pod概述 

        pod是kubernets中最小的管理管理单位;pod就是一组容器,一个pod中可以有1个或者多个容器;其他资源都是为pod资源提供服务的

pod持久化

1.emptyDir(不推荐使用)

         emptyDir存储卷,本质上是一个临时的目录,其生命周期与pod相同,pod被删除,则数据也会被删除

官方解释:
    对于定义了 emptyDir 卷的 Pod,在 Pod 被指派到某节点时此卷会被创建。 就像其名称所表示的那样,emptyDir 卷最初是空的。尽管 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,但这些容器都可以读写 emptyDir 卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会被永久删除。      

emptyDir 的一些用途:

         缓存空间,例如基于磁盘的归并排序。
        为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
        在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。

emptyDir存储卷的特点:

        容器挂掉,数据不会丢失

        pod挂掉,数据丢失

1.编写pod资源清单
[root@master demo]# cat 01-nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-demo
spec:
  containers:
  - name: c-demo
    image: nginx:1.20.1-alpine
2.创建并查看pod资源
[root@master demo]# kubectl apply -f 01-nginx.yaml 
pod/nginx-demo created
[root@master demo]# kubectl get pods -o wide
NAME         READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
nginx-demo   1/1     Running   0          15s   10.100.2.30   worker2   <none>           <none>
3.pod中nginx写入静态文件模拟访问
[root@master demo]# kubectl exec nginx-demo -it -- sh
/ # cd /usr/share/nginx/html
/usr/share/nginx/html # echo demo > index.html
/usr/share/nginx/html # exit
[root@master demo]# curl 10.100.2.30
demo
 4.模拟容器挂掉

        容器挂掉重新加载就没了

        通过查看pod详情找到pod挂载的节点(NODE),在对应的节点上删除容器

[root@worker2 ~]# docker ps |grep "c-demo"
a4adf2bdad09   7f18bdc92ca5                                        "/docker-entrypoint.…"   5 minutes ago   Up 5 minutes             k8s_c-demo_nginx-demo_default_94b28a9e-cbec-4be3-a00d-da00baeee4cc_0

[root@worker2 ~]# docker rm -f a4adf2bdad09
a4adf2bdad09
5.再次模拟访问
[root@master demo]# curl 10.100.2.30
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    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>
6.重新编辑pod清单挂载存储卷(emptyDir)
[root@master demo]# cat 01-nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-demo
spec:
  #声明存储卷
  volumes:
  - name: demo-dir
    #声明存储卷类型-emptyDir
    emptyDir: {}
  
  containers:
  - name: c-demo
    image: nginx:1.20.1-alpine
    #容器挂载存储卷
    volumeMounts:
    #挂载存储卷的名称
    - name: demo-dir
    # 指定挂载的目录
      mountPath: /usr/share/nginx/html/
7.创建并查看pod
[root@master demo]# kubectl apply -f 01-nginx.yaml 
pod/nginx-demo created
[root@master demo]# kubectl get pods -o wide
NAME         READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
nginx-demo   1/1     Running   0          93s   10.100.2.31   worker2   <none>           <none>
8.进入容器挂载目录下写一个静态文件
[root@master demo]# kubectl exec nginx-demo -it -- sh
/ # cd usr/share/nginx/html/
/usr/share/nginx/html # echo demoetest > index.html
/usr/share/nginx/html # exit
9.模拟容器挂掉
[root@worker2 ~]# docker ps |grep "c-demo"
8f90c58f0914   7f18bdc92ca5                                        "/docker-entrypoint.…"   About a minute ago   Up About a minute             k8s_c-demo_nginx-demo_default_80e6bc07-eb59-4acf-a06c-d60b2b8c2d20_0
[root@worker2 ~]# docker rm -f 8f90c58f0914
8f90c58f0914
10.待容器自动拉起后,再次模拟访问
[root@master demo]# curl 10.100.2.31
demoetest

发现数据未丢失,说明存储卷挂在成功,实现了pod内容器的持久化

---当删除pod后数据还存在吗?

        不存在,上面emptyDir的概述说了,pod挂掉,数据也会丢失

hostPath

        hostpath存储卷:将物理机节点的目录挂载到pod中,pod意外宕机,或者被误删时,数据不会丢失,可以实现同一个pod中不同容器之间数据共享,同一个人worker节点不同pod之间数据共享;不同worker节点的pod无法共享数据

1.编写pod资源清单,挂载hostpath存储卷
[root@master demo]# cat 02-pod-hostpath.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: demo01
spec:
  #指定pod创建在哪个worker节点中
  nodeName: worker1
  volumes:
  - name: hp-01
    #声明存储卷类型是hostPath;物理机节点目录挂载
    hostPath:
      #指定hostPath的路径(物理机挂载路径)
      path: /data/pod-volumes
  containers:
  - name: demo-v1
    image: nginx:1.20.1-alpine
    volumeMounts:
    - name: hp-01
      mountPath: /usr/share/nginx/html/  
2.创建并查看pod资源
[root@master demo]# kubectl apply -f 02-pod-hostpath.yaml 
pod/demo01 created
[root@master demo]# kubectl get pods -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
demo01   1/1     Running   0          80s   10.100.1.22   worker1   <none>           <none>
3.worker1节点创建挂载目录并写入静态文件
[root@worker1 data]# mkdir -p /data/pod-volumes
[root@worker1 data]# echo demotest > /data/pod-volumes/index.html

4.模拟访问
[root@master demo]# curl 10.100.1.22
demotest
5.模拟删除pod后看数据是否会丢失
[root@master demo]# kubectl delete pods demo01 
pod "demo01" deleted
[root@master demo]# kubectl apply -f 02-pod-hostpath.yaml 
pod/demo01 created
[root@master demo]# kubectl get pods -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
demo01   1/1     Running   0          14s   10.100.1.23   worker1   <none>           <none>
[root@master demo]# curl 10.100.1.23
demotest

持久化成功

NFS存储卷

1.所有节点先安装nfs,存储节点配置nfs
yum -y install nfs-utils
2.存储节点创建共享目录
mkdir -p /k8s/data/
3.编辑NFS配置文件
#1.修改配置文件
[root@harbor ~]# cat /etc/exports
/k8s/data *(rw,no_root_squash)
#2.启动并开机自启
[root@harbor ~]# systemctl enable --now nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
#3.查看nfs共享目录是否存在
[root@harbor ~]# exportfs 
/k8s/data         <world>
4.存储节点创建要挂载的nfs目录
mkdir /k8s/data/nginx
5.编辑pod资源清单,挂载nfs
[root@master demo]# cat 03-pod-nfs.yaml 
apiVersion: v1
kind: Pod
metadata: 
  name: demo-nfs
spec:
  volumes:
  - name: nfs-data
    #指定存储卷的类型是nfs
    nfs:
       #指定nfs在哪个节点
       server: harbor
       #指定nfs挂在路径
       path: /k8s/data/nginx
  containers:
  - name: demo-v2
    image: nginx:1.20.1-alpine
    volumeMounts:
    - name: nfs-data
      mountPath: /usr/share/nginx/html
6.创建并查看pod资源
[root@master demo]# kubectl apply -f 03-pod-nfs.yaml 
pod/demo-nfs created
[root@master demo]# kubectl get pods -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
demo-nfs   1/1     Running   0          75s   10.100.2.32   worker2   <none>           <none>
7.模拟访问
[root@master demo]# curl 10.100.2.32
demotest
8.删除pod重新创建看数据是否会丢失
[root@master demo]# kubectl delete pods demo-nfs 
pod "demo-nfs" deleted
[root@master demo]# kubectl apply -f 03-pod-nfs.yaml 
pod/demo-nfs created
[root@master demo]# kubectl get pods -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
demo-nfs   1/1     Running   0          4s    10.100.1.24   worker1   <none>           <none>
9.再次模拟访问
[root@master demo]# curl 10.100.1.24
demotest
 10.创建两个pod,都挂载相同nfs存储卷
[root@master demo]# cat 04-pod-nfs2.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: demo-nfs02
spec:
  nodeName: worker1
  volumes:
  - name: nfs-data
    #指定存储卷的类型是nfs
    nfs:
      #指定nfs在哪个节点
      server: harbor
      #指定nfs挂在路径
      path: /k8s/data/nginx
  containers:
  - name: demo-v3
    image: nginx:1.20.1-alpine
    volumeMounts:
    - name: nfs-data
      mountPath: /usr/share/nginx/html
---
apiVersion: v1
kind: Pod
metadata:
  name: demo-nfs03
spec:
  nodeName: worker2
  volumes:
  - name: nfs-data
    #指定存储卷的类型是nfs
    nfs:
      #指定nfs在哪个节点
      server: harbor
      #指定nfs挂在路径 
      path: /k8s/data/nginx
  containers:
  - name: demo-v3
    image: nginx:1.20.1-alpine
    volumeMounts:
    - name: nfs-data
      mountPath: /usr/share/nginx/html

创建查看资源并模拟访问验证结果是否相同

[root@master demo]# kubectl apply -f 04-pod-nfs2.yaml 
pod/demo-nfs02 created
pod/demo-nfs03 created
[root@master demo]# kubectl get pods -o wide
NAME         READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
demo-nfs02   1/1     Running   0          15s   10.100.1.25   worker1   <none>           <none>
demo-nfs03   1/1     Running   0          15s   10.100.2.33   worker2   <none>           <none>
[root@master demo]# curl 10.100.1.25
demotest
[root@master demo]# curl 10.100.2.33
demotest

nfs存储卷挂载验证成功

pod网络暴露

1.hostNetwork使用宿主机网络
·编辑pod资源清单
[root@master demo]# cat 05-pod-nw.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: demo-nw
spec:
  #声明使用宿主机的网络
  hostNetwork: true
  containers:
  - name: demov5
    image: nginx:1.20.1-alpine
·创建并查看pod资源,查看IP是否是宿主机IP
[root@master demo]# kubectl apply -f 05-pod-nw.yaml 
pod/demo-nw created
[root@master demo]# kubectl get pods -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
demo-nw   1/1     Running   0          12s   10.0.0.233   worker2   <none>           <none>
·浏览器测试访问

2.宿主机端口映射

·编辑pod资源清单
[root@master demo]# cat 06-pod-port.yaml 
apiVersion: v1
kind: Pod
metadata: 
  name: demo-port
spec:
  containers:
  - name: demo00
    image: nginx:1.20.1-alpine
    #声明容器与宿主机端口映射;
    ports:
    - name: demo-port
      #容器端口
      containerPort: 80
      #宿主机端口
      hostPort: 99
      #指定访问协议(默认是TCP协议,可以不写)
      protocol: TCP
·创建并查看pod
[root@master demo]# kubectl apply -f 06-pod-port.yaml 
pod/demo-port created
[root@master demo]# kubectl get pods -o wide
NAME        READY   STATUS    RESTARTS   AGE    IP            NODE      NOMINATED NODE   READINESS GATES
demo-nw     1/1     Running   0          9m8s   10.0.0.233    worker2   <none>           <none>
demo-port   1/1     Running   0          12s    10.100.1.26   worker1   <none>           <none>
·浏览器测试访问

  测试访问宿主机的99端口,看是否能够访问到pod的80端口

pod中容器的环境变量env

        我们通过pod资源清单的编写,可以为容器中声明env环境变量        

1.编辑pod资源清单
[root@master demo]# cat 07-pod-env.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: demo-env
spec:
  containers:
  - name: demo009
    image: nginx:1.20.1-alpine
    #声明环境变量
    env:
    #name就是key
    - name: demoenv
      #value就是value值
      value: demoaa
    - name: k8s
      value: 1.23.7
2.创建并查看pod
[root@master demo]# kubectl apply -f 07-pod-env.yaml 
pod/demo-env created
[root@master demo]# kubectl get pods -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
demo-env   1/1     Running   0          11s   10.100.1.27   worker1   <none>           <none>
3.进入到pod容器中,验证变量是否传递成功
[root@master demo]# kubectl exec demo-env -it -- sh

env环境变量传递成功

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

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

相关文章

JavaWeb后端学习

Web&#xff1a;全球局域网&#xff0c;万维网&#xff0c;能通过浏览器访问的网站 Maven Apache旗下的一个开源项目&#xff0c;是一款用于管理和构建Java项目的工具 作用&#xff1a; 依赖管理&#xff1a;方便快捷的管理项目以来的资源&#xff08;jar包&#xff09;&am…

Linux - 探索命令行

探索命令行 Linux命令行中的命令使用格式都是相同的: 命令名称 参数1 参数2 参数3 ...参数之间用任意数量的空白字符分开. 关于命令行, 可以先阅读一些基本常识. 然后我们介绍最常用的一些命令: ls用于列出当前目录(即"文件夹")下的所有文件(或目录). 目录会用蓝色…

初学编程不知道怎么选?推荐学习的三种热门编程语言

在当今的社会需求下&#xff0c;市场上最常见、最受欢迎、最广泛应用的编程语言主要有三种&#xff1a;C语言、Java语言和Python语言。 既然要做出选择&#xff0c;我们就需要明白这三种编程语言各自有何特点和区别。 一、特点 C语言 高效与灵活&#xff1a;C语言生成的机器…

Date/SimpleDateFormat

Date 在Java中&#xff0c;java.util.Date 类用于表示日期和时间。它以自1970年1月1日00:00:00 GMT 一来的毫秒数来存储日期和时间信息。 1、构造方法 标准基准时间&#xff08;称为“历元&#xff08;epoch&#xff09;”&#xff1a;即1970年1月1日00:00:00 GMT。 tips: …

4G LTE教程

整体架构 物理层&#xff08;第 1 层&#xff09; 物理层通过空中接口传输来自 MAC 传输信道的所有信息。负责 RRC 层的链路自适应 (AMC)、功率控制、小区搜索&#xff08;用于初始同步和切换目的&#xff09;和其他测量&#xff08;LTE 系统内部和系统之间&#xff09;。 介…

运行在Linux上的程序越来越慢的排查思路

1、通过free -h 排查内存使用情况&#xff0c;是否内存满了 2、通过df -h 排查磁盘的使用情况&#xff0c;磁盘是否没有空间了 3、检查系统资源配置情况&#xff0c;比如使用ulimit -a检查当前会话的资源限制&#xff0c;如最大文件数、打开文件描述符数等&#xff0c;看是否…

vue 前端项目调用后端接口记录

axios中不同的类型的请求附带数据使用的关键字 请求类型关键字示例GETparamsaxios({ method: get, url: example.com, params: { key: value } })POSTdataaxios({ method: post, url: example.com, data: { key: value } })PUTdataaxios({ method: put, url: example.com, dat…

快速读出linux 内核中全局变量

查问题时发现全局变量能读出来会提高效率&#xff0c;于是考虑从怎么读出内核态的全局变量&#xff0c;脚本如下 f open("/proc/kcore", rb) f.seek(4) # skip magic assert f.read(1) b\x02 # 64 位def read_number(bytes):return int.from_bytes(bytes, little,…

深度解读李彦宏的“不要卷模型,要卷应用”

深度解读李彦宏的“不要卷模型&#xff0c;要卷应用” —— AI技术的应用之道 引言 在2024世界人工智能大会的舞台上&#xff0c;李彦宏的“不要卷模型&#xff0c;要卷应用”言论犹如一石激起千层浪&#xff0c;引发了业界对AI技术发展路径的深思。本文将深入探讨这一观点&a…

修改vscode的字体为等宽字符

在文件——首选项——设置 中 搜索 Editor: Font Family 将内容改为下面的 Consolas, Courier New, monospace 之后重启Vscode就行了

vs2017/2019串口Qt Serial Port/modbus使用报错

vs2017/2019 Qt Serial Port/modbus配置 /* * 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2019 无法解析的外部符号 "__declspec(dllimport) public: __cdecl QModbusTcpClient::QModbusTcpClient(class QObject *)" (__imp_??…

【代码随想录】【算法训练营】【第66天】 [卡码95]城市间货物运输II [卡码96]城市间货物运输III

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 66&#xff0c;周五&#xff0c;ding ding~ [卡码95] 城市间货物运输II 题目描述 卡码95 城市间货物运输II 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C语言 …

智慧养殖的智慧网络:构建高效、可扩展的养殖生态

智慧养殖&#xff0c;在国家政策的大力扶持和农业数字化浪潮的推动下&#xff0c;正迅速发展。然而&#xff0c;许多人对它的价值仍持怀疑态度&#xff1a;认为智慧养殖只是昂贵的技术堆砌&#xff0c;短期内看不到经济回报&#xff0c;甚至怀疑其实用性。本文将挑战这些观点&a…

百川工作手机监控企业员工微信行为

在数字化转型的浪潮中&#xff0c;企业沟通方式正经历着前所未有的变革。微信&#xff0c;作为日常交流不可或缺的工具&#xff0c;已成为企业内外协作的重要桥梁。然而&#xff0c;随着业务量的激增&#xff0c;如何有效监控与管理员工在微信上的行为&#xff0c;确保信息安全…

LLM推理优化笔记1:KV cache、Grouped-query attention等

KV cache 对于decoder-only 模型比如现在如火如荼的大模型&#xff0c;其在生成内容的过程中&#xff0c;为了避免冗余计算&#xff0c;会将Transformer里的self-attention的K和V矩阵给缓存起来&#xff0c;这个过程即为KV cache。 decoder-only模型的生成过程是自回归的&…

让人工智能为你的旋律填词,开启音乐新章

在音乐的世界里&#xff0c;旋律如同灵动的精灵&#xff0c;飞舞在我们的心间。但有时&#xff0c;为这美妙的旋律找到最贴切、最动人的歌词&#xff0c;却成为了创作者们的难题。如今&#xff0c;随着科技的进步&#xff0c;人工智能正逐渐成为我们在音乐创作道路上的得力助手…

【香橙派 Orange pi AIpro】| 开发板深入使用体验

目录 一. &#x1f981; 写在前面二. &#x1f981; 愉快的安装流程2.1 安装前准备2.2 流程准备2.2.1 烧录镜像2.2.2 开机2.2.3 连网2.2.4 SSH远程连接开发板 2.3 体验 AI 应用样例 三. &#x1f981; 写在最后 一. &#x1f981; 写在前面 大家好&#xff0c;我是狮子呀&…

Windows下vscode配置C++环境

一、vscode下载及安装 vscode官网 选安装位置。 勾选这几项。 1.vscode界面中文配置 &#xff08;1&#xff09;点击扩展小图标&#xff0c;搜索插件&#xff0c;找到插件Chinese (Simplified) (简体中文) Language Pack&#xff0c;点击install。 &#xff08;2&#xf…

3dmax-vray5大常用材质设置方法

3dmax云渲染平台——渲染100 以高性价比著称&#xff0c;是预算有限的小伙伴首选。 15分钟0.2,60分钟内0.8;注册填邀请码【7788】可领30元礼包和免费渲染券 提供了多种机器配置选择(可以自行匹配环境)最高256G大内存机器&#xff0c;满足不同用户需求。 木纹材质 肌理调整&…

红酒的艺术之旅:品味、鉴赏与生活的整合

在繁忙的都市生活中&#xff0c;红酒如同一道不同的风景线&#xff0c;将品味、鉴赏与日常生活巧妙地整合在一起。它不仅仅是一种饮品&#xff0c;更是一种艺术&#xff0c;一种生活的态度。今天&#xff0c;就让我们一起踏上这趟红酒的艺术之旅&#xff0c;探寻雷盛红酒如何以…