arrow_back

使用 Kubernetes 编排云

加入 登录
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

使用 Kubernetes 编排云

Lab 1 小时 15 分钟 universal_currency_alt 5 个积分 show_chart 中级
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

GSP021

Google Cloud 自定进度实验

概览

Kubernetes 是一个开源项目(项目网站为 kubernetes.io),可在从笔记本电脑到高可用性多节点集群、从公有云到本地部署、从虚拟机到裸金属等众多不同环境中运行。

在本实验中,借助 Kubernetes Engine 这样的托管式环境,您可以把全部精力放在体验 Kubernetes 上,不必分心去设置底层基础设施。Kubernetes Engine 是一个可用于部署容器化应用的托管式环境。它融合了提高开发者效率、有效利用资源、自动化运营和开源灵活性等方面的最新创新成果,能够让您更快进入市场。

注意应用托管在 GitHub 上,提供了一个 12 要素应用的示例。在本实验中,您将使用以下 Docker 映像:
  • kelseyhightower/monolith - 单体式应用包含 auth 和 hello 服务。
  • kelseyhightower/auth - auth 微服务。为通过身份验证的用户生成 JWT 令牌。
  • kelseyhightower/hello - hello 微服务。问候通过身份验证的用户。
  • nginx - auth 和 hello 服务的前端。
  • 目标

    在本实验中,您将学习如何完成以下操作:

    • 使用 Kubernetes Engine 预配完整的 Kubernetes 集群。
    • 使用 kubectl 部署和管理 Docker 容器。
    • 使用 Kubernetes 的 Deployment 和 Service 对象将应用分解成微服务。

    设置和要求

    点击“开始实验”按钮前的注意事项

    请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 Google Cloud 资源可供您使用多长时间。

    此实操实验可让您在真实的云环境中开展实验活动,免受模拟或演示环境的局限。我们会为您提供新的临时凭据,让您可以在实验规定的时间内用来登录和访问 Google Cloud。

    为完成此实验,您需要:

    • 能够使用标准的互联网浏览器(建议使用 Chrome 浏览器)。
    注意:请使用无痕模式或无痕浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。
    • 完成实验的时间 - 请注意,实验开始后无法暂停。
    注意:如果您已有自己的个人 Google Cloud 账号或项目,请不要在此实验中使用,以避免您的账号产生额外的费用。

    如何开始实验并登录 Google Cloud 控制台

    1. 点击开始实验按钮。如果该实验需要付费,系统会打开一个弹出式窗口供您选择付款方式。左侧是实验详细信息面板,其中包含以下各项:

      • 打开 Google 控制台按钮
      • 剩余时间
      • 进行该实验时必须使用的临时凭据
      • 帮助您逐步完成本实验所需的其他信息(如果需要)
    2. 点击打开 Google 控制台。 该实验会启动资源并打开另一个标签页,显示登录页面。

      提示:请将这些标签页安排在不同的窗口中,并将它们并排显示。

      注意:如果您看见选择帐号对话框,请点击使用其他帐号
    3. 如有必要,请从实验详细信息面板复制用户名,然后将其粘贴到登录对话框中。点击下一步

    4. 请从实验详细信息面板复制密码,然后将其粘贴到欢迎对话框中。点击下一步

      重要提示:您必须使用左侧面板中的凭据。请勿使用您的 Google Cloud Skills Boost 凭据。 注意:在本次实验中使用您自己的 Google Cloud 帐号可能会产生额外费用。
    5. 继续在后续页面中点击以完成相应操作:

      • 接受条款及条件。
      • 由于该帐号为临时帐号,请勿添加帐号恢复选项或双重验证。
      • 请勿注册免费试用。

    片刻之后,系统会在此标签页中打开 Cloud 控制台。

    注意:您可以点击左上角的导航菜单来查看列有 Google Cloud 产品和服务的菜单。 “导航菜单”图标

    激活 Cloud Shell

    Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。

    1. 点击 Google Cloud 控制台顶部的激活 Cloud Shell “激活 Cloud Shell”图标

    如果您连接成功,即表示您已通过身份验证,且当前项目会被设为您的 PROJECT_ID 环境变量所指的项目。输出内容中有一行说明了此会话的 PROJECT_ID

    Your Cloud Platform project in this session is set to YOUR_PROJECT_ID

    gcloud 是 Google Cloud 的命令行工具。它已预先安装在 Cloud Shell 上,且支持 Tab 自动补全功能。

    1. (可选)您可以通过此命令列出活跃账号名称:
    gcloud auth list
    1. 点击授权

    2. 现在,输出的内容应如下所示:

    输出:

    ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net To set the active account, run: $ gcloud config set account `ACCOUNT`
    1. (可选)您可以通过此命令列出项目 ID:
    gcloud config list project

    输出

    [core] project = <project_ID>

    输出示例

    [core] project = qwiklabs-gcp-44776a13dea667a6 Note: For full documentation of gcloud, in Google Cloud, refer to the gcloud CLI overview guide.

    Google Kubernetes Engine

    1. 在 Cloud Shell 环境中,输入以下命令设置可用区:
    gcloud config set compute/zone {{{project_0.default_zone|Zone}}}
    1. 启动一个集群,以便在本实验中使用:
    gcloud container clusters create io 在创建集群时,您会自动通过该集群的身份验证。如果您与 Cloud Shell 的连接出于任何原因断开,请运行 gcloud container clusters get-credentials io 命令重新进行身份验证。 注意:创建集群需要一段时间才能完成,因为 Kubernetes Engine 需要在后台预配一些虚拟机来给您使用!

    任务 1. 获取示例代码

    1. 从 Cloud Shell 命令行复制源代码:
    gsutil cp -r gs://spls/gsp021/* .
    1. 切换到本实验所需的目录:
    cd orchestrate-with-kubernetes/kubernetes
    1. 列出文件,了解您要使用的是哪些文件:
    ls

    该示例的布局如下:

    deployments/ /* Deployment manifests */ ... nginx/ /* nginx config files */ ... pods/ /* Pod manifests */ ... services/ /* Services manifests */ ... tls/ /* TLS certificates */ ... cleanup.sh /* Cleanup script */

    现在您已经有了代码,接下来就可以拿 Kubernetes 试手了!

    任务 2. Kubernetes 快速演示

    要开始使用 Kubernetes,最简单的方法就是使用 kubectl create 命令。

    1. 运行这条命令,启动 nginx 容器的一个实例:
    kubectl create deployment nginx --image=nginx:1.10.0

    Kubernetes 已经创建了一个 Deployment 对象,我们稍后再介绍 Deployment 对象,目前您只需要了解一点,Deployment 对象可以使 Pod 保持正常运行状态,即便是运行 Pod 的节点发生故障时也不会受到影响。

    在 Kubernetes 中,所有容器都在 Pod 中运行。

    1. 使用 kubectl get pods 命令查看正在运行的 nginx 容器:
    kubectl get pods
    1. 当 nginx 容器的状态变为“Running”之后,您可以使用 kubectl expose 命令向 Kubernetes 外部公开该容器:
    kubectl expose deployment nginx --port 80 --type LoadBalancer

    刚刚发生了什么?Kubernetes 在后台创建了一个具有公共 IP 地址的外部负载均衡器。访问这个公共 IP 地址的任何客户端都会被路由到服务背后的 Pod。在本例中,这个 Pod 就是 nginx Pod。

    1. 现在使用 kubectl get services 命令列出服务:
    kubectl get services 注意:为您的服务填充 ExternalIP 字段可能需要几秒钟时间。这很正常,只需每隔几秒钟重新运行 kubectl get services 命令,直至字段中填充数据。
    1. 在此命令中添加外部 IP,以便远程连接 Nginx 容器:
    curl http://<外部 IP>:80

    成功了!Kubernetes 通过 kubectl run 和 expose 命令,为用户提供了开箱即用又简单易用的工作流。

    验证您已完成的任务

    点击下方的检查我的进度,以检查您的实验进度。如果您成功创建了 Kubernetes 集群并部署了 Nginx 容器,就会看到一个评估分数。

    创建 Kubernetes 集群并启动 Nginx 容器

    我们已经简单了解了 Kubernetes,接下来深入探索一下每个组件和抽象。

    任务 3. Pod

    Pod 是 Kubernetes 的核心。

    Pod 代表并保存着由一个或多个容器构成的集合。通常情况下,如果您的多个容器彼此之间存在硬性依赖关系,则可以将它们封装到一个 Pod 中。

    包含单体式应用和 nginx 容器的 Pod

    此示例中有一个包含单体式应用和 nginx 容器的 Pod。

    Pod 还具有。卷就是数据磁盘,其存在时间与 Pod 一样长,可供该 Pod 中的容器使用。Pod 为其内容提供了一个共享命名空间,这就意味着我们的示例 Pod 中的两个容器可以与互相通信,并且还共享挂接的卷。

    各 Pod 之间还共享一个网络命名空间。这意味着每个 Pod 有一个 IP 地址。

    接下来,我们更深入地探索 Pod。

    任务 4. 创建 Pod

    Pod 可使用 Pod 配置文件创建。请花些时间了解单体式应用 Pod 配置文件。

    1. 切换到下面的目录:
    cd ~/orchestrate-with-kubernetes/kubernetes
    1. 运行以下命令:
    cat pods/monolith.yaml

    输出显示了打开的配置文件:

    apiVersion: v1 kind: Pod metadata: name: monolith labels: app: monolith spec: containers: - name: monolith image: kelseyhightower/monolith:1.0.0 args: - "-http=0.0.0.0:80" - "-health=0.0.0.0:81" - "-secret=secret" ports: - name: http containerPort: 80 - name: health containerPort: 81 resources: limits: cpu: 0.2 memory: "10Mi"

    这里有几点需要注意。您会看到:

    • 您的 Pod 由一个容器(单体式应用)构成。
    • 在这个容器启动时,您向其传递了几个参数。
    • 您为 http 流量打开了 80 端口。
    1. 使用 kubectl 命令创建单体式应用 Pod:
    kubectl create -f pods/monolith.yaml
    1. 检查您的 Pod。使用 kubectl get pods 命令列出默认命名空间内运行的所有 Pod:
    kubectl get pods 注意:单体式应用 Pod 可能需要几秒钟的时间才能启动并运行。首先要从 Docker Hub 中拉取单体式应用容器映像,之后才能运行它。
    1. 在 Pod 进入运行状态后,使用 kubectl describe 命令获得有关单体式应用 Pod 的更多信息:
    kubectl describe pods monolith

    您会看到有关单体式应用 Pod 的大量信息,包括 Pod IP 地址和事件日志。在进行问题排查时,会用到这些信息。

    借助 Kubernetes,您只需在配置文件中描述 Pod 即可轻松创建 Pod,并且可以在 Pod 运行时轻松查看其信息。至此,您已经具备了创建部署所需的全部 Pod 的能力!

    任务 5. 与 Pod 交互

    默认情况下,系统会为 Pod 分配一个专用 IP 地址,从集群外部无法访问 Pod。使用 kubectl port-forward 命令将本地端口映射到单体式应用 Pod 内的一个端口。

    注意:从此时开始,实验要求您在多个 Cloud Shell 标签页中工作,以设置 Pod 之间的通信。在第二个或第三个命令 shell 中执行的任何命令都将在命令的说明中指明。
    1. 打开第二个 Cloud Shell 终端。现在您有了两个终端,一个用来运行 kubectl port-forward 命令,另一个用来发出 curl 命令。

    2. 第 2 个终端中,运行以下命令设置端口转发:

    kubectl port-forward monolith 10080:80
    1. 现在,在第 1 个终端内,开始使用 curl 与您的 Pod 交互:
    curl http://127.0.0.1:10080

    很好!您的容器返回了一条非常友好的问候:“hello”。

    1. 现在,使用 curl 命令,看看访问一个安全端点时会发生什么情况:
    curl http://127.0.0.1:10080/secure

    糟糕。

    1. 尝试登录,以便从单体式应用获取一个身份验证令牌:
    curl -u user http://127.0.0.1:10080/login
    1. 在看到登录提示时,使用超级机密密码 password 登录。

    登录会引发系统显示一个 JWT 令牌。

    1. Cloud Shell 不能很好地处理长字符串的复制,因此我们为令牌创建一个环境变量。
    TOKEN=$(curl http://127.0.0.1:10080/login -u user|jq -r '.token')
    1. 在系统提示输入主机密码时,再次输入超级机密密码 password

    2. 使用以下命令复制令牌,随后通过 curl 使用该令牌访问该安全端点:

    curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:10080/secure

    此时,您应该会收到应用返回的一条响应,表明一切重归正常。

    1. 使用 kubectl logs 命令查看单体式应用 Pod 的日志。
    kubectl logs monolith
    1. 打开第 3 个终端,使用 -f 标志获得实时日志流:
    kubectl logs -f monolith
    1. 如果您在第 1 个终端内使用 curl 与单体式应用交互,则可以看到日志更新(在第 3 个终端内):
    curl http://127.0.0.1:10080
    1. 使用 kubectl exec 命令在单体式应用 Pod 内运行交互式 shell。如果您想在容器内进行问题排查,这会非常方便:
    kubectl exec monolith --stdin --tty -c monolith -- /bin/sh
    1. 例如,在您通过 shell 进入单体式应用容器之后,可以使用 ping 命令测试外部连接:
    ping -c 3 google.com
    1. 在此交互式 shell 中完成操作后,请务必退出登录。
    exit

    您可以看到,与 Pod 交互就像使用 kubectl 命令一样轻松。如果您需要远程访问容器,或者获取登录 shell,Kubernetes 提供了执行这些操作所需的一切。

    任务 6. Service

    Pod 的性质决定了它们无法持久存在。Pod 可能会出于多种原因停止或启动,比如活跃度或就绪性检查失败,而这会造成问题。

    如果您想与一组 Pod 通信,会发生什么情况?在重新启动后,它们的 IP 地址可能会发生变化。

    此时就要用到 Service。Service 为 Pod 提供了稳定的端点。

    Service 网络图

    Service 使用标签确定它们在哪个 Pod 上运行。如果 Pod 具有正确的标签,Service 会正确选择并公开 Pod。

    Service 所提供的针对一组 Pod 的访问权限级别取决于 Service 的类型。Service 目前有三种类型:

    • ClusterIP(内部):这是默认类型,表示此 Service 仅在集群内部可见
    • NodePort:为集群中的每个节点分配一个可从外部访问的 IP 地址
    • LoadBalancer:添加来自云服务提供商的负载均衡器,将流量从服务转发到其中的节点

    接下来您将学习如何执行以下操作:

    • 创建 Service
    • 使用标签选择器向外部公开限定的一组 Pod

    任务 7. 创建 Service

    您必须先创建可处理 https 流量的安全 Pod,然后才能创建 Service。

    1. 如果您变更过目录,请务必返回到 ~/orchestrate-with-kubernetes/kubernetes 目录:
    cd ~/orchestrate-with-kubernetes/kubernetes
    1. 查看单体式应用服务配置文件:
    cat pods/secure-monolith.yaml
    1. 创建 secure-monolith Pod 及其配置数据:
    kubectl create secret generic tls-certs --from-file tls/ kubectl create configmap nginx-proxy-conf --from-file nginx/proxy.conf kubectl create -f pods/secure-monolith.yaml

    现在,您有了一个安全 Pod,可以对外公开 secure-monolith Pod 了。为此,您需要创建一个 Kubernetes Service。

    1. 查看单体式应用服务配置文件:
    cat services/monolith.yaml

    (输出):

    kind: Service apiVersion: v1 metadata: name: "monolith" spec: selector: app: "monolith" secure: "enabled" ports: - protocol: "TCP" port: 443 targetPort: 443 nodePort: 31000 type: NodePort 注意事项:

    * 有一个选择器可用于自动查找并公开带有“app: monolith”和“secure: enabled”标签的任何 Pod。

    * 现在,您必须公开 nodeport,这样才能将外部流量从 31000 端口转发到 nginx(443 端口)。

    1. 使用 kubectl create 命令,通过单体式应用服务配置文件创建单体式应用 Service:
    kubectl create -f services/monolith.yaml

    (输出):

    service/monolith created

    验证您已完成的任务

    点击下方的检查我的进度,以检查您的实验进度。如果您成功创建了单体式应用 Pod 和 Service,就会看到一个评估分数。

    创建单体式应用 Pod 和 Service

    您是使用端口公开 Service 的。因此,如果有另外一个应用尝试绑定到您的某个服务器上的 31000 端口,就有可能发生端口冲突。

    通常情况下,Kubernetes 会处理此类端口分配。在本实验中,您选择了一个端口,因此稍后可以更轻松地配置健康检查。

    1. 使用 gcloud compute firewall-rules 命令,允许流量传输到公开的 nodeport 上的单体式应用服务:
    gcloud compute firewall-rules create allow-monolith-nodeport \ --allow=tcp:31000

    验证您已完成的任务

    点击下方的检查我的进度,以检查您的实验进度。如果您成功创建了一条防火墙规则,允许在 31000 端口上传输 TCP 流量,就会看到一个评估分数。

    允许流量传输到公开的 nodeport 上的单体式应用服务

    至此,我们已经设置好了一切,您应该能从集群外部访问 secure-monolith 服务,而不需要使用端口转发。

    1. 首先,获取其中一个节点的外部 IP 地址。
    gcloud compute instances list
    1. 然后尝试使用 curl 访问 secure-monolith 服务:
    curl -k https://<外部 IP>:31000

    糟糕!超时了。哪里出问题了?

    注意:现在来进行一次简短的知识测验。

    请使用以下命令回答下面的问题:

    kubectl get services monolith

    kubectl describe services monolith

    问题:

  • 您为什么无法获得单体式应用服务的响应?
  • 单体式应用服务有多少个端点?
  • Pod 必须具有什么标签才会被单体式应用服务选择?
  • 提示:这与标签有关。您将在下一部分中解决此问题。

    任务 8. 向 Pod 添加标签

    单体式应用服务目前没有端点。排查此类问题的方法之一是结合标签查询使用 kubectl get pods 命令。

    1. 可以看到,您目前运行的 Pod 中有几个 Pod 带有 monolith 标签。
    kubectl get pods -l "app=monolith"
    1. 如果执行“app=monolith”和“secure=enabled”查询会有什么结果?
    kubectl get pods -l "app=monolith,secure=enabled"

    请注意,此标签查询未显示任何结果。您似乎需要为 Pod 添加“secure=enabled”标签。

    1. 使用 kubectl label 命令,为 secure-monolith Pod 添加缺失的 secure=enabled 标签。然后,您可以检查标签是否已更新。
    kubectl label pods secure-monolith 'secure=enabled' kubectl get pods secure-monolith --show-labels
    1. 此时,您的 Pod 已使用了正确的标签,我们来查看一下单体式应用服务的端点列表:
    kubectl describe services monolith | grep Endpoints

    现在有一个端点了!

    1. 再次访问我们的一个节点来检验一下。
    gcloud compute instances list curl -k https://<外部 IP>:31000

    成功了!终于连接成功。

    验证您已完成的任务

    点击下方的检查我的进度,以检查您的实验进度。如果您成功为单体式应用 Pod 添加了标签,就会看到一个评估分数。

    向 Pod 添加标签

    任务 9. 使用 Kubernetes 部署应用

    本实验的目标是帮您为在生产环境中扩缩和管理容器做好准备。这就要用到 Deployment。Deployment 是确保运行的 Pod 数量等于所需 Pod 数量(这个数量由用户指定)的声明式方法。

    Deployment 示意图,包含节点 1、节点 2、节点 3。应用:hello,副本数量:3Deployment 的主要优势在于,它能抽离 Pod 管理中的低层级细节。在幕后,Deployment 使用副本集管理 Pod 的启动和停止。如果需要更新或扩缩 Pod,Deployment 会处理相应情况。在 Pod 出于某些原因发生故障时,Deployment 还能处理 Pod 的重启。

    我们来看一个简单的例子:

    Deployment 示意图

    Pod 与用于创建 Pod 的节点的生命周期相关联。在上面的例子中,节点 3 发生了故障(致使一个 Pod 随之停止)。您的 Deployment 创建了一个新 Pod,并在节点 2 上启动了这个 Pod,因此您不必手动创建新 Pod 并为其寻找节点。

    这真的是太棒了!

    下面我们将您学到的 Pod 和 Service 相关知识整合起来,使用 Deployment 将单体式应用拆分为较小的 Service。

    任务 10. 创建 Deployment

    您需要将该单体式应用拆分为三个独立的部分:

    • auth - 为通过身份验证的用户生成 JWT 令牌。
    • hello - 问候通过身份验证的用户。
    • frontend - 将流量路由到 auth 和 hello 服务。

    您可以创建 Deployment 了(每个服务一个)。随后,您将为 auth 和 hello Deployment 定义内部服务,为 frontend Deployment 定义外部服务。完成之后,您就可以与微服务进行交互,就像与单体式应用交互一样,不同之处在于,现在每一个部分都可以独立扩缩和部署!

    1. 首先查看 auth Deployment 配置文件。
    cat deployments/auth.yaml

    (输出)

    apiVersion: apps/v1 kind: Deployment metadata: name: auth spec: selector: matchlabels: app: auth replicas: 1 template: metadata: labels: app: auth track: stable spec: containers: - name: auth image: "kelseyhightower/auth:2.0.0" ports: - name: http containerPort: 80 - name: health containerPort: 81 ...

    该 Deployment 会创建 1 个副本,并且您使用的是 auth 容器的 2.0.0 版本。

    当您运行 kubectl create 命令创建 auth Deployment 时,该命令将生成一个与 Deployment 清单中的数据相符的 Pod。这表示您可以通过更改 Replicas 字段中指定的数值来调整 Pod 数量。

    1. 继续操作,创建 Deployment 对象:
    kubectl create -f deployments/auth.yaml
    1. 现在,可以为 auth Deployment 创建 Service 了。使用 kubectl create 命令创建 auth Service:
    kubectl create -f services/auth.yaml
    1. 下面,执行相同的操作来创建和公开 hello Deployment:
    kubectl create -f deployments/hello.yaml kubectl create -f services/hello.yaml
    1. 再次执行同一过程来创建和公开 frontend Deployment。
    kubectl create configmap nginx-frontend-conf --from-file=nginx/frontend.conf kubectl create -f deployments/frontend.yaml kubectl create -f services/frontend.yaml 注意:您还需要执行一个创建 frontend 的步骤,因为您需要使用该容器存储一些配置数据。
    1. 获取 frontend 的外部 IP 地址,然后对其执行 curl 命令,以便与其交互:
    kubectl get services frontend 注意:生成外部 IP 地址可能需要一分钟时间。如果 EXTERNAL-IP 列的状态为 pending,请再次运行上述命令。 curl -k https://<外部 IP>

    此时,您会收到 hello 响应!

    验证您已完成的任务

    点击下方的检查我的进度,以检查您的实验进度。如果您成功创建了 Auth Deployment、Hello Deployment 和 Frontend Deployment,就会看到一个评估分数。

    创建 Deployment(Auth、Hello 和 Frontend)

    恭喜!

    恭喜!您已经使用 Kubernetes 开发了一个包含多个服务的应用。利用通过本实验学到的知识,您可以使用 Deployment 和 Service 的集合,在 Kubernetes 上部署复杂的应用。

    后续步骤/了解详情

    • 您可以在 X社区博客上了解 Kubernetes 的最新动态。
    • 请注意,Kubernetes 是 GitHub 上托管的一个开源项目 (http://kubernetes.io/)。我们衷心欢迎您的反馈意见和积极贡献。

    Google Cloud 培训和认证

    …可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。

    上次更新手册的时间:2023 年 1 月 26 日

    上次测试实验的时间:2023 年 1 月 26 日

    版权所有 2024 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。