当前位置: 首页 > 编程日记 > 正文

helm部署仓库中没有的包_Kubernetes的Helm软件包管理器简介

helm部署仓库中没有的包

Before we dive into the Helm package manager, I'm going to explain some key concepts to deploying any application anywhere. I'll also give you a brief introduction to Kubernetes terminology.

在深入研究Helm软件包管理器之前 ,我将解释一些在任何地方部署任何应用程序的关键概念。 我还将为您简要介绍Kubernetes术语 。

什么是Kubernetes? (What is Kubernetes?)

Kubernetes (K8s) is an open-source system for automating deployment, scaling, and management of containerized applications

Kubernetes(K8s)是一个开源系统,用于自动化容器化应用程序的部署,扩展和管理

Kubernetes (K8s) is an open-source system for automating deployment, scaling, and management of containerized applications kubernetes.io

Kubernetes(K8s)是一个开源系统,用于自动化容器化应用程序kubernetes.io的部署,扩展和管理。

Now you might be asking yourself, "Well, what does that mean?"

现在您可能会问自己:“嗯,那是什么意思?”

Kubernetes is essentially a very nice set of APIs for deploying, managing, and scaling applications.

Kubernetes本质上是一组非常好的API,用于部署,管理和扩展应用程序。

The applications are packaged with Docker, and then the logic surrounding the deployment of the application is expressed using Helm templates. The templates themselves are instructions that are then run using the Kubernetes API.

应用程序与Docker打包在一起,然后使用Helm模板表达围绕应用程序部署的逻辑。 模板本身就是使用Kubernetes API运行的指令。

There are a ton of Helm packages already created to take care of your application deployment needs!

已经创建了大量的Helm软件包来满足您的应用程序部署需求!

I like to think of Kubernetes + Helm as a one stop shop for my application DevOps needs.

我喜欢将Kubernetes + Helm视为满足我的应用程序DevOps需求的一站式服务。

有趣的事实时间! (Fun Fact Time!)

The entire container ecosystem, including Docker, has a very fun nautical theme. Docker has whales, Kubernetes has pods (of whales), and its logo looks like the steering portion of a ship, and Helm is the helm of a ship.

包括Docker在内的整个容器生态系统都有一个非常有趣的航海主题。 Docker有一条鲸鱼,Kubernetes有(鲸鱼)吊舱,其徽标看起来像是船舶的转向部分,Helm是船舶的头盔。

Aren't they cute?

他们不是很可爱吗?

在Kubernetes上部署应用程序 (Deploying an Application on Kubernetes)

First of all, no matter where you deploy an application there are going to be some things that remain the same anywhere, and I do mean anywhere! ;-) Whether you are deploying to your laptop, a remote server, an AWS EC2 instance, High Performance Computing systems, or Kubernetes, the underlying concepts do not change.

首先,无论您将应用程序部署在何处,都会在某些地方保持相同而我的意思是在任何地方! ;-)无论您是部署到便携式计算机,远程服务器,AWS EC2实例,高性能计算系统还是Kubernetes,其基本概念都不会改变。

I think of pretty much everything, tech concepts in particular, as a series of layers. Once you understand what those fundamental layers are you can get cooking.

我将几乎所有内容(尤其是技术概念)视为一系列层次。 了解了这些基本层之后,您就可以开始烹饪了。

应用层 (Application Layers)

These are:

这些是:

GeneralKubernetes
Data LayerPVC or Persistent Volume Claims
Application LayerPods
ServicesSVC
一般Kubernetes
资料层PVC或永久体积声明
应用层豆荚
服务SVC

Let's take these on one at a time.

让我们一次来处理这些。

Data Layer / Persistent Volume Claims (PVCs)

数据层/永久体积声明(PVC)

This is nice and straight forward. When you need to persist data you persist it to a filesystem. This can be local storage or some sort of networked file system (NFS). If you are using a database the database also eventually persists to a filesystem.

这很好,很简单。 当您需要保留数据时,可以将其保留到文件系统中。 这可以是本地存储,也可以是某种网络文件系统(NFS)。 如果您使用的是数据库,则数据库最终还将持久保存到文件系统中。

Application Layer / Pods

应用层/豆荚

The application layer is what we typically think of in a deployment. Its the part we apt-get install, npm run or docker run. An application could be an NGINX web server, a Python or Node.js app, or a Spark application to name a few.

应用层是我们通常在部署中所想到的。 它是我们apt-get installnpm rundocker run 。 应用程序可以是NGINX Web服务器,Python或Node.js应用程序或Spark应用程序。

Applications are either Kubernetes Deployments or Stateful Set, depending on whether or not they persist data (or have a state).

应用程序是Kubernetes 部署还是状态集 ,具体取决于它们是否保留数据(或具有状态)。

A MySQL database would be an example of a Stateful application. It needs to keep track of information about itself.

MySQL数据库将是有状态应用程序的示例。 它需要跟踪有关自身的信息。

An NGINX server would be a Kubernetes Deployment, because it does not need to keep track of any information about itself — it is stateless.

NGINX服务器将是Kubernetes部署,因为它不需要跟踪有关其自身的任何信息-它是无状态的

Services Layer / SVC

服务层/ SVC

The services layer is where we expose our Application to the outside world. This is generally accomplished by saying "Hey, I have an app running on this port". You might have run these directly, or done something like a proxy pass in NGINX or Apache.

服务层是我们将应用程序暴露给外界的地方。 通常可以通过说“嘿,我在此端口上运行一个应用程序”来完成此操作。 您可能已经直接运行了它们,或者在NGINX或Apache中做了类似代理传递的操作。

站点可靠性层 (Site Reliability Layers)

Site reliability is our ability to confidently say our application is up, running, and will probably stay up and running!

站点可靠性是我们自信地说我们的应用程序已启动,正在运行,并且可能会继续运行的能力!

To be real, we want an API to essentially do this. 😜

确实,我们希望API能够做到这一点。 😜

XKCD - Hard Reboot

XKCD-硬重启

XKCD Hard Reboot
GeneralKubernetes
Monitoringmetrics-server
Scaling (or Load Balancing)Horizontal Pod Autoscaler (HPA)
Service RulesContainer specs
一般Kubernetes
监控方式指标服务器
扩展(或负载平衡)水平荚自动缩放器(HPA)
服务规则容器规格

Monitoring Layer / Metrics Server

监控层/度量服务器

The monitoring layer answers the question "How is our app doing"? Ideally it would answer questions like "How much CPU is left on that machine?" and "Are we out of memory yet"?

监视层回答问题“我们的应用程序如何运行”? 理想情况下,它将回答诸如“该计算机上还剩多少CPU?”之类的问题。 和“我们内存不足了吗”?

Scaling Layer / HPA

缩放层/ HPA

Have you ever had an application that worked great until too many people started using it at once? You take care of this by scaling the instances of your application up or down.

在有太多人一次使用它之前,您是否曾经有过一款性能良好的应用程序? 您可以通过向上或向下缩放应用程序实例来解决此问题。

With web applications, you'll often see the term load balancing, too. This functionality is built into many process managers and https servers such as PM2 and Gunicorn.

在Web应用程序中,您也经常会看到术语负载平衡。 许多流程管理器和https服务器(例如PM2和Gunicorn)都内置了此功能。

In Kubernetes you accomplish this with a Horizontal Pod Autoscaler, or HPA, which you give specific rules for how to scale up or down.

在Kubernetes中,您可以使用Horizo​​ntal Pod Autoscaler或HPA来完成此任务,您可以为其指定具体的缩放比例规则。

Service Rules Layer

服务规则层

Have you ever wanted to automate when / how your application should restart? Maybe you want it to restart 3 times and then give up. Or maybe you want it to restart, but not right away.

您是否曾经想过何时/如何重启应用程序进行自动化? 也许您希望它重新启动3次,然后放弃。 或者,也许您希望它重新启动,但不立即启动。

Give it some time! You may also want some objective measure to test whether or not you application is up and running.

给它一点时间! 您可能还需要一些客观的措施来测试您的应用程序是否已启动并正在运行。

在Kubernetes上部署应用程序 (Deploying Applications on Kubernetes)

Kubernetes applications can be deployed either through the CLI, or by writing YAML templates that describe the various PVCs, Pods (whether they are Deployments or Stateful sets), and Service (SVC) layers.

Kubernetes应用程序可以通过CLI进行部署,也可以通过编写描述各种PVC,Pod(无论是Deployment还是Stateful集)和Service(SVC)层的YAML模板进行部署。

头盔包管理器 (The Helm Package Manager)

Helm is the best way to find, share, and use software built for Kubernetes.

Helm是查找,共享和使用为Kubernetes构建的软件的最佳方法。

Helm is the best way to find, share, and use software built for Kubernetes. https://helm.sh/

Helm是查找,共享和使用为Kubernetes构建的软件的最佳方法。 https://helm.sh/

The Helm package manager allows us to wire up complex Kubernetes deployments into a single package, that can be installed with a single command.

Helm软件包管理器使我们能够将复杂的Kubernetes部署连接到一个软件包中,该软件包可以使用单个命令进行安装。

Helm uses a templating language on top of Kubernetes YAML definitions to allow more versatility to our deployments.

Helm在Kubernetes YAML定义之上使用了模板语言,以使我们的部署更具通用性。

Probably the most important point to note with Helm is that it has been widely accepted by the community. This means that there are lots of resources for using Helm, getting started, and also oodles of preconfigured Helm Charts!

Helm可能要注意的最重要一点是,它已被社区广泛接受。 这意味着有很多使用Helm的资源,入门指南以及大量预配置的Helm Charts!

It's very rare for me to ever have to create a Helm package completely from scratch. I can nearly always find a good starting point from one or more of the Helm charts that are already available.

对于我而言,完全从零开始创建Helm软件包非常罕见。 我几乎总是可以从一个或多个可用的Helm图表中找到一个良好的起点。

在Kubernetes上部署NGINX (Deploy NGINX on Kubernetes)

First, let's talk about a base NGINX deployment without Helm.

首先,让我们谈谈没有Helm的基本NGINX部署。

As you can see, there is a lot of stuff to keep track of and we probably wouldn't be typing this by hand. That is where the Helm package manager comes in, but it's good to take a look to know what is happening first! ;-)

如您所见,有很多东西需要跟踪,我们可能不会手工输入。 这就是Helm软件包管理器的用武之地,但是最好先了解一下发生了什么! ;-)

Now let's break down the different parts of the Kubernetes Deployment definition.

现在让我们分解一下Kubernetes部署定义的不同部分。

Metadata

元数据

I want to very briefly touch on the labels. Only briefly, because chances are you will be fine with the defaults and not need to touch them.

我想非常简短地触摸一下labels 。 仅简要介绍一下,因为您可以使用默认设置,而无需触摸它们。

One of the goals of Kubernetes is that it should abstract the actual physical server away. You shouldn't usually have to care if your app is running on node1 or node2. Of course at some point you do care, and then you will start to get into labels.

Kubernetes的目标之一是应该将实际的物理服务器抽象出来。 通常,您不必关心您的应用程序是在node1还是node2上运行。 当然,在某些时候您确实会在意,然后您将开始涉足标签。

Until then, don't worry about them and just stick with the defaults.

在此之前,请不要担心它们,而只需遵循默认值即可。

Containers

货柜

This is the part of the application that will be most relevant to you when you are deploying applications. You need to define your containers.

这是应用程序中与您部署应用程序最相关的部分。 您需要定义容器。

A single Deployment Pod can have many containers. That container has, at the very least a name, a repo, and a tag:

单个Deployment Pod可以具有多个容器。 该容器至少具有一个name ,一个repo和一个tag

Once you have the base you need to define the ports that will get picked up by the service. See that separation of concerns?:

一旦有了基础,就需要定义将由服务使用的端口。 看到关注点分离了吗?:

App Rules

应用规则

Then, at some point, we want to know if our app is running. We can even determine exactly where it is in it's lifecycle with the various hooks:

然后,在某个时候,我们想知道我们的应用程序是否正在运行。 我们甚至可以使用各种挂钩来确定它在生命周期中的确切位置:

Names

名字

This is more of a general concept, but I do want to point out that giving things names is very important in the Kubernetes ecosystem. Notice that we gave our container and port a name. Later on when we need to refer to them we use that name.

这更多是一个笼统的概念,但我确实要指出,在Kubernetes生态系统中,给事物起名字非常重要。 注意,我们给containerport name 。 稍后,当我们需要引用它们时,我们使用该name

使用Helm Chart在Kubernetes上部署NGINX (Deploy NGINX on Kubernetes with a Helm Chart )

The Helm package manager creates a series of templates that can be modified through the Helm CLI. Each of these templates corresponds to one of our Kubernetes types that we discussed earlier.

Helm软件包管理器创建了一系列模板,可以通过Helm CLI对其进行修改。 这些模板中的每一个都对应于我们前面讨论的Kubernetes类型之一。

Here is an example of the bitnami/nginx helm chart:

这是bitnami / nginx舵图的示例:

Here is that same block with the Helm templating language. For the sake of brevity I have omitted some parts of the template. If you would like to see the whole thing you can take a look at it in the GitHub repo.

这与Helm模板语言相同。 为了简洁起见,我省略了模板的某些部分。 如果您想了解全部内容,可以在GitHub存储库中进行查看。

(This is for demonstration purposes and is not a fully functional Helm chart. Please don't use this. Grab the actual Helm chart instead.)

(这只是出于演示目的,而不是功能齐全的Helm图表。请不要使用它。而是获取实际的Helm图表。)

“舵模板”值从何而来? (Where do the Helm Template values come from?)

Now, this is what I really like about Helm. The values that are exposed in the template come from one of two places.

现在,这就是我真正喜欢Helm的原因。 模板中公开的值来自两个位置之一。

Templated Functions

模板化功能

They come from the template itself, as shown here.

它们来自模板本身,如下所示。

{{ template "nginx.fullname" . }}

We can find that this is defined in our templates/_helpers.tpl, which is a way of getting more complex functions that we could get with just a yaml file.

我们可以发现这是在我们的templates/_helpers.tpl定义的,这是一种获取更复杂功能的方法,而这些功能可以通过yaml文件获得。

Values exposed in the Values.yaml

在Values.yaml中公开的值

This is actually a very neat feature and what makes Helm so powerful and configurable.

这实际上是一个非常简洁的功能,这使Helm如此强大和可配置。

Each Helm chart comes along with a values.yaml. You can put whatever you want in the values.yaml, and then use it throughout your Helm chart, and it's exposed through the CLI!

每个Helm图表都带有values.yaml 。 您可以将所需的内容放在values.yaml ,然后在整个Helm图表中使用它,并且它通过CLI公开!

Then we see this referred to in our templates as:

然后,我们在模板中将其称为:

Everything in the values.yaml can also be modified through the Helm CLI:

还可以通过Helm CLI修改values.yaml所有内容:

It would then render the containers[0].image as image: docker.io/bitnami/nginx:my-new-tag

然后它将containers[0].imageimage: docker.io/bitnami/nginx:my-new-tag

结语 (Wrap Up)

That's it! I hope that you've learned a little about Kubernetes and its package manager Helm. Hopefully it isn't quite as scary as it once was.

而已! 我希望您对Kubernetes及其程序包管理器Helm有所了解。 希望它不会像以前那样可怕。

翻译自: https://www.freecodecamp.org/news/an-introduction-to-the-helm-package-manager-for-kubernetes/

helm部署仓库中没有的包

相关文章:

mem 族函数的实现

1.void * memcpy ( void * dest, const void * src, size_t num ); 头文件&#xff1a;#include <string.h>memcpy() 用来复制内存&#xff0c;memcpy() 会复制 src 所指的内存内容的前 num 个字节到 dest 所指的内存地址上。memcpy() 并不关心被复制的数据类型&#xff…

快排递归非递归python_Python递归神经网络终极指南

快排递归非递归pythonRecurrent neural networks are deep learning models that are typically used to solve time series problems. They are used in self-driving cars, high-frequency trading algorithms, and other real-world applications.循环神经网络是深度学习模型…

我的hadoop学习之路

Hadoop实现了一个分布式文件系统&#xff08;Hadoop Distributed File System&#xff09;&#xff0c;简称HDFS。HDFS有高容错性的特点&#xff0c;并且设计用来部署在低廉的&#xff08;low-cost&#xff09;硬件上。 Hadoop的框架最核心的设计就是&#xff1a;HDFS和MapRedu…

日期处理工具类 -【二】

1、返回本周的第一天(周日为每周第一天) 1 /**2 * 返回本周的第一天(周日为每周第一天)3 * return4 */5 public static String getTheFirstDayOfThisWeek(){6 SimpleDateFormat format new SimpleDateFormat("yyyy-MM-dd");7 Calendar cal Calendar.get…

超越对手pdf_如何创建一个超越竞争对手的移动应用

超越对手pdfThe amount of time people spend on their mobile phones has increased over the years, and so has the number of people using mobile devices.多年来&#xff0c;人们在手机上花费的时间增加了&#xff0c;使用移动设备的人数也增加了。 It’s safe to say t…

vue路由对象($route)参数简介

路由对象在使用了 vue-router 的应用中&#xff0c;路由对象会被注入每个组件中&#xff0c;赋值为 this.$route &#xff0c;并且当路由切换时&#xff0c;路由对象会被更新。 so , 路由对象暴露了以下属性&#xff1a; 1.$route.path 字符串&#xff0c;等于当前路由对象的路…

join......on 后面的and 和where的区别

a.where 是在两个表join完成后&#xff0c;再附上where条件。   b. and 则是在表连接前过滤A表或B表里面哪些记录符合连接条件&#xff0c;同时会兼顾是left join还是right join。即   假如是左连接的话&#xff0c;如果左边表的某条记录不符合连接条件&#xff0c;那么它不…

block的运用

cell的.h文件 typedef void(^ActivityCellBlock)(NSString *str); interface ActivityCell : UITableViewCell property (nonatomic,strong) NSArray *labelAry; property (nonatomic,copy) ActivityCellBlock myBlock; -(void)showCell:(ActivityCellBlock)myBlock; cel…

如何在Ubuntu 20.04上设置Python虚拟环境

I recently got myself a “new” laptop – a Lenovo x270 (yay)! And once again I needed to set up a Python virtual environment. So of course I Googled for a solution, just to find my previously written article on the same topic!我最近给自己买了一台“新”笔记…

getURLParameters - 网址参数

返回包含当前URL参数的对象。 通过适当的正则表达式&#xff0c;使用 String.match() 来获得所有的键值对&#xff0c; Array.reduce() 来映射和组合成一个单一的对象。 将 location.search 作为参数传递给当前 url。 const getURLParameters url >url.match(/([^?&])…

block的使用

#import "ViewController.h" /* 使用Block最大的一个好处就是可以在代码块中随时访问外部变量 比如你在A.class类中的某个方法中声明了一段代码块.你可以在代码块中直接对A.class所拥有的成员变量进行调用,并且,通过一定的条件(__block),还可以随时的修改这…

关于二级菜单的问题

大家在做二级菜单的时候经常会碰到鼠标移出一级菜单&#xff0c;二级菜单瞬间消失&#xff0c;根本不给你机会移到二级菜单上&#xff0c;今天分享下怎样解决这个问题。 ①第一种介绍一种简单粗暴的方法&#xff0c;二级菜单的元素放入一级菜单中。 代码地址&#xff1a;http:h…

python打印换行符_Python换行符以及如何在不使用换行符的情况下进行Python打印

python打印换行符Welcome! The new line character in Python is used to mark the end of a line and the beginning of a new line. Knowing how to use it is essential if you want to print output to the console and work with files.欢迎&#xff01; Python中的新行字…

tomcat启动后 项目运行缓慢,要几十到几百秒不等 怎么样./startup.sh 运行加快

修改 linux系统中 /usr/local/jdk1.8.0_11/jre/lib/security/java.security 借力 好文章。我们新的Linux系统&#xff0c;部署了多个 Tomca&#xff0c;同时重启后t, 每次都阻塞差不多260秒左右。修改之后总的启动时间下降到6-8秒左右。另外&#xff0c;不确定为什么&#xff0…

转载 C#中使用结构来传递多个参数

C#中当参数超过5个时&#xff0c;建议用结构来传递多个参数。 示例代码如下&#xff1a; 1 public struct MyStruct2 {3 public string str;4 public int number;5 }6 7 class Program8 {9 static void Main(string[] args) 10 { 11 MyStruct myStruct…

xmpp 开源项目选择_如何选择和维护安全的开源项目

xmpp 开源项目选择评估开源项目安全性的一些技巧。 (A few tricks for assessing the security of an open source project.) There is a rather progressive sect of the software development world called the open source community. 在软件开发领域&#xff0c;有一个相当…

【2018-01-22】HTML-表单及表单元素

<body><!--表单--><form action"" method"post"><!--文本类--><input type"text" value"" placeholder"请输入用户名"/><!--文本框--><input type"password" value"…

取消tableView多余的横线

- (void)setExtraCellLineHidden: (UITableView *)tableView{UIView *view [UIView new];view.backgroundColor [UIColor clearColor];[tableView setTableFooterView:view];}

iOS 自定义UITabBar

推荐一篇非常好的集成各种UITabBar的三方库 《点击这里直取demo》 另外一篇根据runtime定制了一款可以出轨的UITarBar 《Runtime实战之定制TabBarItem大小》 点击view的触发机制《iOS事件分发机制&#xff08;一&#xff09; hit-Testing》 摘自&#xff1a; UIView中提供两个…

react入门代码_如何在React中构建温度控制应用程序-包括提示和入门代码

react入门代码我们正在建立的 (What were building) In this beginner React project, were going to learn how to use state hooks, handle events, apply CSS based on state, and more! Check it out: 在这个初学者的React项目中&#xff0c;我们将学习如何使用状态挂钩&am…

决策树(chap3)Machine Learning In Action学习笔记

优点&#xff1a;计算复杂度不高&#xff0c;输出结果易于理解&#xff0c;对中间值的缺失不敏感&#xff0c;可以处理不相关特征数据。缺点&#xff1a;可能会产生过度匹配问题。适用数据类型&#xff1a;数值型&#xff08;必须离散化&#xff09;和标称型。决策树创建分支的…

BigdCIMAL类型数据的使用选择

现在常用的数值类型有Integer , Double , Float , BigDecimal几种 , 常用的当然要数前两种 了 , Integer代表的是整数类型的数据 , double则是代表的是浮点型 , 双精度 ,double的计算精度相对于float来讲要 高 , BigDecimal的计算精度则是最高的 . 可是BigDecimal的一些计算方…

数字字符串转化为时间字符串

(NSString *)dateStringFromNumberTimer:(NSString *)timerStr {//转化为Doubledouble t [timerStr doubleValue];//计算出距离1970的NSDateNSDate *date [NSDate dateWithTimeIntervalSince1970:t];//转化为 时间格式化字符串NSDateFormatter *df [[NSDateFormatter alloc]…

git 覆盖本地修改_Git拉力–如何使用Git覆盖本地更改

git 覆盖本地修改When you learn to code, sooner or later youll also learn about Version Control Systems. And while there are many competing tools in this space, one of them is the de facto standard used by almost everyone in the industry. Its so popular tha…

云计算大会记录

一、要点及主要技术内容记录消费金融刘志军 马上消费大额 分散 小额 短期OpenStack OpenStack是一个由NASA&#xff08;美国国家航空航天局&#xff09;和Rackspace合作研发并发起的&#xff0c;以Apache许可证授权的自由软件和开放源代码项目。 OpenStack是一个开源的云计算管…

获取iOS版本号

(double)getCurrentIOS {return [[[UIDevice currentDevice] systemVersion] doubleValue];}

spring boot 服务 正确关闭方式

引言 Spring Boot&#xff0c;作为Spring框架对“约定优先于配置(Convention Over Configuration)”理念的最佳实践的产物&#xff0c;它能帮助我们很快捷的创建出独立运行、产品级别的基于Spring框架的应用&#xff0c;大部分Spring Boot应用只需要非常少的配置就可以快速运行…

如何在5美元的Raspberry Pi上构建个人开发服务器

In this article, youll learn how to build a personal dev server by installing Git, Node.js, Rust, and Docker on a Raspberry Pi. The cheapest option costs just $5. You can get a starter kit ($25) for free here.在本文中&#xff0c;您将学习如何通过在Raspberry…

Eclipse:xml文件中添加.xsd约束文件

今天在使用dubbo的时候&#xff0c;XML文件一直报错。找不到dubbo的xsd约束文件。 cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element dubbo:reference 解决方法&#xff1a; 找到dubbo的jar包&#xff0c;然后在META-…

029 浏览器不能访问虚拟机的问题解决

1.在搭建分布式时 ssh一直不能进行scp&#xff0c;后来发现一个问题。 windows中的hosts配置了三台虚拟机的映射&#xff0c;但是在虚拟机中的hosts没有配置。 做法是在每台虚拟机上都配置三台虚拟机的映射。 2.端口访问与防火墙 最近帮别人解决问题时才注意的。 以前安装好虚拟…