内容编排与Kubernetes

news2024/12/26 4:35:10

第一节

内容编排与Kubernetes

为什么要用k8s

集群环境容器部署的困境,假设我们有数十台服务器。分别部署Nginx,redis,mysql,业务服务。如何合理的分配这些资源。这里就需要用到容器编排

容器编排

在实际集群环境下,需要自动完成容器的构建和部署,在宿主机上安装什么容器,如何管理,完成这些工作的工具就是容器编排工具。

常见的容器编排工具

Docker compose :单机多容器

Docker swarm: 官方跨主机的容器编排工具

kubernetes(k8s) :Google提供的容器编排工具,和docker swarm是竞争对手关系,功能上相差不多。

k8s优势

Google提供,因为google体量大,k8s的实际编排经验上更多,市场占有率更高

K8s的职责

自动化容器的部署和复制

随时扩展与收缩容器规模

容器分组Group,并且提供容器间的负载均衡

实时监控,实时的故障发现,自动替换

k8s基本概念

img

Pod:
  • Pod是“容器”的容器,可以包含多个“Container”
  • Pod是k8s最小可部署单元,一个Pod就是一个进程
  • Pod内容容器网络互通,每个Pod都由自己虚拟IP
  • Pod都是部署完整的应用或模块

Pause(容器):提供了网络底层功能,简单理解Pod内容器间的请求变成localhost,IPC(NetWork(PID(HostName pause …)))

Container(容器)

Label(标签)

说明标签,相当于每一个Pod的别名,方便k8s主节点Master找到对应的Pod进行操作

Replication Controller(复制控制器)

存在于主节点Master上,它的职责是对Pod的数量进行实时监控,剔除失去响应的Pod ,改变参数控制Pod副本的数量

Service(服务)

跨主机、跨容器间的网络通信,进行逻辑分组

Node(节点)

Kubernetes Master(k8s主节点)

具体使用到的技术

每个节点都应该安装三个应用程序,docker,kubelet,kube-proxy

kubelet:用于执行相应的k8s命令,横向对比docker相当于docker命令。kubelet是k8s的核心命令。

kube-proxy:代理,Service能做到跨主机、跨容器间的网络通信,依赖的就是kube-proxy

第二节

安装K8S的四种方式

  • 使用kubeadmin通过离线镜像安装(推荐)
  • 使用阿里云共有云平台平台k8s(花钱)
  • 通过yum官方仓库安装(上古版本)
  • 二进制包的形式进行安装,kubeasz(github)

设计初安装并不复杂,一切的安装包都是google远程下载安装,因为墙的原因,只能使用上面四种,推荐使用第一种,选择业界稳定版本

环境准备

虚拟机

Centos7 Master *1, Master:192.168.163.132

Centos7 Node *2 ,Node1:192.168.163.133, Node2:192.168.163.137

设置主机名与时区、添加hosts网络主机配置,三台虚拟机都要设置

1.设置时区、主机名

timedatectl set-timezone Asia/Shanghai # 都要执行
hostnamectl set-hostname master #132执行
hostnamectl set-hostname node1 #133执行
hostnamectl set-hostname  node2 #137执行

2.网络配置

#设置好以后可以通过主机名来和其他主机进行网络数据传输,比如在master主机中ping node1,ping node1,网络是通的

vim /etc/hosts 
# 黏贴下面内容
192.168.163.132 master
192.168.163.133 node1
192.168.163.137 node2

3.关闭防火墙,三台虚拟主机都要设置。生产环境跳过

#学习过程中linux安全增强模块关闭
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
#设置临时生效
setenforce 0
#禁用防火墙,防止端口被屏蔽
systemctl disable firewalld
#停止防火墙
systemctl stop firewalld

安装Kubeadm快速部署工具

步骤

不只是Master节点,所有节点都需要严格按照下面步骤运行。

1.将镜像包上传至服务器每个节点

mkdir /usr/local/k8s-install

cd /usr/local/k8s-install

XFTP 上传安装文件kubernetes-1.14

[^安装镜像kubernetes-1.14文件夹下面的kuber114-rpm.tar.gz是我们的kubeAdm集群管理工具的压缩包; docker-ce-18.09.tar.gz是docker的压缩包;k8s-114-images.tar.gz是k8s镜像本身;flannel-dashboard.tar.gz是仪表盘,用来监控集群状态的;]:

2.每个Centos上安装Docker

tar -zxvf docker-ce-18.09.tar.gz
cd docker
# 加载当前目录下所有rpm文件,自动完成安装
yum localinstall -y *.rpm
# 启动docker
systemctl start docker
# 设置docker为自启动
systemctl enable docker

3.确保从cgroups均在同一个从groupfs

#cgroups是control groups的简称,它为Linux内核提供了一种任务聚集和划分的机制,通过一组参数集合将一些任务组织成一个或多个子系统。
#cgroups是实现IaaS虚拟化(kvm、lxc等),PaaS容器沙箱(Docker等)的资源管理控制部分的底层基础。
#子系统是根据cgroup对任务的划分功能将任务按照一种指定的属性划分成的一个组,主要用来实现资源的控制。

#在cgroup中,划分成的任务组以层次结构的形式组织,多个子系统形成一个数据结构中类似多根树的结构。cgroup包含了多个孤立的子系统,每一个子系统代表单一的资源

docker info | grep cgroup

如果不是groupfs,执行下列语句

cat << EOF > /etc/docker/daemon.json
{
“exec-opts”: [“native.cgroupdriver=cgroupfs”]
}
EOF
systemctl daemon-reload && systemctl restart docker

4.安装kubeadm
kubeadm是集群部署工具
cd /usr/local/k8s-install/kubernetes-1.14
tar -zxvf kube114-rpm.tar.gz
cd kube114-rpm
yum localinstall -y *.rpm

5.关闭交换区
swapoff -a
vi /etc/fstab
#swap一行注释

6.配置网桥

cat < /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

7.通过镜像安装k8s

cd /usr/local/k8s-install/kubernetes-1.14

#加载本地镜像

docker load -i k8s-114-images.tar.gz

#加载仪表盘镜像

docker load -i flannel-dashboard.tar.gz

第三节

利用kubeadm创建集群

集群设备

Centos7 Master *1, Master:192.168.163.132

Centos7 Node *2 ,Node1:192.168.163.133, Node2:192.168.163.137

初始化一主两从集群设备

1.master主服务器配置

#指定k8s版本,pod的虚拟ip范围 

kubeadm init --kubernetes-version=v1.14.1 --pod-network-cidr=10.244.0.0/16

#控制台提示需要运行以下命令

mkdir -p $HOME/ .kube

#/etc/kubernetes/admin.conf 是kubeadm有关于集群的核心配置文件, $HOME/.kube/config是k8s默认去读取的文件夹

sudo cp -i /etc/kubernetes/admin.conf  $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/congfig

#不需要在master运行,后面会在node1和node2运行,node1、node2和master构建成集群

kubeadm join 192.168.163.132:6443 --token aoeout.xxx \ --discover-token-ca-cert-hash sha256:xxx -discovery-token-unsafe-skip-ca-verfication
# 如果忘记上面的命令,在master上运行,拿到令牌aoeout.xxx
kubectl token list

2.检查下master状态

kubectl get nodes

#查看存在问题的pod,所有组件都是running状态,k8s的master设置完成

kubectl get pod --all-namespaces

#设置全局变量

#加载和创建flannel网络组件(组件状态是pending的话,尝试使用下面命令,跨pod通信最底层的网络协议)

kubectl create -f kube-flannel.yaml

3.从节点Node1和node2设置

#node1和node2设置

kubeadm join 192.168.163.132:6443 --token aoeout.xxx \ --discover-token-ca-cert-hash sha256:xxx

#检查集群状态

kubectl get nodes

第四节

重新启动服务

用于服务器重启了,恢复k8s。

  • 启动节点的k8s服务,systemctl start kubelet
  • 设置开机启动 systemctl enable kubelet,即便服务器重启了,kubelet也会随之重启
kubeadm/kubelet/kubectl区别

1.kubeadm是kubernetes集群快速构建工具,快速构建主节点,让从属的node节点快速加入当中 ,大幅度简化集群构建工作

2.kubelet运行在所有节点上,负责启动POD和容器的程序,以系统服务形式在后台运行,保证POD和容器的可用性

3.kubectl是kubernetes命令行工具,提供指令,对集群发送各种命令

启动Web UI Dashboard

在k8s 中默认提供了一个可视化界面,对集群进行监控和管理,学习下如何开启Web UI和基本的操作

先找到kubernetes-1.14文件夹,找到文件夹下面的kubernetes-dashboard.ymal仪表盘的核心配置文;admin-role.yaml配置文件说明管理员角色有哪些职能;kubernetes-dashboard-admin.rbac.yaml是基于RBAC基于角色的访问控制权限

# 简单配置
# kubectl apply读取配置文件,并使用配置文件进行配置
kubectl apply -f kubernetes-dashboard.yaml
kubectl apply -f admin-role.yaml
kubectl apply -f kubernetes-dashboard-admin.rbac.yaml
# 获取系统命名空间kube-system下的服务有哪些,通过宿主机ip+端口访问控制台
kubectl -n kube-system get svc

第五节

Dashboard部署Tomcat集群

1.配置阿里云镜像加速器

确保每一个集群节点都配置,否则创建容器会遇到无法下载问题

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://b66nkcgc.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

2.浏览器回到 dashboard地址 192.168.163.132.32000

左侧菜单中找到工作负载->创建->创建应用->(输入应用名称mytomcat;镜像名称:tomcat:latest;容器组个数:2个副本;服务:外部,其它电脑才可以访问容器;端口:8000是pod端口,目标端口:8080,在容器启动后容器8080端口映射到pod虚拟ip的8000端口)->部署

3.检查概况汇总的部署状况,容器组的状态,点击日志查看日志输出

4.如何访问tomcat,概况->副本集->名称,服务中的 内部端点的端口32421,这个内部端点端口就是外部访问的端口,浏览器中输入node1ip+32421,node2ip+32421,32421可以在服务暴露中修改

5.测试。docker -ps,找到名为tomcat的容器id, 使用命令docker rm- f id,强制删除,来模拟tomcat容器挂掉的场景;k8s会检测到这一情况,并尝试恢复tomcat容器

Deployment脚本部署Tomcat集群

上面的方式是通过dashboard的方式部署,但是在实际工作环境下,我们更多的是通过编写Deployment脚本部署、

Deployment(部署)

部署是指Kubernetes向Node节点发送指令,创建容器的过程

kubernetes支持yml格式部署脚本,描述部署规则

kubectl create -f 部署yml文件 #加载指定脚本, 创建部署

Deployment部署脚本范本
apiVersion: apps/v1  #api的版本号
kind: Deployment  #文件类型,表示用于部署的配置文件
metadata: 
  name: tomcat-deploy  #部署文件名字
spec:
  replicas: 2  #产生的pod数量
  template: 
    metadata:
      labels:
        app: tomcat-cluster  #产生pod的label标签名
    spec:
      volumes: 
      - name: web-app
        hostPath:
          path: /mnt
      containers:
      - nam e: tomcat-cluster  #创建的容器命名
        image: tomcat:latest   #镜像来源名字
        resources:
          requests: #资源分配
            cpu: 0.5
            memory: 200Mi
          limits:
            cpu: 1
            memory: 512Mi
        ports:
        - containerPort: 8080 #容器内对外暴露的端口号
        #volumeMounts: #将容器/usr/local/tomcat/webapps目录挂载到web-app指定的/mnt目录
        #- name: web-app
          #mountPath: /usr/local/tomcat/webapps
部署相关常用命令

kubectl create -f 部署yml文件 #通过-f 指定某个yml创建N个pod部署

kubectl apply -f 部署yml文件 #当第一次没有使用create部署,直接使用apply和create效果一致 配置文件yml更新,部署更新配置

kubectl get pod [-o wide] #查看已部署pod

kubectl describe pod pod名称 # 查看pod详细信息

kubectl logs [-f] pod 名称 #查看pod输出日志, -f表示实时更新

实际操作
# 进入主节点master local文件夹下,创建文件夹k8s,创建文件夹 tomcat-deploy也就是部署文件夹
mkdir k8s
cd k8s
mkdir tomcat-deploy
cd tomcat-deploy
#创建yml文件,名字就叫tomcat-deploy
vim tomcat-deploy.yml

在tomcat-deploy.yml文件中,阐述容器发布规则。

  • apiVersion/kind/metadata:name是对配置文件本身的设置;
  • template模板信息,pod中的名字通过labels:app设置;
  • spec设置创建容器的信息。
# tomcat-deploy.yml具体内容
apiVersion: extensions/v1beta1  #解析yml文件的api的版本号,不同的api版本对解析规则略有不同
kind: Deployment #种类,说明yml文件用途,用于部署
metadata: #元数据
  name: tomcat-deploy #部署文件名称,这个名字代表了我们要部署tomcat集群
spec: #用来设置详细内容
  replicas: 2 #  部署2个tomcat pod
  template: #部署里面的详细设置
    metadata: # 元数据
      labels: # 标签
        app: tomcat-clustor #是pod的名称
    spec:
      containers: # 容器设置
      - name: tomcat-cluster # -代表集合,通常name和上面的app保持一致
        image: tomcat:latest # 镜像来源
        ports: # 端口
        - containerPort: 8080 #容器内部对外部暴露的端口,这个端口和镜像的端口保持一致
        

1使用kubectl create -f . /tomcat-deploy.yml创建,部署创建完成;

2使用kubectl get deployment 查看部署;

3.kubectl get pod -o wide查看pod

kubectl describe pod pod名称 查看pod详细信息

4.kubectl logs -f pod 名称 查看日志

第六节

NodePort方式外部访问tomcat集群

img

如何从外部访问tomcat集群呢,前面我们安装两个pod名字是Tomcat Cluster,这两个pod又通过k8s部署了两个tomcat容器,端口是8080。

有两个tomcat pod,当前tomcat pod只设置了容器对外暴露的端口,没有设置容器从面访问的设置,只能从内部访问,如何从外部访问呢,涉及到服务这个概念

service服务

service服务用语对外暴露应用的组件

思路

我们在宿主机Master上,也创建一个pod,安装一个service服务名字就叫tomcat-service,这个服务作为统一入口,将端口8000和两个node节点8080做映射(8000和8080这些端口有k8s统一管理,设置好绑定关系就可以了,底层会自动设置好网络通信),让请求从master进入,还有一个好处,可以设置外侧宿主机对外暴露的端口(通过宿主机Ip+内部的端口号,也能访问到内部服务。不推荐,因为直接指明节点ip后,负载均衡就失效了),通过负载落到node上。这么做和Nginx的负载均衡做法很像。

准备Service 配置文件

在master主节点下

mkdir tomcat-service

cd tomcat-service

编写服务的yml目录

vim tomcat-service.yml

# tomcat-service.yml具体内容
apiVersion: extensions/v1beta1  #解析yml文件的api的版本号,不同的api版本对解析规则略有不同
kind: Service #种类,说明yml文件用途,用于服务
metadata: #元数据
  name: tomcat-service #部署文件名称,这个名字代表了我们服务名字是tomcat-service,这个名称是用于显示的
  labels: # 标签,因为Service服务也是Pod,只要是pod就可设置标签,通过标签设置别名
    app:tomcat-service # 这个名称是用于后期对pod进行选择的时候会用到
spec: #用来设置详细内容
  type: NodePort # 节点端口,用于在每个节点中开辟一个端口和内侧tomcat进行端点映射
  selector: #选择器
    app: tomcat-cluster # 部署时所设置的"label:app:tomcat-cluster"
  ports: # 端口, master的8000会映射到两个node节点的32500	
  - port: 8000 # 设置了服务接受数据的端口
  	targetPort: 8080 # 目标端口,容器内部对外暴露的端口
  	nodePort: 32500 # 每一个节点对外暴露32500,并与容器内部8080进行映射
        
创建服务

1.kubectl create -f ./tomcat-service.yml # 创建

2.kubectl get service # 检查下,获取所有服务列表查看服务状态

3.kubectl describe service tomcat-service # 查看service详细信息

基于NFS协议实现集群文件共享

NFS

Network File System(NFS) 是由SUN公司研制的文件传输协议。NFS主要是采用远程调用RPC机制实现。

安装NFS

在文件的提供方安装

yum install -y nfs-utils rpcbind # nfs-utils 是rpc工具集, rpcbind是RPC的底层支持
集群文件共享的问题

首先,在以前情况下,假设在k8s集群环境下,不同节点不同pod,每个pod里面都有tomcat oa系统/tomcat/webapps/oa,只要oa里面的文件产生变化,需要对每个容器中的文件进行修改,这是一件很麻烦的事情,怎么解决呢img

思路

1.在k8s中额外增加一个节点NODE3,它的职责只有一个提供共享文件,也就是文件共享服务器,这个服务器下的目录 /www-data/ ,通过NFS协议挂载到其他节点的自定义/mnt目录下,2.在内侧Tomcat容器在部署的时候,不在是把oa文件夹复制到webapps下面,而是指明一个挂载点,进行绑定 。

这样,在访问 /mnt在对它里面的文件进行操作的时候,本质就是操作/www-data/下的文件。这样可以一次性解决所有容器之间的共享问题。

第一步,提供NFS服务并设置共享目录和挂载点
文件服提供方

在master上安装nfs工具和nfs协议绑定,yum install -y nfs-utils rpcbind,安装成功后,主服务master具备了nfs职能,现在master它也是一个文件共享服务器,是NODE1和NODE2文件来源所在。

#未来集群所有共享的web应用放在 www-data目录
cd /usr/local & mkdir data & cd data
mkdir www-data & cd www-data
#设置哪个文件对外暴露和共享
##nfs允许挂载的目录及权限,在文件/etc/exports中进行定义
vim /etc/exports 
# /etc/exports具体内容
## 目录 ;ip; 24是掩码;rw表示读写,sync表示同步操作  
/usr/local/data/www-data 192.168.163.132/24(rw, sync)

启动服务

systemctl start nfs.service #启动nfs服务

systemctl enable nfs.service #开机启动nfs服务

systemctl start rpcbind.service # 对应rpcbind绑定服务

systemctl enable nfs.service #开机启动nfs服务

查看一下

exportfs ,看到下面内容,配置成功了

/usr/local/data/www-data 
				192.168.163.132/24
具体使用文件服务的节点NODE1/NODE2

1.使用方需要安装nfs-utils 工具集,yum install -y nfs-utils

2.查看master共享路径,使用命令 showmount show -e 192.168.163.132

# 共享文件夹路径
/usr/local/data/www-data 192.168.163.132/24

3.挂载, mount 192.168.163.132:/usr/local/data/www-data /mnt,远程主机上的目录挂载到了本机/mnt下

4.设置开机启动

systemctl enable nfs.service #开机启动nfs服务

第二步 集群文件共享

目标:将每个Pod中的tomcat容器webapps中的内容映射到 每个节点的/mnt

路径下

1.准备工作,删除原有的名字为tomcat-deploy部署,重新部署

# 在master节点下,查看下之前已经部署过的信息
kubectl get deloyment
# 删除原有的名字为tomcat-deploy部署,重新部署;
##删除部署后,对应的pod也会删除,但是service不会被删除
kubectl delete deployment tomcat-deploy
# 删除tomcat-service
kubectl delete service tomcat-service

2.切换到/k8s/tomcat/deploy目录下

vim tomcat-deploy.yml中,在spec:template:spec下面增加配置数据卷volumes,在spec:template:spec:containers下增加挂载点volumeMounts

#tomcat-deploy.yml具体内容
apiVersion: extensions/v1beta1  #解析yml文件的api的版本号,不同的api版本对解析规则略有不同
kind: Deployment #种类,说明yml文件用途,用于部署
metadata: #元数据
  name: tomcat-deploy #部署文件名称,这个名字代表了我们要部署tomcat集群
spec: #用来设置详细内容
  replicas: 2 #  部署2个tomcat pod
  template: #部署里面的详细设置
    metadata: # 元数据
      labels: # 标签
        app: tomcat-clustor #是pod的名称
    spec:
      volumes: # 挂载数据卷
      - name: web-app # 数据卷别名
        hostPath:#设置宿主机原始目录
          path: /mnt # 再部署的时候,每个节点都有一个mnt目录需要挂载
      containers: # 容器设置
      - name: tomcat-cluster # -代表集合,通常name和上面的app保持一致
        image: tomcat:latest # 镜像来源
        ports: # 端口
        - containerPort: 8080 #容器内部对外部暴露的端口,这个端口和镜像的端口保持一致
        volumeMounts: # 挂载点
        - name: webapp #和数据卷中的name保持一致,前后呼应
        mountPath: /usr/local/tomcat/webapps # 挂载地址,k8s在进行pod构建的时候,利用设置好的/mnt 挂载到 /usr/local/tomcat/webapps 目录下

3.重新创建部署

kubectl create -f . /tomcat-deploy.yml创建完成后,通过命令kubectl get deployment 检查部署情况,通过命令 kubectl get pod -o wide 发现NODE节点上的pod也都正常运行了

4.检查是否生效

方案一:进入node节点名为tomcat的docker容器内部中,检查webapps目录下文件是否随master主节点修改/mnt目录下文件变化而变化

方案二:在master主节点上, kubectl exec -it pod名称 /bin/bash,会自动进入选中的pod名称的从节点tomcat容器下

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

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

相关文章

线性结构-队列

队列是一种先进先出First In Fisrt Out,FIFO的线性表。 与一般的数组和链表不同&#xff0c;队列要求所有的数据只能从一端进入&#xff0c;从另一端离开。 输入进入的一端叫队尾rear&#xff0c;数据离开的一端叫队头front。 数据只能从队尾进入队列&#xff0c;从队头离开队…

VSCODE配置ROS编译环境

目录 一、安装插件 二、环境配置 2.1初始化工作空间 2.2配置VSCode 2.2.1创建功能包 2.2.2配置 c_cpp_properties.json 2.2.3配置 task.json 2.2.4配置 CMakeLists.txt 三、运行程序 3.1编译程序 3.2启动ros master 3.3执行可执行文件 用VSCode编辑ROS程序时&#xf…

linux 内核内存管理

物理内存 相关数据结构 page&#xff08;页&#xff09; Linux 内核内存管理的实现以 page 数据结构为核心&#xff0c;其他的内存管理设施都基于 page 数据结构&#xff0c;如 VMA 管理、缺页中断、RMAP、页面分配与回收等。page 数据结构定义在 include/linux/mm_types.h …

使用 Lambda 函数将 CloudWatch Log 中的日志归档到 S3 桶中

作者&#xff1a;SRE运维博客 博客地址&#xff1a;https://www.cnsre.cn/ 文章地址&#xff1a;https://www.cnsre.cn/posts/221205544069/ 相关话题&#xff1a;https://www.cnsre.cn/tags/aws/ 躺了好久&#xff0c;诈尸了。因为换了工作&#xff0c;所以比较忙一直没有时间…

解决APP抓包问题「网络安全」

1.前言 在日常渗透过程中我们经常会遇到瓶颈无处下手&#xff0c;这个时候如果攻击者从APP进行突破&#xff0c;往往会有很多惊喜。但是目前市场上的APP都会为防止别人恶意盗取和恶意篡改进行一些保护措施&#xff0c;比如模拟器检测、root检测、APK加固、代码混淆、代码反调试…

挖出api接口的重要性

作为一名软件开发者&#xff0c;API是我们工作中不可或缺的一部分。无论是将不同系统连接起来&#xff0c;还是构建多组件应用程序&#xff0c;API都是我们的核心工具之一。在本文中&#xff0c;我们将深入讨论API的技术细节和实际应用。 一.首先&#xff0c;我们来看看什么是…

怎么把mkv格式改成mp4?不妨试试这几种方法吧!

怎么把mkv格式改成mp4&#xff1f;mp4是一种多媒体封装格式&#xff0c;不过我们通常会将它说成是视频格式&#xff0c;它可以在一个文件中容纳无限数量的视频、音频、图片或字幕轨道&#xff0c;mp4格式也是被我们每个人所熟知&#xff0c;因为我们每个人几乎每天都会接触或者…

Spring入门教程

目录 一、Spring最基本的使用 1.创建Maven项目(不需要模板) 2.添加Spring框架支持 3.添加启动类(没啥可说的符合规范即可) 4.创建bean对象 5.将bean对象注册到Spring中 (a)先在resources文件夹中创建一个xml文件(注意:是test文件用了.xml后缀 不是直接创建一个xml文件) (…

[ChatGPT] 从 GPT-3.5 到 GPT-5 的进化之路 | ChatGPT和程序员 : 协作 or 取代

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐如果觉得文章写的不错&#xff0c;欢迎点个关注一键三连&#x1f609;有写的不好的地方也欢迎指正&#xff0c;一同进步&#x1f601;…

FastDFS总结

目录 概述 什么是分布式文件系统 核心概念 目录结构 上传机制 下载机制 Linux中搭建FastDFS 常用指令 SpringBoot整合FastDFS FastDFS集成Nginx 概述 FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件&#xff…

Android输入法不使用多客户端多屏适配-Android12

Android输入法不使用多客户端多屏适配-Android12 1、IME屏幕之间切换2、属性配置3、屏幕之间切换 IME 窗口 在非默认屏幕上运行的应用 1、IME屏幕之间切换 系统使用一个 IME&#xff0c;但可以在屏幕之间切换&#xff0c;以跟踪用户焦点。Android 10 默认所有第一方和第三方 IM…

【Android】试着写一个资讯界面(含不同板块)

跟着视频做的&#xff0c;并不能动脑子&#xff0c;于是自己顺一遍流程&#xff01;&#xff08;只阅读了部分教程&#xff0c;代码不完全相同&#xff09;&#xff08;仅为静态界面不含跳转&#xff09;&#xff08;在fragment上&#xff09;此为视频链接 成果图&#xff1a; …

07-HTML-链接标签

<a> 标签定义超链接&#xff0c;用于从一张页面链接到另一张页面。<a> 元素最重要的属性是 href 属性&#xff0c;它指示链接的目标。 属性值描述downloadfilename规定被下载的超链接目标。hrefURL规定链接指向的页面的 URL。pinglist_of_URLs规定以空格分隔的 UR…

YOLOv8 人体姿态估计(关键点检测) python推理 ONNX RUNTIME C++部署

目录 1、下载权重 ​2、python 推理 3、转ONNX格式 4、ONNX RUNTIME C 部署 1、下载权重 我这里之前在做实例分割的时候&#xff0c;项目已经下载到本地&#xff0c;环境也安装好了&#xff0c;只需要下载pose的权重就可以 2、python 推理 yolo taskpose modepredict model…

ESP32设备驱动-PCA9685 LED控制器驱动

PCA9685 LED控制器驱动 文章目录 PCA9685 LED控制器驱动1、PCA9685介绍2、硬件准备3、软件准备4、驱动实现1、PCA9685介绍 PCA9685 是一款 IC 总线控制的 16 通道 LED 控制器,针对红色/绿色/蓝色/琥珀色 (RGBA) 彩色背光应用进行了优化。 每个 LED 输出都有自己的 12 位分辨率…

scala中match使用报错Scala.matchError:(of class java.lang.String)

1.遇到错误 Scala.matchError:(of class java.lang.String) 2.发现问题出在match使用中,如下写法就会报错 val partitionIndex key.toString match {case "chinese" > 0case "math" > 1case "english" > 2} 3.后来修改了写法&#xf…

【大数据学习篇3】HDFS命令操作与MR单词统计

1. HDFS命令使用 [rootmaster bin]# su hd[hdmaster bin]$ #查看/目录[hdmaster bin]$ hdfs dfs -ls / 5 #在/目录创建一个为test名字的文件夹[hdmaster bin]$ hdfs dfs -mkdir /test#查看/目录[hdmaster bin]$ hdfs dfs -ls Found 1 itemsdrwxr-xr-x - hd supergroup …

【rust】| 04——语法基础 | 函数

系列文章目录 【rust】| 00——开发环境搭建 【rust】| 01——编译并运行第一个rust程序 【rust】| 02——语法基础_变量(不可变?)和常量 【rust】| 03——语法基础 | 数据类型 【rust】| 04——语法基础 | 函数 【rust】| 05——语法基础 | 流程控制 文章目录 函数1. 定义函数…

Lecture 15:元学习Meta Learning

目录 Review Machine Learning Introduction of Meta Learning What is Meta Learning? Meta Learning的三个步骤 Meta Learning的framework&#xff1a; ML v.s. Meta Meta Learning的training What is learnable in a learning algorithm? 初始化参数θ0 Optimiz…

用 Phthon 写抽奖程序

一共 10 人参与抽奖&#xff0c;四人中奖&#xff0c;其中一人固定不变。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 地址&#xff1a…