在本章中,你将学习如何在 Kubernetes 或虚拟机(VMs)上部署 Consul。你可以在自行管理的或云托管的 Kubernetes 集群和虚拟机上部署 Consul。为了测试目的,并且让你能够完成本书中贯穿的练习,本章还涵盖了在本地机器上配置 Kubernetes 集群或虚拟机。

一旦安装了 Consul,你将学习如何通过它的用户界面(UI)、命令行界面(CLI)和应用程序接口(API)与之交互。 如果你在虚拟机上部署 Consul,请跳到“在虚拟机上部署 Consul”。否则,请继续阅读以在 Kubernetes 上部署 Consul。

如果你不确定应该使用虚拟机还是 Kubernetes,我建议在 Kubernetes 上部署,因为步骤更少。

在 Kubernetes 上部署 Consul

要在 Kubernetes 上部署 Consul,你首先必须有一个正在运行的 Kubernetes 集群。然后,你将使用 consul-k8s 命令行界面(CLI)通过一个命令安装 Consul。

配置 Kubernetes 集群

Consul 可以运行在任何类型的 Kubernetes 集群上,无论是在云中,例如在 Amazon Elastic Kubernetes Service (EKS) 或 Google Kubernetes Engine (GKE),还是在自行管理的数据中心。

对于本书中的练习,如果你使用的是 macOS 或 Linux,我推荐使用一个叫做 minikube 的工具在本地机器上运行 Kubernetes。我推荐 minikube 是因为它是免费的,并且它有一个自动端口转发特性,这使得在没有大量使用 kubectl port-forward 命令的情况下访问服务变得容易。

如果 minikube 对你来说不是一个选项,并且你对在云中运行 Kubernetes 感兴趣,请参见侧边栏 “Cloud-Managed Kubernetes”。在 Windows 上我发现 minikube 运行不稳定,因此我推荐 Windows 用户使用云管理的 Kubernetes。

云托管的 Kubernetes

在云服务提供商管理的集群中运行 Kubernetes 是需要花钱的(除非你使用免费额度),但你不必担心在你的工作站上安装 Docker 并经历资源过度消耗。

请参阅以下链接,了解如何在你最喜欢的云服务提供商中启动管理的 Kubernetes 集群:

  • Google Cloud Platform Google Kubernetes Engine (GKE)
  • Amazon Elastic Kubernetes Service (EKS)
  • Azure Kubernetes Service (AKS)
  • Alibaba Cloud Container Service for Kubernetes (ACK)
  • DigitalOcean Managed Kubernetes

本书中的许多示例使用 minikube 的自动端口转发特性,允许通过 localhost 访问各种工作负载。如果你在云中运行你的集群,你需要自己运行 kubectl port-forward。我尝试在相关部分注明端口转发命令。

在你配置 Kubernetes 集群之前(无论你是使用 minikube 还是云管理的集群),你需要安装 Kubernetes CLI 工具 kubectl。本书中的练习是针对 kubectl 版本 1.23.3 进行测试的。

在 Windows 上,我推荐使用 Chocolatey 包管理器来简化工具的安装过程。

要验证 kubectl 是否成功安装,你可以运行以下命令:

  1. $ kubectl version --client
  2. Client Version: version.Info{Major:"1", Minor:"23", ...

接下来,是时候使用 minikube 配置一个 Kubernetes 集群了。如果你决定使用非 minikube 的 Kubernetes 集群,可以跳到“使用 consul-k8s CLI 安装 Consul”。

安装 minikube

Minikube 需要一个驱动程序来运行 Kubernetes。根据我的经验,我推荐使用 Docker 驱动,因为它是最稳定的。请参阅以下安装 Docker 驱动的说明:

  • macOS:”在 Mac 上安装 Docker Desktop”
  • Linux:”安装 Docker Engine”
  • Windows:正如前面提到的,Windows 上的 minikube 是不稳定的,因此我推荐使用云管理的 Kubernetes 集群。

在 macOS 上,你可以通过 Docker 的偏好设置面板更改默认的 CPU 和 RAM 分配。如果可能的话,我建议分配六个 CPU 和 8 GB 的 RAM。较低的分配也可以工作,但 Consul 的运行速度会较慢。

接下来,安装 minikube 版本 1.25.2:

macOS (Intel):

  1. $ export DOMAIN="https://storage.googleapis.com"
  2. $ curl -LO \
  3. "$DOMAIN/minikube/releases/v1.25.2/minikube-darwin-amd64"
  4. $ sudo install minikube-darwin-amd64 /usr/local/bin/minikube
  5. $ rm minikube-darwin-amd64

macOS (Apple Silicon):

  1. $ export DOMAIN="https://storage.googleapis.com"
  2. $ curl -LO \
  3. "$DOMAIN/minikube/releases/v1.25.2/minikube-darwin-arm64"
  4. $ sudo install minikube-darwin-arm64 /usr/local/bin/minikube
  5. $ rm minikube-darwin-arm64
  • 对于 Linux 和其他安装选项,请参见 minikube 的安装指南。

现在你已经准备好启动 minikube 了。这个命令的完成时间取决于你的互联网连接,可能需要两到三分钟:

$ minikube start --driver=docker --kubernetes-version=v1.23.3

当 minikube 启动命令完成后,你可以通过以下命令检查你的集群状态:

  1. $ minikube status
  2. minikube
  3. type: Control Plane
  4. host: Running
  5. kubelet: Running
  6. apiserver: Running
  7. kubeconfig: Configured

minikube 应该已经配置了你的 kubectl 上下文,使其指向 minikube 集群。你可以运行以下命令来验证:

  1. $ kubectl get nodes
  2. NAME STATUS ROLES AGE VERSION
  3. minikube Ready control-plane,master 1m v1.23.3

使用 kubectl config use-context minikube 切换到 minikube 集群的上下文,如果还没有切换的话。

现在你已经准备好安装 Consul 了。

如果你暂时不使用 minikube 集群并想要停止它,可以运行 minikube stop。这将停止 minikube 并保存其状态,这样你就不会丢失工作。之后你可以运行 minikube start 重新启动相同的集群并继续工作。

如果你需要完全从头重新创建集群,可以通过运行 minikube delete 删除它,然后使用之前相同的 minikube start 命令重新创建它。之后你需要重新安装 Consul。

使用 consul-k8s CLI 安装 Consul

现在你已经准备好了 Kubernetes 集群,是时候安装 Consul 了。Kubernetes 上的 Consul 可以通过 consul-k8s CLI 或 Helm(一个 Kubernetes 的包管理器)来安装。我推荐使用 CLI,因为它会执行额外的检查以确保安装成功。

要了解如何使用 Helm chart 安装 Consul,请参阅 Consul 文档。

安装 consul-k8s CLI

要安装 consul-k8s CLI,导航到 consul-k8s v0.44.0 二进制文件的网页,并点击对应你操作系统和架构的链接:

  • 在 macOS 上:使用 darwin zip 文件:对于 Intel 处理器使用 darwin_amd64.zip,对于 Apple Silicon 使用 darwin_arm64.zip
  • 在 Linux 上:运行 uname -sm 查看你的架构。如果显示 x86_64,使用 _amd64 包;如果显示 i386,使用 _386 包。
  • 在 Windows 上:按照微软 Windows 支持 FAQ 页面上的说明确定你的系统是 32 位还是 64 位。如果是 32 位,使用 _386 二进制文件;否则,使用 _amd64 二进制文件。

下载 zip 文件后,打开它以解压 consul-k8s 二进制文件。在 macOS 或 Linux 上,将其移动到 /usr/local/bin 目录:

  1. $ sudo mv <path-to-downloads>/consul-k8s /usr/local/bin

在 Windows 上,按照 Stack Overflow 线程“‘Register’ an .exe So You Can Run It from Any Command Line in Windows”中提供的说明将 consul-k8s 添加到你的路径中。

测试 consul-k8s 是否安装成功:

  1. $ consul-k8s version
  2. consul-k8s v0.44.0

values.yaml 文件

你的 Kubernetes 上的 Consul 安装是通过 values.yaml 文件进行配置的。此文件设置 Consul 安装的具体选项。例如,此文件用于控制应该安装多少个 Consul 服务器。

首先,选择一个工作目录,例如 ~/code/consul

  1. $ mkdir -p ~/code/consul
  2. $ cd ~/code/consul

接下来,如示例 3-1 所示,创建你的 values.yaml 文件。

示例 3-1. values.yaml

  1. # Settings under "global" pertain to all components
  2. # of the Consul installation.
  3. global:
  4. # The name of your installation. This should always
  5. # be set to consul.
  6. name: consul
  7. # Enable metrics so you can observe what's happening
  8. # in your installation.
  9. metrics:
  10. enabled: true
  11. # Consul image.
  12. image: hashicorp/consul:1.11.5
  13. # Envoy image.
  14. imageEnvoy: envoyproxy/envoy:v1.20.2
  15. # Settings under "server" configure Consul servers.
  16. server:
  17. # replicas sets the number of servers.
  18. # In production, this should be 3 or 5, however
  19. # for testing, this should be set to 1.
  20. replicas: 1
  21. # Enable Consul's service mesh functionality.
  22. connectInject:
  23. enabled: true
  24. # Settings under "controller" configure Consul's controller
  25. # that manages custom resources.
  26. # Custom resources are covered in later chapters.
  27. controller:
  28. enabled: true
  29. # Install Prometheus, a metrics database.
  30. prometheus:
  31. enabled: true
  32. # Settings under "ui" configure the Consul UI.
  33. ui:
  34. service:
  35. # Use a load balancer service in
  36. # front of the Consul UI so we can access it using
  37. # minikube tunnel.
  38. type: LoadBalancer
  39. # Use port 8500 for the UI.
  40. port:
  41. http: 8500

如果在云端或 Linux 上使用 minikube 运行 Kubernetes 集群,将 UI 的服务类型设置为 ClusterIP 而不是 LoadBalancer。在云端,如果保留为 LoadBalancer,可能会将 UI 暴露给公共互联网,这是不安全的。在 Linux 上,没有理由将其设置为 LoadBalancer,因为你不会使用 minikube tunnel。

在这两种情况下,你都可以使用 kubectl port-forward 访问 UI。

安装

要安装 Consul,你将使用 consul-k8s install 命令。

在此之前,如果你在 macOS 上使用 minikube,必须启动 minikube tunnel:

  1. $ minikube tunnel
  2. Tunnel successfully started

在继续阅读本书时,保持此命令运行。如果你需要停止并重启 minikube 集群,请确保也重新启动 minikube tunnel。

minikube tunnel 命令确保负载均衡服务在 minikube 上分配外部 IP。consul-k8s install 命令将在所有服务获得 IP 之前一直等待,因此你必须运行 minikube tunnel 才能完成安装。在云管理和 Linux minikube 集群上,你已经将 UI 服务设置为 ClusterIP,所以不需要 minikube tunnel。

保持 minikube tunnel 运行(如果适用),然后在另一个终端中导航到 values.yaml 目录并运行 consul-k8s install

  1. consul-k8s install
  1. $ consul-k8s install -config-file values.yaml
  2. ...
  3. Consul 安装在名称为 "consul" 的命名空间中

安装可能需要长达 10 分钟才能完成,但通常只需大约 3 分钟。

如果你使用的是 minikube,并且出现 “Service does not have load balancer ingress IP address” 错误,请确保你正在运行 minikube tunnel

验证你的安装

要验证你的安装,运行 consul-k8s status(Consul 客户端可能需要一分钟时间才会变为健康状态):

  1. $ consul-k8s status
  2. ...
  3. Consul servers healthy (1/1)
  4. Consul clients healthy (1/1)

附录列出了在完成书中的练习过程中可能遇到的问题以及解决方法。

你可以使用 kubectl 查看部署到集群中的资源。

  1. $ kubectl get daemonset,statefulset,deployment -n consul
  2. NAME
  3. daemonset.apps/consul-client
  4. NAME
  5. statefulset.apps/consul-server
  6. NAME
  7. deployment.apps/consul-connect-injector
  8. deployment.apps/consul-controller
  9. deployment.apps/consul-webhook-cert-manager
  10. deployment.apps/prometheus-server

如第 2 章所述,Consul 客户端使用 DaemonSet 管理,Consul 服务器使用 StatefulSet 管理。此外,还有四个部署负责 Kubernetes 特定的自动化:

  • consul-connect-injector
    这个部署负责自动注入服务网格 sidecar,并将 Kubernetes 探针同步到 Consul。这个功能在后续章节中会有更详细的介绍。

  • consul-controller
    这个部署管理 Kubernetes 自定义资源。自定义资源在第 5 章中有介绍。

  • consul-webhook-cert-manager
    这个部署处理创建 Consul 与 Kubernetes 安全通信所需的证书。

  • prometheus-server
    这个部署运行一个名为 Prometheus 的指标数据库,收集来自 Consul 的指标。Prometheus 在第 7 章中有更详细的介绍。

恭喜你!你已经成功在 Kubernetes 上安装了 Consul。现在你可以通过其 UI、CLI 和 API 与 Consul 进行交互。可以跳到“与 Consul 交互”章节,或继续阅读以了解如何在虚拟机上部署 Consul。

由于 minikube 集群中只有一个节点,因此 Consul 服务器和客户端 Pod 都运行在同一个节点上。这对于测试集群来说没有问题,但在生产集群中,Consul 服务器应该运行在不同的节点上。

在虚拟机上部署 Consul

Consul 的一个优势是它在虚拟机上运行得和在 Kubernetes 上一样好。Consul 可以在各种类型的虚拟机(和裸金属机器)上运行,并且可以扩展到具有数千个节点的集群。

在生产集群中,你应该专门为运行 Consul 服务器配置三个或五个虚拟机。其余的虚拟机将运行 Consul 客户端和服务工作负载。

Consul 参考架构提供了生产集群的虚拟机大小和资源需求的建议。

为了测试 Consul 并跟随本书中的练习,我建议在本地机器上运行一个单独的 Linux 虚拟机,这个虚拟机已经预装了你需要的所有工具。这个单独的虚拟机将运行一个 Consul 服务器,并且也会作为 Consul 客户端。

首先,你需要配置虚拟机,然后使用 systemd 配置和运行 Consul。

配置本地虚拟机

你将使用一个名为 Vagrant 的程序,它可以轻松管理本地工作站上的虚拟机。

要使用 Vagrant,请安装 vagrantCLI 工具和 VirtualBox,一个用于本地运行虚拟机的应用程序。如果你在使用 Apple Silicon 机器上的 macOS,请按照这个 GitHub Gist 中的说明操作。

接下来,选择一个工作目录,例如 ~/code/consul,并进入该目录:

  1. $ mkdir -p ~/code/consul
  2. $ cd ~/code/consul

创建一个名为 Vagrantfile 的文件,描述如何配置虚拟机,如示例 3-2 所示。

示例 3-2: Vagrantfile

  1. Vagrant.configure("2") do |config|
  2. config.vm.box = "consul-up/vm"
  3. config.vm.network "forwarded_port", guest: 3000, host: 3000
  4. config.vm.network "forwarded_port", guest: 8500, host: 8500
  5. config.vm.network "forwarded_port", guest: 6060, host: 6060
  6. config.vm.network "forwarded_port", guest: 8080, host: 8080
  7. config.vm.network "forwarded_port", guest: 9090, host: 9090
  8. config.vm.network "forwarded_port", guest: 16686, host: 16686
  9. end

这行代码引用了我为读者特别创建的虚拟机。它已经预装了许多工具。

这些指令使虚拟机上的某些端口在本地主机上可访问。

所有代码示例可以在本书的 GitHub 仓库中找到,以便于复制和粘贴。

通过运行 vagrant status 确认 Vagrant 是否已安装并且能够识别 Vagrantfile

  1. $ vagrant status
  2. Current machine states:
  3. default not created (virtualbox)

由于你还没有启动虚拟机,它应该显示状态为“未创建”(not created)。

你必须在与 Vagrantfile 相同的目录中运行 vagrant 命令。

要下载并启动虚拟机,请运行:

  1. $ vagrant up

这个过程应该需要大约五分钟(取决于你的互联网连接)。命令完成后,再次运行 vagrant status 以检查虚拟机是否已经启动:

  1. $ vagrant status
  2. Current machine states:
  3. default running (virtualbox)
  4. ...

当你不使用虚拟机时,可以通过运行 vagrant suspend 来节省系统资源。这个命令会保存虚拟机的状态。要重新启动虚拟机,导航到包含 Vagrantfile 的目录并运行 vagrant up

你现在可以通过 Secure Shell (SSH) 连接到虚拟机:

  1. $ vagrant ssh

安装和配置 Consul

由于这是我为读者创建的虚拟机,Consul 已经预装好了。要确认这一点,运行以下命令查看 Consul 的版本:

  1. consul version
  1. $ consul version
  2. Consul v1.11.5
  3. Revision d8983fc9
  4. Protocol 2 spoken by default...

如果你在自行配置虚拟机,请参考 Consul 的下载页面获取安装 Consul 的说明。

本书使用的是 Consul 版本 1.11.5。我建议你使用这个版本来完成本书中的练习,即使有更新的 Consul 版本可用。这将确保书中的所有命令和代码示例都能正常工作。

安装了 Consul 后,你就可以开始配置它了。Consul 可以通过环境变量、命令行标志和配置文件进行配置,但有些设置只能通过配置文件进行。因此,你将使用配置文件。

/etc/consul.d/consul.hcl 中已有一个配置文件。这个目录和文件是在我准备虚拟机时安装 Consul 包的一部分创建的。如果你打开 /etc/consul.d/consul.hcl,你会看到它已经设置了一些配置。所有的配置值都被注释掉了,除了 data_dir

  1. # data_dir
  2. # 该标识符为 agenti 提供了一个数据目录来存储状态
  3. data_dir = "/opt/consul"
  4. ...

Consul 支持 JSON 和 HCL 配置文件。HCL 代表 HashiCorp 配置语言,它类似于 JSON,但更易于人类阅读和编写。

/etc/consul.d/consul.hcl 中的配置仅仅是一个起点。你需要添加额外的配置,以启用 Consul 的服务网格功能并配置 Consul 作为服务器运行。

创建一个新文件 /etc/consul.d/server.hcl 并用你喜欢的编辑器打开它。

Consul 配置文件只有 consul 用户或 root 用户可以写入,因此你需要使用 sudo 来编辑这些文件。例如:

  1. $ sudo vim /etc/consul.d/server.hcl

将示例 3-3 中的内容添加到文件中。

示例 3-3 /etc/consul.d/server.hcl

  1. # connect
  2. # This stanza configures connect, the name
  3. # for the service mesh features of Consul.
  4. connect {
  5. enabled = true
  6. }
  7. # ports
  8. # Configures which ports Consul listens on.
  9. # You need to configure its gRPC port to listen on 8502
  10. # because this is required for the service mesh functionality.
  11. ports {
  12. grpc = 8502
  13. }
  14. # server
  15. # Configures this agent to run as a server (as opposed to a client).
  16. server = true
  17. # bootstrap_expect
  18. # Sets the number of servers expected to be in this cluster.
  19. # Since you only have one server, this is set to 1.
  20. # The servers will wait until this many servers
  21. # have joined the cluster before they start up.
  22. bootstrap_expect = 1
  23. # ui_config
  24. # Configures Consul's UI.
  25. # Set enabled to true to enable the UI.
  26. ui_config {
  27. enabled = true
  28. }
  29. # client_addr
  30. # The address Consul binds to for its HTTP API.
  31. # The UI is exposed over the HTTP API so to access
  32. # the UI from outside the VM, set this to 0.0.0.0 so it
  33. # binds to all interfaces.
  34. client_addr = "0.0.0.0"
  35. # bind_addr
  36. # The address Consul binds to for internal cluster
  37. # communication. Usually this should be set to
  38. # 0.0.0.0 but in Vagrant, setting this to 127.0.0.1
  39. # prevents issues if the IP changes.
  40. bind_addr = "127.0.0.1"

Consul 现在已经配置完成并准备启动。你需要使用操作系统的服务管理器来启动 Consul,以便它可以在后台持续运行。在这个虚拟机上使用的 Ubuntu 操作系统中,服务管理器是 systemd

systemd

systemd 通过单元文件来管理每个服务。Consul 的单元文件 /usr/lib/systemd/system/consul.service 如示例 3-4 所示,是在安装 Consul 包时创建的。

systemd 中,单元(unit)指的是由 systemd 管理的任何资源。单元文件(unit file)是 systemd 配置文件,告诉 systemd 如何运行和管理该单元。

示例 3-4. /usr/lib/systemd/system/consul.service

  1. [Unit]
  2. Description="HashiCorp Consul - A service mesh solution"
  3. Documentation=https://www.consul.io/
  4. Requires=network-online.target
  5. After=network-online.target
  6. ConditionFileNotEmpty=/etc/consul.d/consul.hcl
  7. [Service]
  8. User=consul
  9. Group=consul
  10. ExecStart=/usr/bin/consul agent -config-dir=/etc/consul.d/
  11. ExecReload=/bin/kill --signal HUP $MAINPID
  12. KillMode=process
  13. KillSignal=SIGTERM
  14. Restart=on-failure
  15. LimitNOFILE=65536
  16. [Install]
  17. WantedBy=multi-user.target

在指示 systemd 启动 Consul 服务之前,使用 systemctl enable 命令将其设置为开机启动。这可以确保如果你重新启动虚拟机,Consul 也会随之重启:

  1. $ sudo systemctl enable consul
  2. Created symlink /etc/systemd/system/...

现在你可以启动 Consul 服务:

  1. $ sudo systemctl start consul

检查 Consul 服务的状态:

  1. $ sudo systemctl status consul
  2. consul.service - "HashiCorp Consul - A service mesh solution"
  3. Loaded: loaded (/lib/systemd/...
  4. Active: active (running) since ...
  5. ...

如果状态显示为 active (running),那么 Consul 正在运行!

你可以使用 journalctl 查看 Consul 的日志:

  1. $ sudo journalctl -u consul
  1. $ journalctl -u consul
  2. systemd[1]: Started "HashiCorp Consul - A service mesh solution".
  3. consul[31615]: ==> Starting Consul agent...
  4. consul[31615]: Version: '1.11.5'
  5. consul[31615]: Node ID: '01ec3a1e-11c5-9a04-0a62-65afaf4447b2'
  6. consul[31615]: Node name: 'vagrant'
  7. consul[31615]: Datacenter: 'dc1' (Segment: '<all>')
  8. consul[31615]: Server: true (Bootstrap: true)
  9. consul[31615]: Client Addr: [0.0.0.0] (HTTP: 8500, HTTPS: -1, ...
  10. ...

Consul 日志查看提示

  • 如果日志占满了整个屏幕,可以使用 j 键向下滚动,使用 k 键向上滚动。
  • journalctl 的全屏模式下,输入 q 退出。
  • 要实时查看日志,使用 -f 标志:journalctl -u consul -f,然后使用 Ctrl-c 退出。

恭喜!

你已经在虚拟机上成功启动了 Consul 服务器。书中的练习只需要一个 Consul 节点,因此无需进一步配置。有关在生产环境中运行 Consul 所需的额外步骤,请参见“生产环境中的 Consul”侧边栏。

生产环境中的 Consul

你的生产集群需要多个节点。如第 2 章所示,你需要运行三个或五个 Consul 服务器节点,并根据需要配置足够的工作负载节点。

服务器节点将与本练习中的节点类似地进行配置,但它们还会使用 retry_join 设置配置其他服务器节点的地址。这确保服务器节点能够使用 Raft 进行相互通信。

工作负载节点也将使用类似的配置,但这些节点上的 Consul 服务将以客户端模式运行。Consul 使用相同的二进制文件来运行服务器和客户端,因此你只需将 server 设置为 false 即可让 Consul 以客户端模式运行。

有关在生产环境中运行 Consul 的更多信息,请从“创建本地 Consul 数据中心”教程开始。

与 Consul 交互

现在 Consul 已经运行,接下来是与其交互。你可以通过三种方式与 Consul 进行交互:通过其 UI、CLI 或 API。如果运行在 Kubernetes 上,你还将使用自定义资源。

Consul 的 UI

首先,让我们看看 UI。在你的示例安装中,UI 是由 Consul 服务器托管的。

客户端托管 UI

Consul 客户端也可以托管 UI,但在 Kubernetes 上,只有服务器被配置为托管 UI。这是因为服务器 Pod 更稳定——在你查看 UI 时,它们不太可能被重启——而客户端 Pod 会随着节点的增加和删除而出现和消失。

在虚拟机上,Consul 操作员通常也仅配置服务器来托管 UI,原因相同。

在虚拟机上,localhost:8500 已经从虚拟机转发过来,因此你不需要做其他操作即可访问 UI。

在使用 macOS 的 minikube 上,你应该已经启动了 minikube tunnel 来转发端口,但如果你在云端或 Linux 上运行 Kubernetes,请使用 kubectl port-forward 来访问 UI:

  1. $ kubectl port-forward service/consul-ui -n consul 8500

要查看 UI,导航到 http://localhost:8500。你应该能看到 UI,如图 3-1 所示。

第 3 章 - Consul 部署 - 图1

默认加载的视图是 服务视图。这个视图列出了所有 Consul 已注册的服务。当前唯一列出的服务是 consul 服务。consul 服务是 Consul 自动创建的,用于表示它自身。当你在第 4 章注册新服务时,你会看到这里列出更多服务。

侧边栏上的链接如下:

  • 服务(Services)
    链接到列出该数据中心所有服务的服务视图。这是你当前所在的页面。

  • 节点(Nodes)
    链接到列出该数据中心所有节点的节点视图。在 Kubernetes 上,这将显示所有 Kubernetes 节点和每个 Consul 服务器 Pod。在虚拟机上,这将显示所有部署了 Consul 客户端和服务器的虚拟机。如果你使用 Vagrant,那么应该只有一个节点,因为你正在运行一个单一的虚拟机。

  • 键/值(Key/Value)
    链接到 Consul 的键/值存储,用于动态服务配置。Consul 的键/值存储非常强大,但在将 Consul 作为服务网格使用时不是必需的。

  • 意图(Intentions)
    链接到 Consul 的意图管理视图。意图是关于哪些服务可以与其他服务通信的规则。意图将在第 6 章中详细介绍。

在这些链接下方,有一个 访问控制(Access Controls) 部分,包含灰显的链接到 令牌(Tokens)策略(Policies)角色(Roles)认证方法(Auth Methods) 页面。这些页面用于配置 Consul 的访问控制列表(ACL)系统。ACL 设置关于谁可以执行某些任务的规则,是安全、生产就绪的 Consul 安装的关键部分。你当前的安装没有启用 ACL,因为 ACL 可能会使初次尝试 Consul 功能时变得更加复杂。ACL 将在第 10 章中讨论。

在页面顶部,有以下链接:

  • dc1
    这个下拉菜单显示当前 Consul 数据中心的名称。当部署多个 Consul 数据中心时(也在第 10 章中描述),下拉菜单可以让你在数据中心之间切换。

  • 帮助(Help)
    这个下拉菜单链接到 Consul 的文档、HashiCorp 的学习网站(包含教程)以及 Consul 的 GitHub 问题创建页面。

  • 设置(Settings)
    这个链接到设置视图,用于配置 UI 设置。这些设置仅适用于你的浏览器,而不适用于其他 Consul 用户。

如果你导航回到服务页面并点击 consul 服务,你将进入服务实例视图(如图 3-2 所示)。

第 3 章 - Consul 部署 - 图2

服务实例视图 显示了特定服务的所有实例——在这个例子中是 consul 服务。

这个视图展示了某个服务的所有运行实例。例如,如果你的 Kubernetes 部署有多个副本,每个 Pod 都会在这里列出。或者,如果你在多个虚拟机上运行相同服务的多个副本,每个副本也会在这里列出。

在你的安装中,consul 服务只有一个实例被列出。这是因为 Consul 在每个服务器节点上注册 consul 服务,而你仅运行了一个服务器。

在实例列表中,你可以看到关于这个 consul 服务实例的更多细节:

  • 无服务检查(No service checks)
    服务检查是针对服务实例的健康检查。例如,你可能会注册一个检查来确保某个端口是开放的。consul 服务没有服务检查,因为 Consul 自身检查自己没有意义(如果它挂掉了,就没有东西来更新检查状态)。第 8 章将详细介绍服务检查。

  • 所有节点检查通过(All node checks passing)
    节点检查是针对节点而非特定服务实例的检查。例如,你可以在节点上注册一个检查,当节点的磁盘满时检查会失败。节点检查影响该节点上所有服务实例。如果节点检查失败,该节点上的所有服务都被认为是不健康的。

  • consul-server-0/vagrant
    这是实例运行的节点名称。默认情况下,节点名称是实例运行的机器的主机名。在 Kubernetes 中,节点名称是 consul-server-0,因为 Kubernetes 将 Pod 的主机名设置为 Pod 名称。在 Vagrant VM 中,Vagrant 将主机名设置为 vagrant

  • \:8300
    这是服务实例的 IP 和端口。在 Kubernetes 中,IP 将设置为 Pod IP,在 Vagrant 中,IP 将设置为 127.0.0.1(对应于 bind_addr)。端口设置为 8300,因为这是 Consul 内部远程过程调用(RPC)流量的端口。

Consul 的 UI 是一个强大的工具,可以快速了解你的安装状态。你将在书中的许多任务中使用 UI,但现在我们来看看 CLI。

Consul 的 CLI

Consul 的 CLI 是通过运行 consul 二进制文件来调用的。在 Kubernetes 中,你可以使用 kubectl exec 进入一个已经安装了 consul 二进制文件的 Consul Pod 中,获得命令行 shell:

  1. $ kubectl exec -it consul-server-0 -n consul -- sh

提示: 输入 Ctrl-d 退出 kubectl exec 会话或运行 exit 命令。

在虚拟机上,你已经 SSH 进入虚拟机,那里可以使用 consul 命令。

查看可用的子命令,运行:

  1. $ consul --help
  1. $ consul --help
  2. Usage: consul [--version] [--help] <command> [<args>]
  3. Available commands are:
  4. acl Interact with Consul's ACLs
  5. agent Runs a Consul agent
  6. catalog Interact with the catalog
  7. config Interact with Consul's Centralized Configurations
  8. connect Interact with Consul Connect
  9. debug Records a debugging archive for operators
  10. event Fire a new event
  11. ...

你现在使用 CLI 可以做的事情不多,因为你的集群没有运行任何服务,但你至少可以列出当前的服务:

  1. $ consul catalog services
  2. consul

查看当前的节点

  1. $ consul catalog nodes
  2. Node ID Address DC
  3. consul-server-0 4fd4d9c3 172.17.0.9 dc1
  4. minikube 5490f3d5 172.17.0.10 dc1

在 Vagrant 上,由于你只运行了一个虚拟机,你只会看到列出一个节点。在 Kubernetes 上,你会看到一个 Consul 服务器节点以及每个 Kubernetes 节点的一个节点。在 minikube 中,Consul 服务器与 Consul 客户端运行在相同的底层节点上,但由于它们运行在不同的 pod 中并具有不同的 IP 地址,因此在 Consul 中被注册为独立的节点。

在底层,CLI 只是向本地 Consul 服务器发出 HTTP API 调用,并以人类可读的格式显示结果。如果你愿意,你也可以自己直接发出相同的 API 调用,而不使用 CLI。

Consul 的 API

你可以通过 Consul 的 HTTP API 控制几乎所有的资源和操作。默认情况下,API 托管在 8500 端口。你可以使用 curl 从 kubectl exec 或虚拟机内部发出与 consul catalog services CLI 命令相同的 API 调用:

  1. $ curl http://localhost:8500/v1/catalog/services?pretty
  2. {
  3. "consul": []
  4. }

每个 API 端点的路径都以 /v1/ 为前缀——例如,/v1/catalog/services。Consul 使用这个前缀来保留将来添加 v2 端点的可能性。

通常情况下,你会使用 UI 和 CLI 来进行日常操作,而使用 API 来处理更复杂的任务或获取详细信息。Consul 的 API 完整参考文档可以通过 Consul API 文档获取。

这段介绍结束了对 Consul 的 UI、CLI 和 API 的概述。如果你在 Kubernetes 上,运行 exit 以结束 kubectl exec 会话:

  1. $ exit

总结

本章讲解了如何在 Kubernetes 或虚拟机上部署 Consul。要在 Kubernetes 上部署,你学习了如何使用 consul-k8s CLI 和使用 values.yaml 文件配置安装。在虚拟机上,你学习了如何使用 HCL 配置文件配置 Consul,并使用 systemd 管理 Consul 进程。

一旦 Consul 启动并运行,你可以使用 UI、CLI 和 API 与 Consul 交互并查看有关安装的信息。

现在 Consul 已经运行,你可以开始学习如何将服务部署到 Consul 服务网格中。