学习您应该已经熟悉使用 Kubernetes 集群。建议按照如下入门指南启动一个临时的集群。首先帮您熟悉 CLI(kubectl)和概念(pods,services等)。您的工作站应该已经存在 ‘kubectl’。这是完成其他入门指南后的一个附加安装。如果没有,请遵循 说明。Cloud ProviderKubernetes 的 Cloud Provider 是一个模块,它提供一个管理 TCP 负载均衡,节点(实例)和网络路由的接口。此接口定义在 pkg/cloudprovider/cloud.go。未实现 Cloud Provider 也可以建立自定义集群(例如使用裸机),并不是所有的接口功能都必须实现,这取决于如何在各组件上设置标识。节点您可以使用虚拟机或物理机。虽然可以使用一台机器构建集群,但为了运行所有的例子和测试,至少需要4个节点。许多入门指南对主节点和常规节点进行区分。 这不是绝对必要的。节点需要使用 x86_64 架构运行某些版本的 Linux。在其他操作系统和架构上运行是可行的,但本指南不会协助指导。Apiserver 和 etcd 可以运行在1个核心和 1GB RAM 的机器上,这适用于拥有数十个节点的集群。 更大或更活跃的集群可能受益于更多的核心。其他节点可以配备任何合理的内存和任意数量的内核。它们不需要相同的配置。网络网络连接Kubernetes 有一个独特的 网络模型。Kubernetes 为每个 pod 分配一个 IP 地址。创建集群时,需要为 Kubernetes 分配一段 IP 以用作 pod 的 IP。最简单的方法是为集群中的每个节点分配不同的 IP 段。 pod 中的进程可以访问其他 pod 的 IP 并与之通信。这种连接可以通过两种方式实现:使用 overlay 网络 overlay 网络通过流量封装(例如 vxlan)来屏蔽 pod 网络的底层网络架构。封装会降低性能,但具体多少取决于您的解决方案。不使用 overlay 网络 配置底层网络结构(交换机,路由器等)以熟知 Pod IP 地址。不需要 overlay 的封装,因此可以实现更好的性能。选择哪种方式取决于您的环境和需求。有多种方法来实现上述的某种选项:使用 Kubernetes 调用的网络插件 Kubernetes 支持 CNI 网络插件接口。有许多解决方案为 Kubernetes 提供插件(按字母顺序排列): CalicoFlannelOpen vSwitch (OVS)RomanaWeave您也可以编写自己的插件。将网络插件直接编译进 Kubernetes 可以通过 cloud provider 模块的 “Routes” 接口来实现。Google Compute Engine(GCE)和 AWS 指南使用此方法。为 Kubernetes 配置外部网络 这可以通过手工执行命令或通过一组外部维护的脚本来完成。您不得不自己实现,此功能可以带来额外的灵活性。需要为 Pod IP 选择一个地址范围。请注意,Pod IP 尚不支持 IPv6。多种方法: GCE:每个项目都有自己的 10.0.0.0/8。从该空间为每个 Kubernetes 集群分配子网 /16,多个集群都拥有自己的空间。 每个节点从该网段获取进一步的子网细分。AWS:整个组织使用一个 VPC ,为每个集群划分一个块,或者为不同的集群使用不同的 VPC。为每个节点的 PodIP 分配同一个 CIDR 子网,或者分配单个大型 CIDR,该大型 CIDR 由每个节点上较小的 CIDR 所组成的。 您一共需要 max-pods-per-node * max-number-of-nodes 个 IP。每个节点配置子网 /24,即每台机器支持 254 个 pods,这是常见的配置。如果 IP 不充足,配置 /26(每个机器62个 pod)甚至是 /27(30个 pod)也是足够的。例如,使用 10.10.0.0/16 作为集群范围,支持最多256个节点各自使用 10.10.0.0/24 到 10.10.255.0/24 的 IP 范围。需要使它们路由可达或通过 overlay 连通。Kubernetes 也为每个 service 分配一个 IP。但是,Service IP 无须路由。在流量离开节点前,kube-proxy 负责将 Service IP 转换为 Pod IP。您需要利用 SERVICE_CLUSTER_IP_RANGE 为 service 分配一段 IP。例如,设置 SERVICE_CLUSTER_IP_RANGE=“10.0.0.0/16” 以允许激活 65534 个不同的服务。请注意,您可以增大此范围,但在不中断使用它的 service 和 pod 时,您不能移动该范围(指增大下限或减小上限)。此外,您需要为主节点选择一个静态 IP。称为 MASTER_IP。打开防火墙以允许访问 apiserver 的端口 80 和/或 443。启用 ipv4 转发,net.ipv4.ip_forward = 1网络策略Kubernetes 可以在 Pods 之间使用 网络策略 定义细粒度的网络策略。并非所有网络提供商都支持 Kubernetes NetworkPolicy API,参阅 使用网络策略 获取更多内容。集群命名您应该为集群选择一个名称。为每个集群选择一个简短的名称并在以后的集群使用中将其作为唯一命名。以下几种方式中都会用到集群名称:通过 kubectl 来区分您想要访问的各种集群。有时候您可能想要第二个集群,比如测试新的 Kubernetes 版本,运行在不同地区的 Kubernetes 等。Kubernetes 集群可以创建 cloud provider 资源(例如AWS ELB),并且不同的集群需要区分每个创建的资源。称之为 CLUSTER_NAME。软件的二进制文件您需要以下二进制文件:etcd以下 Container 运行工具之一: dockerrktKubernetes kubeletkube-proxykube-apiserverkube-controller-managerkube-scheduler下载并解压 Kubernetes 二进制文件Kubernetes 发行版包括所有的 Kubernetes 二进制文件以及受支持的 etcd 发行版。 您可以使用 Kubernetes 的发行版(推荐)或按照 开发人员文档 中的说明构建您的 Kubernetes 二进制文件。本指南仅涉及使用 Kubernetes 发行版。下载并解压 最新的发行版。服务器二进制 tar 包不再包含在 Kubernetes 的最终 tar 包中,因此您需要找到并运行 ./kubernetes/cluster/get-kube-binaries.sh 来下载客户端和服务器的二进制文件。 然后找到 ./kubernetes/server/kubernetes-server-linux-amd64.tar.gz 并解压缩。接着在被解压开的目录 ./kubernetes/server/bin 中找到所有必要的二进制文件。选择镜像您将在容器之外运行 docker,kubelet 和 kube-proxy,与运行系统守护进程的方式相同,这些程序需要单独的二进制文件。对于 etcd,kube-apiserver,kube-controller-manager 和 kube-scheduler,我们建议您将其作为容器运行,因此需要构建相应的镜像。获取 Kubernetes 镜像的几种方式:使用谷歌容器仓库(GCR)上托管的镜像: 例如 gcr.io/google_containers/hyperkube:$TAG,其中 TAG 是最新的版本标签,可在 最新版本页面 上找到。确保
TAG与您使用的kubelet和kube−proxy的发行版标签相同。[hyperkube](https://releases.k8s.io/master/cmd/hyperkube)是一个包含全部组件的二进制文件。hyperkubekubelet... 表示运行kubelet,hyperkubeapiserver... 表示运行一个apiserver,以此类推。构建私有镜像在使用私有镜像库时很有用包含诸如 ./kubernetes/server/bin/kube−apiserver.tar 之类的文件,可以使用诸如 dockerload−ikube−apiserver.tar 之类的命令将其转换为docker镜像。您可以使用命令 dockerimages 验证镜像是否加载正确的仓库和标签。使用etcd:使用谷歌容器仓库(GCR)上托管的 gcr.io/googlecontainers/etcd:2.2.1使用 DockerHub 或 Quay.io 上托管的镜像,比如 quay.io/coreos/etcd:v2.2.1。使用操作系统安装源中的etcd发行版。构建自己的镜像执行:cdkubernetes/cluster/images/etcd;make我们建议您使用Kubernetes发行版中提供的etcd。Kubernetes程序已经使用此版本的etcd进行了广泛的测试,而不是与任何其他版本的etcd。推荐的版本号也可以在 kubernetes/cluster/images/etcd/Makefile 中作为 TAG 的值被找到。该文档的剩余部分假定镜像标签已被选定并存储在相应的环境变量中。例子(替换最新的标签和适当的仓库源):HYPERKUBEIMAGE=gcr.io/googlecontainers/hyperkube:TAGETCD_IMAGE=gcr.io/google_containers/etcd:
ETCDVERSION安全模型两种主要的安全方式:用HTTP访问apiserver使用防火墙进行安全防护安装简单用HTTPS访问apiserver使用带证书的https和用户凭证。这是推荐的方法配置证书可能很棘手。如果遵循HTTPS方法,则需要准备证书和凭证。准备证书您需要准备几种证书:作为HTTPS服务端的主节点需要一个证书。作为主节点的客户端,kubelet可以选择使用证书来认证自己,并通过HTTPS提供自己的API服务。除非您打算用一个真正的CA生成证书,否则您需要生成一个根证书,并使用它来签署主节点,kubelet和kubectl证书。在 认证文档 中描述了如何做到这一点。最终您会得到以下文件(稍后将用到这些变量)CACERT放在运行apiserver的节点上,例如位于 /srv/kubernetes/ca.crt。MASTERCERT被CACERT签名放在运行apiserver的节点上,例如位于 /srv/kubernetes/server.crt。MASTERKEY放在运行apiserver的节点上,例如位于 /srv/kubernetes/server.key。KUBELETCERT可选KUBELETKEY可选准备凭证管理员用户(和任何用户)需要:用于识别他们的令牌或密码。令牌只是长字母数字的字符串,例如32个字符,生成方式TOKEN=(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64 | tr -d “=+/” | dd bs=32 count=1 2>/dev/null)您的令牌和密码需要存储在文件中才能被 apiserver 读取。本指南使用 /var/lib/kube-apiserver/known_tokens.csv。此文件的格式在 身份验证文档 中有描述。为了向客户端分发凭证,Kubernetes 约定将凭证放入 kubeconfig 文件 中。可以创建管理员的 kubeconfig 文件,如下所示:如果您已经使用非定制集群的 Kubernetes(例如,遵循入门指南),那么您已拥有 $HOME/.kube/config 文件。您需要添加证书,密钥和主节点 IP 到 kubeconfig 文件: 如果使用仅防火墙安全选项,则以此方式设置 apiserver: kubectl config set-cluster
CLUSTERNAME−−server=http://MASTER_IP --insecure-skip-tls-verify=true否则,请设置 apiserver ip,客户端证书和用户凭证。 kubectl config set-cluster
CLUSTERNAME−−certificate−authority=CA_CERT --embed-certs=true --server=https://$MASTER_IPkubectl config set-credentials
USER−−client−certificate=CLI_CERT --client-key=
CLIKEY−−embed−certs=true−−token=TOKEN将集群设置为要使用的默认集群 kubectl config set-context
CONTEXTNAME−−cluster=CLUSTER_NAME --user=$USERkubectl config use-context
CONTEXTNAME接下来,为kubelet和kube−proxy创建一个kubeconfig文件。创建多少不同文件有几种选择:使用与管理员相同的凭证−这是最简单的设置。所有kubelet用一套令牌和kubeconfig文件,kube−proxy用一套,管理端用一套。−这是如今在GCE上的方式每个kubelet使用不同的凭证−我们正在改进,但所有的细节还没有准备好。您可以通过拷贝 HOME/.kube/config、参考 cluster/gce/configure-vm.sh 中的代码或者使用下面的模板来创建这些文件:apiVersion: v1
kind: Config
users:
- name: kubelet
user:
token: ${KUBELET_TOKEN}
clusters:
- name: local
cluster:
certificate-authority: /srv/kubernetes/ca.crt
contexts:
- context:
cluster: local
user: kubelet
name: service-account-context
current-context: service-account-context
将 kubeconfig 文件放在每个节点上。以后本指南的例子假设在 /var/lib/kube-proxy/kubeconfig 和 /var/lib/kube-proxy/kubeconfig 中有 kubeconfig。在节点上配置和安装基础软件本节讨论如何将机器配置为 Kubernetes 节点。您应该在每个节点上运行三个守护进程:docker 或者 rktkubeletkube-proxy您还需要在安装操作系统后进行各种其他配置。提示:比较可行的方法是先使用现有的入门指南来设置集群。在集群运行后,您可以从该集群复制 init.d 脚本或 systemd 单元文件,然后修改它们以便在您的自定义集群上使用。Docker所需 Docker 的最低版本随 kubelet 版本的更改而变化。推荐使用最新的稳定版。如果版本太旧,Kubelet 将抛出警告并拒绝启动 pod,请尝试更换合适的 Docker 版本。如果您已经安装过 Docker,但是该节点并没有配置过 Kubernetes,那么节点上可能存在 Docker 创建的网桥和 iptables 规则。您可能需要像下面这样删除这些内容,然后再为 Kubernetes 配置 Docker。iptables -t nat -F
ip link set docker0 down
ip link delete docker0
配置 docker 的方式取决于您是否为网络选择了可路由的虚拟 IP 或 overlay 网络方式。Docker 的建议选项:为每个节点的 CIDR 范围创建自己的网桥,将其称为 cbr0,并在 docker 上设置 --bridge=cbr0 选项。设置 --iptables=false,docker 不会操纵有关主机端口的 iptables(Docker 的旧版本太粗糙,可能会在较新的版本中修复),以便 kube-proxy 管理 iptables 而不是通过 docker。–ip-masq=false 在您把 PodIP 设置为可路由时,需要设置此选项,否则,docker 会将 PodIP 源地址重写为 NodeIP。某些环境(例如 GCE)需要您对离开云环境的流量进行伪装。这类环境比较特殊。如果您正在使用 overlay 网络,请参阅这些说明。–mtu= 使用 Flannel 时可能需要该选项,因为 udp 封装会增大数据包–insecure-registry
CLUSTERSUBNET使用非SSL方式连接到您设立的私有仓库。如果想增加docker的文件打开数量,设置:DOCKERNOFILE=1000000此配置方式取决于您节点上的操作系统。例如在GCE上,基于Debian的发行版使用 /etc/default/docker。通过Docker文档中给出的示例,确保在继续安装其余部分之前,您系统上的docker工作正常。rktrkt 是Docker外的另一种选择,您只需要安装Docker或rkt之一。其最低版本要求 v0.5.6。您的节点需要 systemd 来运行rkt。匹配rktv0.5.6的最小版本是 systemd215。对rkt的网络支持还需要 rkt元数据服务。您可以使用命令启动rkt元数据服务 sudosystemd−runrktmetadata−service然后,您需要将该参数配置到kubelet:−−container−runtime=rktkubelet所有节点都应该运行kubelet。参阅 软件的二进制文件。要考虑的参数:如果遵循HTTPS安全方法:−−api−servers=https://MASTER_IP–kubeconfig=/var/lib/kubelet/kubeconfig否则,如果采取基于防火墙的安全方法 --api-servers=http://
MASTERIP−−config=/etc/kubernetes/manifests−−cluster−dns= 指定要设置的DNS服务器地址,(请参阅启动群集服务。)−−cluster−domain= 指定用于集群DNS地址的dns域前缀。−−docker−root=−−root−dir=−−configure−cbr0= (如下面所描述的)−−register−node (在 节点 文档中描述)kube−proxy所有节点都应该运行kube−proxy。(并不严格要求在“主”节点上运行kube−proxy,但保持一致更简单。)下载使用kube−proxy的方法和kubelet一样。要考虑的参数:如果遵循HTTPS安全方法:−−master=https://MASTER_IP–kubeconfig=/var/lib/kube-proxy/kubeconfig否则,如果采取基于防火墙的安全方法 --master=http://KaTeX parse error: Double subscript at position 51: …od 网络。称为 NODE_X_̲POD_CIDR。需要在每个节…NODE_X_POD_CIDR 获取一个地址,按惯例是第一个 IP。称为 NODE_X_BRIDGE_ADDR。例如,如果 NODE_X_POD_CIDR 是 10.0.0.0/16,则NODE_X_BRIDGE_ADDR 是 10.0.0.1/16。 注意:由于以后使用这种方式,因此会保留后缀 /16。推荐自动化方式: 在 kubelet init 脚本中设置 --configure-cbr0=true 选项并重新启动 kubelet 服务。Kubelet 将自动配置 cbr0。 直到节点控制器设置了 Node.Spec.PodCIDR,网桥才会配置完成。由于您尚未设置 apiserver 和节点控制器,网桥不会立即被设置。或者使用手动方案: 在 kubelet 上设置 --configure-cbr0=false 并重新启动。创建一个网桥。 ip link add name cbr0 type bridge
设置适当的 MTU。 注意:MTU 的实际值取决于您的网络环境。 ip link set dev cbr0 mtu 1460
将节点的网络添加到网桥(docker 将在桥的另一侧)。 ip addr add $NODE_X_BRIDGE_ADDR dev cbr0
启动网桥 ip link set dev cbr0 up
如果您已经关闭 Docker 的 IP 伪装,以允许pod相互通信,那么您可能需要为集群网络之外的目标 IP 进行伪装。例如:iptables -t nat -A POSTROUTING ! -d KaTeX parse error: Expected '}', got 'EOF' at end of input: … "image": "{HYPERKUBE_IMAGE}",
“command”: [
“/hyperkube”,
“apiserver”,
“
ARG1","ARG2”,
…
"KaTeX parse error: Expected 'EOF', got '}' at position 762: …15 } }̲ ], "volume…{MASTER_IP} 或者 --bind-address=127.0.0.1 和 --address=127.0.0.1 如果要在主节点上运行代理。–service-cluster-ip-range=
SERVICECLUSTERIPRANGE−−etcd−servers=http://127.0.0.1:4001−−tls−cert−file=/srv/kubernetes/server.cert−−tls−private−key−file=/srv/kubernetes/server.key−−admission−control=RECOMMENDED_LIST 参阅 admission controllers 获取推荐设置。–allow-privileged=true,只有当您信任您的集群用户以 root 身份运行 pod 时。如果您遵循仅防火墙的安全方法,请使用以下参数:–token-auth-file=/dev/null–insecure-bind-address=
MASTERIP−−advertise−address=MASTER_IP如果您使用 HTTPS 方法,请设置:–client-ca-file=/srv/kubernetes/ca.crt–token-auth-file=/srv/kubernetes/known_tokens.csv–basic-auth-file=/srv/kubernetes/basic_auth.csvpod 使用 hostPath 卷挂载几个节点上的文件系统目录。这样的目的是:挂载 /etc/ssl 以允许 apiserver 找到 SSL 根证书,以便它可以验证外部服务,例如一个 cloud provider。 如果未使用 cloud provider,则不需要(例如裸机)。挂载 /srv/kubernetes 以允许 apiserver 读取存储在节点磁盘上的证书和凭证。这些(证书和凭证)也可以存储在永久性磁盘上,例如 GCE PD,或烧录到镜像中。可选,您也可以挂载 /var/log,并将输出重定向到那里。(未显示在模板中)。 如果您希望使用 journalctl 等工具从根文件系统访问日志,请执行此操作。待办 文档化 proxy-ssh 的安装Cloud ProviderApiserver 支持若干 cloud providers。–cloud-provider 标志的选项有 aws,azure,cloudstack,fake, gce, mesos, openstack, ovirt,photon,rackspace,vsphere 或者不设置。在使用裸机安装的情况下无需设置。通过在 这里 贡献代码添加对新 IaaS 的支持。一些 cloud provider 需要一个配置文件。如果是这样,您需要将配置文件放入 apiserver 镜像或通过 hostPath 挂载。–cloud-config= 在 cloud provider 需要配置文件时设置。由 aws, gce, mesos, openshift, ovirt 和 rackspace 使用。您必须将配置文件放入 apiserver 镜像或通过 hostPath 挂载。Cloud 配置文件语法为 Gcfg。AWS 格式由 AWSCloudConfig 定义。其他 cloud provider 的相应文件中也有类似的类型。GCE 例子:在 这个文件 中搜索gce.conf。Scheduler pod 模板完成 Scheduler pod 模板:{
“kind”: “Pod”,
“apiVersion”: “v1”,
“metadata”: {
“name”: “kube-scheduler”
},
“spec”: {
“hostNetwork”: true,
“containers”: [
{
“name”: “kube-scheduler”,
“image”: “
HYBERKUBEIMAGE","command":["/hyperkube","scheduler","−−master=127.0.0.1:8080","SCHEDULER_FLAG1”,
…
“KaTeX parse error: Expected 'EOF', got '}' at position 273: …15 } }̲ ] } } 通常,调度程…HYPERKUBE_IMAGE”,
“command”: [
“/hyperkube”,
“controller-manager”,
“
CNTRLMNGRFLAG1",..."CNTRLMNGR_FLAGN”
],
“volumeMounts”: [
{
“name”: “srvkube”,
“mountPath”: “/srv/kubernetes”,
“readOnly”: true
},
{
“name”: “etcssl”,
“mountPath”: “/etc/ssl”,
“readOnly”: true
}
],
“livenessProbe”: {
“httpGet”: {
“scheme”: “HTTP”,
“host”: “127.0.0.1”,
“port”: 10252,
“path”: “/healthz”
},
“initialDelaySeconds”: 15,
“timeoutSeconds”: 15
}
}
],
“volumes”: [
{
“name”: “srvkube”,
“hostPath”: {
“path”: “/srv/kubernetes”
}
},
{
“name”: “etcssl”,
“hostPath”: {
“path”: “/etc/ssl”
}
}
]
}
}
使用 controller manager 时需要考虑的标志:–cluster-cidr=,集群中 pod 的 CIDR 范围。–allocate-node-cidrs=,如果您使用 --cloud-provider=,请分配并设置云提供商上的 pod 的 CIDR。–cloud-provider= 和 --cloud-config 如 apiserver 部分所述。–service-account-private-key-file=/srv/kubernetes/server.key,由 service account 功能使用。–master=127.0.0.1:8080启动和验证 Apiserver,Scheduler 和 Controller Manager将每个完成的 pod 模板放入 kubelet 配置目录中(kubelet 的参数 --config= 参数设置的值,通常是 /etc/kubernetes/manifests)。顺序不重要:scheduler 和 controller manager 将重试到 apiserver 的连接,直到它启动为止。使用 ps 或 docker ps 来验证每个进程是否已经启动。例如,验证 kubelet 是否已经启动了一个 apiserver 的容器:$ sudo docker ps | grep apiserver:
5783290746d5 gcr.io/google_containers/kube-apiserver:e36bf367342b5a80d7467fd7611ad873 “/bin/sh -c ‘/usr/lo’” 10 seconds ago Up 9 seconds k8s_kube-apiserver.feb145e7_kube-apiserver-kubernetes-master_default_eaebc600cf80dae59902b44225f2fc0a_225a4695
然后尝试连接到 apiserver:$ echo $(curl -s http://localhost:8080/healthz)
ok
$ curl -s http://localhost:8080/api
{
“versions”: [
“v1”
]
}
如果您为 kubelet 选择了 --register-node=true 选项,那么它们向 apiserver 自动注册。 您应该很快就可以通过运行 kubectl get nodes 命令查看所有节点。 否则,您需要手动创建节点对象。启动集群服务您将希望通过添加集群范围的服务来完成您的 Kubernetes 集群。这些有时被称为 addons,查阅在 管理指南 中的概述。下面给出了设置每个集群服务的注意事项:集群 DNS: 许多 Kubernetes 的例子都需要安装说明管理指南集群级日志 集群级日志概述使用 Elasticsearch 的集群级日志使用 Stackdriver 的集群级日志容器资源监控 安装说明GUI 集群 安装说明故障排除运行 validate-clustercluster/kube-up.sh 调用 cluster/validate-cluster.sh 用于确定集群启动是否成功。使用和输出示例:KUBECTL_PATH=$(which kubectl) NUM_NODES=3 KUBERNETES_PROVIDER=local cluster/validate-cluster.sh
Found 3 node(s).
NAME STATUS AGE VERSION
node1.local Ready 1h v1.6.9+a3d1dfa6f4335
node2.local Ready 1h v1.6.9+a3d1dfa6f4335
node3.local Ready 1h v1.6.9+a3d1dfa6f4335
Validate output:
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-1 Healthy {“health”: “true”}
etcd-2 Healthy {“health”: “true”}
etcd-0 Healthy {“health”: “true”}
Cluster validation succeeded
检查 pod 和 service尝试通过其他入门指南中的 “检查集群” 部分,例如 GCE。您应该看到一些服务。还应该看到 apiserver,scheduler 和 controller-manager 的 “镜像 pod”,以及您启动的任何加载项。试一试例子此时,您应该能够运行一个基本的例子,例如 nginx 例子。运行一致性测试您可能想尝试运行 一致性测试。任何失败都会给一个提示,您需要更多地关注它们。网络节点必须能够使用其私有 IP 通讯。从一个节点到另一个节点使用 ping 或 SSH 命令进行验证。