kubeadm搭建单master多node的k8s集群--小白文,图文教程

news2024/9/19 10:46:03

参考文献

K8S基础知识与集群搭建
kubeadm搭建单master多node的k8s集群—主要参考这个博客,但是有坑,故贴出我自己的过程,坑会少很多
注意:

  • 集群配置是:一台master:zabbixagent-k8smaster,两台node:k8snode1和k8snode2
  • 当没有明说master机器做什么或者node机器做什么时,所有操作步骤默认是三台机器都要进行配置
  • 操作系统:centos 7,且master的cpu要配置2核及以上,否则跑不动k8s!!!

1.环境准备

a.修改机器的ip地址并设置为静态ip

  • vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=b841150d-bab6-4e52-802d-83c990f6b00f
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.0.50
NETMASK=255.255.255.0
GATEWAY=192.168.0.2
DNS1=192.168.0.2

上述代码中主要设置:
BOOTPROTO=static
IPADDR=your ip
NETMASK=your netmask
GATEWAY=your gateway
DNS1=your dns

  • 修改后重启生效:systemctl restart network

b.修改主机名

  • 修改主机名:hostnamectl set-hostname yournmae && bash
  • master IP:192.168.0.51
    在这里插入图片描述
  • Node1 IP:192.168.0.52
    在这里插入图片描述
  • Node2 IP:192.168.0.53
    在这里插入图片描述

c.关闭selinux和关闭防火墙

  • 关闭selinux:
    • sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/’ /etc/selinux/config
    • 重启以生效:reboot
    • 使用getenforce查看selinux的状态
      在这里插入图片描述
  • 关闭防火墙
    • systemctl stop firewalld && systemctl disable firewalld

d.修改hosts⽂件

  • 目的:让各个节点都能够通过主机名访问到其他节点。修改每个机器的/etc/hosts⽂件
  • 每台机器执行以下命令:
echo '192.168.0.51 zabbixagent-k8smaster 
192.168.0.52 k8snode1 
192.168.0.53 k8snode2' >> /etc/hosts

其中ip地址及对应的主机名改为你自己对应的。

  • 查看修改后的hosts文件
    在这里插入图片描述

e.机器上配置 yum 源

  • 删除原有的yum源:rm -rf /etc/yum.repos.d/*.repo
  • 下载centos7的reposity(因为我的操作系统是centos):wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo (如果没有wget,去 http://mirrors.aliyun.com/repo/ 下载CentOS-Base.repo,再上传CentOS-Base.repo文件到/etc/yum.repos.d/目录下)
  • 清楚缓存:yum clean all && yum makecache
  • 安装lrzsz、scp、vim、wget、net-tools:yum install -y lrzsz scp vim wget net-tools yum-utils

f.配置国内 docker 的 repo、epel 源

  • 下载repo:yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 下载epel源:wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  • 查看文件:ls /etc/yum.repos.d/
    在这里插入图片描述

g.配置主机间免密登录-命令按先后步骤执行(注意看本节每个字)

  • 目的:每台机器设置免密登录,因为k8s集群中的各个节点之间需要通过 ssh 进行通信
  • 生成密钥:ssh-keygen(一路回车)–注意:下方图片横线处,如果没有生成这个或者接下来的步骤执行不成功,再次执行“ssh-keygen”命令
    在这里插入图片描述
  • 将本地生成的密钥文件和私钥文件拷贝到zabbixagent-k8smaster节点(此处是你自己的节点名字):ssh-copy-id zabbixagent-k8smaster --注意:下方图片横线处,需要输入zabbixagent-k8smaster的密码。
    在这里插入图片描述
  • 将本地生成的密钥文件和私钥文件拷贝到k8snode1节点(此处是你自己的的节点):ssh-copy-id k8snode1 --注意:下方图片横线处,需要输入k8snode1的密码。
    在这里插入图片描述
  • 将本地生成的密钥文件和私钥文件拷贝到k8snode2节点(此处是你自己的节点):ssh-copy-id k8snode2 --注意:下方图片横线处,需要输入k8snode2的密码。
    在这里插入图片描述
  • 上面是在zabbixagent-k8smaster执行了“ssh-keygen、ssh-copy-id zabbixagent-k8smaster、ssh-copy-id k8snode1、ssh-copy-id k8snode2”,,这些命令还需要在k8snode1和k8snode2执行一遍

h.关闭 swap 分区

  • 目的:swap交换分区,在机器内存不够时会使用,但是swap分区的性能较低,k8s设计时为了提升性能,默认不允许使用交换分区。kubeadm初始化的时候会检查是否开启了swap分区,如果开启了,会报错,所以需要关闭swap分区。如果不想关闭交换分区,可以使用–ignore-preflight-errors=Swap参数忽略检查。
  • 在master节点上:vim /etc/fstab,然后注释掉/dev/mapper…
    在这里插入图片描述
  • 在两个节点是上:vim /etc/fstab,需要注释掉/dev/…和uuid
    在这里插入图片描述

i.修改机器内核参数

  • 目的:k8s需要修改机器内核参数,使其支持路由转发和桥接,否则会报错
  • 三台机器分别执⾏修改内核参数
  • vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1 
net.bridge.bridge-nf-call-iptables = 1 
net.ipv4.ip_forward = 1
  • modprobe br_netfilter
  • sysctl -p /etc/sysctl.d/k8s.conf
    在这里插入图片描述

j.配置安装k8s组件的yum源

  • vim /etc/yum.repos.d/kubernetes.repo
[kubernetes] 
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ 
enabled=1

k.配置时间同步

  • 目的:使ntpdate同步时间
  • 安装ntpdate:yum install -y ntpdate
  • 与ntp服务器同步时间:ntpdate cn.pool.ntp.org
  • 将时间同步命令写⼊:crontab -e
0 2 * * * /usr/sbin/ntpdate cn.pool.ntp.org
  • 重启crontab服务:systemctl restart crond

m.开启 ipvs

  • ipvs(IP Vertual Server):实现了传输层的负载均衡,是一种高性能、可扩展的负载均衡方案。
    • Linux内核的一部分,承担着负载均衡的功能。
    • 通过ipvsadm工具来配置ipvs。
    • ipvs可基于TCP和UDP的服务请求转发到真实服务器上
    • ipvs和iptables的区别:
      • ipvs是在传输层工作,iptables是在网络层工作。
      • ipvs是基于内容的负载均衡,iptables是基于地址的负载均衡。
      • ipvs为大型集群提供了高性能的负载均衡,iptables为小型集群提供了负载均衡。
      • ipvs支持更多的负载均衡算法,iptables只支持轮询算法。
      • ipvs支持服务器健康检查、连接重试等功能,iptables不支持。
  • 准备ipvs.modules⽂件:vim /etc/sysconfig/modules/ipvs.modules
#!/bin/bash 
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack" 
for kernel_module in ${ipvs_modules}; do 
	/sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1 
	if [ 0 -eq 0 ]; then 
	/sbin/modprobe ${kernel_module} 
	fi 
done
  • 修改ipvs.modules文件权限并执行
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs

在这里插入图片描述

n.安装基础软件包

yum install -y device-mapper-persistent-data lvm2 net-tools conntrack-tools wget nfs-utils telnet gcc gcc-c++ make cmake libxml2-devel openssl-devel curl-devel unzip sudo ntp libaio-devel ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet

o.安装 iptables

  • iptables是Linux系统上常用的防火墙软件,用于设置、审计和检查IPv4和IPv6数据包过滤规则以及NAT表的工具。
  • 安装iptables:yum install -y iptables-services
  • 禁⽤iptables:systemctl stop iptables && systemctl disable iptables
  • 清空防⽕墙规则:iptables -F

p.安装docker

  • 安装docker-ce和containerd:yum install -y docker-ce-20.10.6 docker-ce-cli-20.10.6 containerd.io
  • 启动docker:systemctl enable docker && systemctl start docker

q.配置docker镜像加速器

  • 创建配置⽂件:mkdir -p /etc/docker
  • 创建daemon.json⽂件:vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://rsbud4vc.mirror.aliyuncs.com", "https://docker.mirrors.ustc.edu.cn", "https://registry.docker-cn.com", "http://hub-mirror.c.163.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}

在这里插入图片描述

  • 加载配置、重启docker:systemctl daemon-reload && systemctl restart docker

2.kubernetes集群部署

a.安装初始化Kubernetes需要软件包

  • kubeadm: 用于初始化集群的指令;kubelet: 运行在集群所有节点上,负责启动 Pod 和容器等;kubectl: 用于与集群通信的命令行工具
  • 安装kubeadm、kubelet、kubectl
yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6 --nogpgcheck
  • 开机启动kubelet:systemctl enable kubelet
  • 下载k8s所需要的镜像,并load到docker
    • k8simage-1-20-6.tar.gz下载链接:https://pan.baidu.com/s/1K4n61u8yM3sUciiQoKlMPg 提取码:wjq9
    • docker load -i k8simage-1-20-6.tar.gz
      在这里插入图片描述

b.使⽤kubeadm初始化k8s集群

  • 只在主节点(master)上执行此命。 注意:apiserver-advertise-address=your master IP
kubeadm init --kubernetes-version=v1.20.6 \
--apiserver-advertise-address=192.168.0.51 \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/16 \
--ignore-preflight-errors=SystemVerification
上面命令行的含义:
--kubernetes-version 指定k8s版本
--apiserver-advertise-address 指定apiserver的地址
--image-repository 指定镜像仓库地址
--pod-network-cidr 指定pod网络地址
--ignore-preflight-errors 忽略检查

在这里插入图片描述

c.配置kubectl的配置文件config

  • 目的:操作相当于对 kubectl 命令行工具进行初始化,使其能够与 Kubernetes 集群通信
  • 只在主节点上执行下方命令
mkdir -p $HOME/.kube && sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config && sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 查看集群状态:kubectl get nodes(由于还没有安装网络插件,所以下图状态是NotReady)
    在这里插入图片描述
  • 只在主节点上生成配置文件并修改:kubeadm config print init-defaults > a.yaml
    • 修改a.yaml:vim a.yaml(下方代码片中name: zabbixagent-k8smaster这处需要改为自己的master的名称,然后就可以全部复制粘贴,将a.yaml替换)
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 10.104.26.192
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  imagePullPolicy: IfNotPresent
  name: zabbixagent-k8smaster
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.20.6
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/12
scheduler: {}
  • 在三台机器上都执行,修改containerd配置⽂件:
    • containerd config default > /etc/containerd/config.toml
    • vi /etc/containerd/config.toml
# 添加下⾯内容 
SystemdCgroup = true 
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.7"

在这里插入图片描述

  • 三台机器重启运行时:systemctl restart containerd
  • 在主节点上,重新初始化主节点:kubeadm init --config a.yaml(如果此步骤报错,可能的情况之一是:a.yaml中两个apiVersion:应该改为kubeadm.k8s.io/v1beta2)
    在这里插入图片描述
  • mkdir -p $HOME/.kube && sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config && sudo chown ( i d − u ) : (id -u): (idu):(id -g) $HOME/.kube/config

d.扩容k8s集群-添加node节点

  • 目的:将另外两台节点加入到集群中
  • 两台node机器分别执行:
    • systemctl restart containerd
  • 然后在主节点执行:kubeadm token create --print-join-command(这一步是获取node节点加入master所需的token等信息。)
  • 主节点打印出来的东西,复制到两个node上执行,看下面这张图
    在这里插入图片描述
  • 在master上查看集群信息:kubectl get nodes
    在这里插入图片描述
解释: 
1.ROLES为<none>,说明这个节点时工作节点  
2. STATUS为NotReady,说明这个节点还没有安装网络插件
  • 主节点上执行。将两个节点的roles设置为workers:
    • kubectl label node k8snode1 node-role.kubernetes.io/worker=worker
    • kubectl label node k8snode2 node-role.kubernetes.io/worker=worker

在这里插入图片描述

3.布置⽹络插件

a.安装⽹络插件

  • 去https://github.com/hqs2212586/docker-study/blob/main/calico.yaml下载calico.yaml,然后上传到master节点
  • master上执行,使用yaml文件安装calico.yaml:kubectl apply -f calico.yaml
  • master执行,查看节点状态:kubectl get nodes
    在这里插入图片描述

b.测试在k8s创建pod是否可以正常访问网络

  • 在两台node节点拉取busybox:1.28镜像:docker pull busybox:1.28
    ![[image-20231211185738265.png]]
  • 在主节点创建 pod:kubectl run busybox --image=busybox:1.28 --restart=Never --rm -it busybox – sh(当出现/ #时ping一个网址,能ping通说明网络是通的)
    在这里插入图片描述

c.测试k8s集群部署tomcat服务

  • 在两个node节点 pull tomcat:docker pull tomcat:8.5-jre8-alpine
  • 在 master节点创建tomcat.yaml:vim tomcat.yml
apiVersion: v1  #pod属于k8s核心组v1
kind: Pod  #创建的是一个Pod资源
metadata:  #元数据
  name: demo-pod  #pod名字
  namespace: default  #pod所属的名称空间
  labels:
    app: myapp  #pod具有的标签
    env: dev      #pod具有的标签
spec:
  containers:      #定义一个容器,容器是对象列表,下面可以有多个name
  - name:  tomcat-pod-java  #容器的名字
    ports:
    - containerPort: 8080
    image: tomcat:8.5-jre8-alpine   #容器使用的镜像
    imagePullPolicy: IfNotPresent
  • 在 master节点创建pod:kubectl apply -f tomcat.yaml
    在这里插入图片描述
  • 在 master节点创建tomcat-service.yml:vim tomcat-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: tomcat
spec:
  type: NodePort
  ports:
    - port: 8080
      nodePort: 30080
  selector:
    app: myapp
    env: dev
  • 在 master节点创建pod:kubectl apply -f tomcat-service.yaml
  • 查看服务状态:kubectl get svc

在这里插入图片描述

  • 访问三台机器ip加30080,看到Tomcat初始界面
    在这里插入图片描述
    在这里插入图片描述

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

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

相关文章

C语言leetcode集训一:数组

为了进一步巩固C语言基础&#xff0c;同时进一步了解leetcode刷题的流程&#xff0c;开始进行C语言的集训&#xff0c;今天是第一天&#xff0c;看看我都做了哪些题&#xff0c;因为周末&#xff0c;有点颓废&#xff0c;所以基本上都是简单题&#xff0c;现在只想睡觉...... 有…

ultralytics yolo图像分类训练案例;pytorch自有数据集图像分类案例

1、ultralytics yolo图像分类训练案例 优点:使用方便,训练过程评估指标可以方便查看 缺点:自带模型少,可选择自定义小 参考:https://docs.ultralytics.com/tasks/classify/#val https://blog.csdn.net/weixin_42357472/article/details/131412851 1)数据集格式 https://…

一文让你认识什么是springboot(创建第一个 SpringBoot 程序)

文章目录 前言1. 环境准备2. Maven3. 第一个 SpringBoot 程序3.1 SpringBoot 介绍3.2 SpringBoot 项⽬创建3.2.1 使用 IDEA 创建3.2.2 网页版创建&#xff08;了解&#xff09; 3.3 项目代码和目录介绍3.3.1 观察pom⽂件3.3.2 父工程3.3.3 目录介绍 3.4 运行项目3.5 输出 Hello…

STM32——串口

串口发送/接收函数&#xff1a; HAL_UART_Transmit(); 串口发送数据&#xff0c;使用超时管理机制 HAL_UART_Receive(); 串口接收数据&#xff0c;使用超时管理机制 HAL_UART_Transmit_IT(); 串口中断模式发送 HAL_UART_Receive_IT(); 串口中断模式接收 HAL_UART_Tran…

线上业务优化之案例实战

本文是我从业多年开发生涯中针对线上业务的处理经验总结而来&#xff0c;这些业务或多或少相信大家都遇到过&#xff0c;因此在这里分享给大家&#xff0c;大家也可以看看是不是遇到过类似场景。本文大纲如下&#xff0c; 后台上传文件 线上后台项目有一个消息推送的功能&#…

thinkphp 使用array_reduce 处理返回的数据格式

我想要的效果&#xff1a; 不使用array_reduce 的效果 &#xff1a; 代码&#xff1a; public function teamList($userId,$good_id){$nowbuyers $this->order->where(good_id,$good_id)->count();$data GroupTotalOrder::alias(t_order)->where(merchant_Id,$u…

每日一题 2454. 下一个更大元素 IV(困难,单调栈)

首先考虑第一大整数问题维护一个单调栈&#xff0c;遍历 nums&#xff0c;弹出栈中所有小于 nums[i] 的数&#xff0c;而 nums[i] 就是这些被弹出的数的第一大整数&#xff0c;知道栈为空或者栈顶元素比 nums[i] 大&#xff0c;证明如下&#xff0c;首先由于是遍历&#xff0c;…

Knowledge Graph知识图谱—9. Knowledge Modeling

9. Knowledge Modeling & Ontology Engineering How should the knowledge in a KG be modeled? – Which classes of entities do we have? – Which relations connect them? – Which constraints hold for them? → these questions are defined in the ontology …

【智能家居】九、停车场车牌识别功能点(回调、解耦)

一、翔云 人工智能开放平台&#xff08;车牌识别&#xff09; 二、cJSON 库 三、实现代码 四、回调函数 五、人脸识别和车牌识别获取数据的区别 六、异步网络请求和同步网络请求的区别 七、解耦 一、翔云 人工智能开放平台&#xff08;车牌识别&#xff09; 翔云 人工智能开放…

vxe-table 右键菜单+权限控制(v3)

1.menu-config 是用于配置右键菜单的属性。通过 menu-config 属性&#xff0c;定义右键菜单的内容、显示方式和样式。 通过 menu-config 属性配置了右键菜单&#xff0c;其中的 options 属性定义了右键菜单的选项。用户在表格中右键点击时&#xff0c;将会弹出包含这些选项的自…

数据库系统原理与实践 笔记 #12

文章目录 数据库系统原理与实践 笔记 #12事务管理和并发控制与恢复(续)并发控制SQL-92中的并发级别基于锁的协议基于锁的协议的隐患锁的授予封锁协议两阶段封锁协议多粒度粒度层次的例子意向锁类型相容性矩阵多粒度封锁模式基于时间戳的协议基于时间戳协议的正确性基于有效性检…

mysql:用SHOW CREATE TABLE tbl_name查看创建表的SQL语句

https://dev.mysql.com/doc/refman/8.2/en/show-create-table.html 可以用SHOW CREATE TABLE tbl_name查看创建表的SQL语句。 例如&#xff0c;SHOW CREATE TABLE test_table;表示查询创建test_table表的SQL语句&#xff1a;

关于电动机智能综合保护器在煤矿内的应用分析-安科瑞 蒋静

摘要 &#xff1a;介绍了矿用电动机智能综合保护器系统的总体结构&#xff0c;采用直接将交流信号整流、滤波、调理、采样的方式变为微控制器能够识别的直流信号&#xff0c;通过对微控制器采集到的直流信号编程判断来实现对电动机的相关保护控制、故障显示与报警以及与上位机的…

Jmeter性能测试:ForEach控制器的用法解析(含视频讲解)

引言 最近我在进行JMeter性能测试时遇到了一些问题&#xff0c;特别是在使用ForEach控制器时感到有点棘手。 但是经过不断地摸索和实践&#xff0c;终于成功地掌握了这个神奇的工具&#xff0c;提高了我的测试效率。因此&#xff0c;今天我想和大家分享我的经验&#xff0c;让…

优思学院|如何建立公司运营指标体系?如何推行六西格玛改进运营指标?

关键绩效指标 (KPI) 是测量您团队或组织朝重要商业目标进展表现如何的量化指标&#xff0c;组织会在多个层面使用 KPI&#xff0c;这视乎您想要追踪何指标而定&#xff0c;您可以设定全组织的、特定团队的、或甚至是个人 KPI。 良好的KPI能让公司管理者掌握组织的营运是否进度…

【(较大规模)作业车间调度JSP】通过OR-Tools的区间变量建模求解的效率对比实验

文章目录 问题描述Python调用OR-Tools建模求解&#xff08;实验一&#xff09;1. 声明问题的模型2. 创建区间变量3. 创建约束条件4. 求解模型5. 基于 plotly 展示甘特图 不同场景下的求解效率对比实验二&#xff1a;工件的工序数有差异实验三&#xff1a;消除工件的加工时长差异…

php实现个性化域名(短网址)和个性化登录模版的解决方案

在PHP中&#xff0c;个性化域名通常指的是根据用户或业务需求动态生成具有特定规律的子域名。实现个性化域名的方法主要依赖于服务器配置和路由规则。下面是一些基本的步骤和考虑因素&#xff0c;以帮助你了解如何个性化域名&#xff0c;并了解这样做的好处。 如何实现个性化域…

Cohort Analysis是什么

Cohort Analysis 什么是Cohort Analysis Cohort Analysis 可以翻译成 群体分析 或 分组分析&#xff0c;其实是一种通过细分来研究数据的方法。如下表就是一个从每日新增维度细分的 Cohort Analysis 表格。 第一列是分组的维度&#xff0c;下表以用户新增的日期作为细分的维…

Docker安装与使用

Docker 1.初识Docker Docker如何解决大型项目依赖关系复杂&#xff0c;不同组件依赖的兼容性问题&#xff1f; Docker允许开发中将应用、依赖、函数库、配置一起打包&#xff0c;形成可移植镜像Docker应用运行在容器中&#xff0c;使用沙箱机制&#xff0c;相互隔离 Docker…

“未来医疗揭秘:机器学习+多组学数据,开启生物医学新纪元“

在当今的数字化时代&#xff0c;科技正在不断地改变着我们的生活&#xff0c;同时也为医疗领域带来了巨大的变革。随着机器学习的快速发展&#xff0c;以及多组学数据在生物医学中的应用&#xff0c;我们正开启一个全新的医疗纪元。这个纪元以精准诊断、个性化治疗和高效康复为…