Consul与Kubernetes有许多集成,可以直接在Kubernetes上以服务器或客户端模式运行。本文介绍如何在Kubernetes集群(如果有K8s环境,可跳过先决条件的相关安装)上运行Consul Service Mesh,完成服务发现,并利用Consul分布式键值存储,完成Quarkus Java应用在运行时从Consul读取配置。
先决条件
- 安装Virturlbox
- 安装Minikube:
# 安装
brew install minikube
# 或
curl -Lo minikube http://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v0.30.0/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
# 启动
minikube start
- 安装Kubectl:
brew install kubernetes-cli
- 安装Helm:
brew install kubernetes-helm
在Kubernetes上部署Consul
在Kubernetes上运行Consul的推荐方法是通过 Helm chart。
这里是一个详细的安装和配置步骤,几分钟内就可以部署并运行一个完整的Consul。
使用官方Helm chart安装Consul
helm repo add hashicorp https://helm.releases.hashicorp.com
helm install consul hashicorp/consul --set global.name=consul
kubectl port-forward service/consul-server 8500:8500
在Kubernetes上部署Consul Service Mesh
运行Envoy的Connect sidecar可以自动注入到集群的pod中,从而自动配置Kubernetes。这里是一个安装和配置Consul Service Mesh的详细步骤。
-
配置Helm chart
cat > consul-values.yaml <<EOF global: domain: consul datacenter: minidc # minikube环境,否则 datacenter: dc server: replicas: 1 bootstrapExpect: 1 client: enabled: true grpc: true ui: enabled: true service type: 'NodePort' connectInject: enabled: true syncCatalog: enabled: true EOF
说明:
-
connectInject
键设置为true
来启用Consul Connect Service Mesh。 -
syncCatalog
设置为true
来启用同步Kubernetes和Consul Services功能,Consul可以自动同步Kubernetes和Consul中的服务。
-
部署Consul Service Mesh
helm install -f consul-values.yaml hashicorp hashicorp/consul
安装Connect injector后,便会自动将Envoy作为Sidecar代理添加到Kubernetes集群,所以使用Consul Service Mesh的所有服务都将自动注册到Consul目录中。启用syncCatalog
和connectInject
的情况下,将不再需要手动注册托管在Kubernetes集群上的服务。-
访问Consul UI
minikube service hashicorp-consul-ui
在浏览器中打开Consul UI服务(http://localhost:18500),其中包含Consul服务,节点和其他资源的列表。
滚动更新
运行Consul时,可以通过helm upgrade
命令更新配置和部署。
helm upgrade hashicorp -f consul-values.yaml hashicorp/consul
Quarkus-从Consul读取配置属性
Consul提供了一个分布式的KV存储,我们将其作为Quarkus服务的配置源。
在Quarkus项目中添加
consul-config
扩展
./mvnw quarkus:add-extension -Dextensions="consul-config"
-
在程序中使用
@ConfigProperty
读取配置import org.eclipse.microprofile.config.inject.ConfigProperty; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/gateway") public class Gateway { @ConfigProperty(name = "client.host") String host; @ConfigProperty(name = "client.port") int port; String path = "/v1/batch"; @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return host + ":" + port + path; } }
-
配置应用
在src/main/resources/application.properties
中添加应用配置:# Consul服务器名称 quarkus.application.name=consul-test # 启用从Consul读取配置文件 quarkus.consul-config.enabled=true # 此Quarkus应用程序要从Consul配置服务器读取的KV存储的键 quarkus.consul-config.properties-value-keys=config/${quarkus.application.name}
-
将配置添加到Consul
通过Consul UI(或调用API)添加属性:
config/consul-test:
client.host=127.0.0.1
client.port=8000
- 打包并运行:
./mvnw compile quarkus:dev
Quarkus允许Java程序在运行时读取Consul配置,将Quarkus应用项目打包并部署到Kubernetes中,Consul Service Mesh就自动进行服务同步和发现,任何Consul或Quarkus问题,欢迎评论区积极讨论,互相学习,永远进步。