Kubernetes中的Java和数据库应用程序服务发现

该博客将展示一个简单的Java应用程序如何使用Kubernetes中的服务发现与数据库进行对话。

DC / OS中具有Java和数据库应用程序的服务发现解释了为什么服务发现是多容器应用程序的重要方面。 该博客还解释了如何针对DC / OS做到这一点。

让我们看看如何在Kubernetes中使用单个应用程序服务器和数据库服务器实例来实现这一点。 该博客将使用WildFly作为应用程序服务器,并使用Couchbase作为数据库。

该博客将使用以下主要步骤:

  • 启动Kubernetes一节点集群
  • Kubernetes应用程序定义
  • 部署应用
  • 访问应用

启动Kubernetes集群

Minikube是在笔记本电脑上的VM中启动一个单节点Kubernetes集群的最简单方法。 二进制文件需要先下载然后安装。

完整的安装说明可在github.com/kubernetes/minikube中找到 。

最新版本可以按以下方式安装在OSX上:

curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.17.1/minikube-darwin-amd64 \
&& chmod +x minikube

它还需要安装kubectl 。 安装和设置kubectl提供了有关如何设置kubectl的详细说明。 在OSX上,它可以安装为:

curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl \
  && chmod +x ./kubectl

现在,以以下方式启动集群:

minikube start
Starting local Kubernetes cluster...
Starting VM...
Downloading Minikube ISO
 88.71 MB / 88.71 MB [==============================================] 100.00% 0s
SSH-ing files into VM...
Setting up certs...
Starting cluster components...
Connecting to cluster...
Setting up kubeconfig...
Kubectl is now configured to use the cluster.

kubectl version命令显示有关kubectl客户端和minikube服务器版本的更多详细信息:

kubectl version
Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.4", GitCommit:"7243c69eb523aa4377bce883e7c0dd76b84709a1", GitTreeState:"clean", BuildDate:"2017-03-07T23:53:09Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.3", GitCommit:"029c3a408176b55c30846f0faedf56aae5992e9b", GitTreeState:"clean", BuildDate:"1970-01-01T00:00:00Z", GoVersion:"go1.7.3", Compiler:"gc", Platform:"linux/amd64"}

可以使用kubectl cluster-info命令获取有关集群的更多详细kubectl cluster-info

Kubernetes master is running at https://192.168.99.100:8443
KubeDNS is running at https://192.168.99.100:8443/api/v1/proxy/namespaces/kube-system/services/kube-dns
kubernetes-dashboard is running at https://192.168.99.100:8443/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard
 
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

Kubernetes应用程序定义

应用程序定义在github.com/arun-gupta/kubernetes-java-sample/blob/master/service-discovery.yml中定义。 它包括:

  • Couchbase服务
  • 具有单个Pod的Couchbase副本集
  • 具有单个吊舱的WildFly副本集
apiVersion: v1
kind: Service
metadata: 
  name: couchbase-service
spec: 
  selector: 
    app: couchbase-rs-pod
  ports:
    - name: admin
      port: 8091
    - name: views
      port: 8092
    - name: query
      port: 8093
    - name: memcached
      port: 11210
---
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
  name: couchbase-rs
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: couchbase-rs-pod
    spec:
      containers:
      - name: couchbase
        image: arungupta/couchbase:travel
        ports:
        - containerPort: 8091
        - containerPort: 8092
        - containerPort: 8093
        - containerPort: 11210
---
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
  name: wildfly-rs
  labels:
    name: wildfly
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: wildfly
    spec:
      containers:
      - name: wildfly-rs-pod
        image: arungupta/wildfly-couchbase-javaee:travel
        env:
        - name: COUCHBASE_URI
          value: couchbase-service
        ports:
        - containerPort: 8080

关键部分是
COUCHBASE_URI环境变量是Couchbase服务的名称。 这允许部署在WildFly中的应用程序动态发现服务并与数据库进行通信。

arungupta / couchbase:travel Docker映像是使用github.com/arun-gupta/couchbase-javaee/blob/master/couchbase/Dockerfile创建的。

arungupta / wildfly-couchbase-javaee:travel Docker映像是使用github.com/arun-gupta/couchbase-javaee/blob/master/Dockerfile创建的。

Java EE应用程序在开始查询数据库之前等待数据库初始化完成。 可以在github.com/arun-gupta/couchbase-javaee/blob/master/src/main/java/org/couchbase/sample/javaee/Database.java#L25中看到。

部署应用

该应用程序可以部署为:

kubectl create -f ~/workspaces/kubernetes-java-sample/service-discovery.yml

服务和副本集的列表可以使用命令kubectl get svc,rs

NAME                    CLUSTER-IP   EXTERNAL-IP   PORT(S)                                AGE
svc/couchbase-service   10.0.0.97            8091/TCP,8092/TCP,8093/TCP,11210/TCP   27m
svc/kubernetes          10.0.0.1             443/TCP                                1h
svc/wildfly-rs          10.0.0.252           8080/TCP                               21m
 
NAME              DESIRED   CURRENT   READY     AGE
rs/couchbase-rs   1         1         1         27m
rs/wildfly-rs     1         1         1         27m

可以使用命令kubectl logs rs/couchbase-rs获得Couchbase单个副本的kubectl logs rs/couchbase-rs

++ set -m
++ sleep 25
++ /entrypoint.sh couchbase-server
Starting Couchbase Server -- Web UI available at http://:8091 and logs available in /opt/couchbase/var/lib/couchbase/logs
++ curl -v -X POST http://127.0.0.1:8091/pools/default -d memoryQuota=300 -d indexMemoryQuota=300
 
. . .
 
{"storageMode":"memory_optimized","indexerThreads":0,"memorySnapshotInterval":200,"stableSnapshotInterval":5000,"maxRollbackPoints":5,"logLevel":"info"}[]Type: 
++ echo 'Type: '
++ '[' '' = WORKER ']'
++ fg 1
/entrypoint.sh couchbase-server

可以使用命令kubectl logs rs/wildfly-rs查看WildFly副本集的kubectl logs rs/wildfly-rs

=========================================================================
 
  JBoss Bootstrap Environment
 
  JBOSS_HOME: /opt/jboss/wildfly
 
. . .
 
06:32:08,537 INFO  [com.couchbase.client.core.node.Node] (cb-io-1-1) Connected to Node couchbase-service
06:32:09,262 INFO  [com.couchbase.client.core.config.ConfigurationProvider] (cb-computations-3) Opened bucket travel-sample
06:32:09,366 INFO  [stdout] (ServerService Thread Pool -- 65) Sleeping for 3 secs ...
06:32:12,369 INFO  [stdout] (ServerService Thread Pool -- 65) Bucket found!
06:32:14,194 INFO  [org.jboss.resteasy.resteasy_jaxrs.i18n] (ServerService Thread Pool -- 65) RESTEASY002225: Deploying javax.ws.rs.core.Application: class org.couchbase.sample.javaee.MyApplication
06:32:14,195 INFO  [org.jboss.resteasy.resteasy_jaxrs.i18n] (ServerService Thread Pool -- 65) RESTEASY002200: Adding class resource org.couchbase.sample.javaee.AirlineResource from Application class org.couchbase.sample.javaee.MyApplication
06:32:14,310 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 65) WFLYUT0021: Registered web context: /airlines
06:32:14,376 INFO  [org.jboss.as.server] (ServerService Thread Pool -- 34) WFLYSRV0010: Deployed "airlines.war" (runtime-name : "airlines.war")
06:32:14,704 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on http://127.0.0.1:9990/management
06:32:14,704 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:9990
06:32:14,705 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 10.1.0.Final (WildFly Core 2.2.0.Final) started in 29470ms - Started 443 of 691 services (404 services are lazy, passive or on-demand)

访问应用

kubectl proxy命令启动对Kubernetes API服务器的代理。 让我们启动一个Kubernetes代理来访问我们的应用程序:

kubectl proxy
Starting to serve on 127.0.0.1:8001

使用以下步骤将WildFly副本集公开为服务:

kubectl expose --name=wildfly-service rs/wildfly-rs

可以使用kubectl get svc命令再次查看服务列表:

kubectl get svc
NAME                CLUSTER-IP   EXTERNAL-IP   PORT(S)                                AGE
couchbase-service   10.0.0.97            8091/TCP,8092/TCP,8093/TCP,11210/TCP   41m
kubernetes          10.0.0.1             443/TCP                                1h
wildfly-service     10.0.0.169           8080/TCP                               5s

现在,可以在以下位置访问该应用程序:

curl http://localhost:8001/api/v1/proxy/namespaces/default/services/wildfly-service/airlines/resources/airline

格式化的输出如下所示:

[
  {
    "travel-sample": {
      "country": "United States",
      "iata": "Q5",
      "callsign": "MILE-AIR",
      "name": "40-Mile Air",
      "icao": "MLA",
      "id": 10,
      "type": "airline"
    }
  },
  {
    "travel-sample": {
      "country": "United States",
      "iata": "TQ",
 
. . .
 
     "name": "Airlinair",
      "icao": "RLA",
      "id": 1203,
      "type": "airline"
    }
  }
]

现在,可以通过缩放副本集将新Pod添加为Couchbase服务的一部分。 现有吊舱可能会终止或重新安排。 但是Java EE应用程序将继续使用逻辑名访问数据库服务。

该博客显示了一个简单的Java应用程序如何使用Kubernetes中的服务发现与数据库进行对话。

有关更多信息,请查看:

  • Kubernetes文件
  • 容器上的Couchbase
  • Couchbase 开发人员门户
  • 在Couchbase论坛或堆栈溢出中提问
  • 下载Couchbase

翻译自: https://www.javacodegeeks.com/2017/03/service-discovery-java-database-application-kubernetes.html

你可能感兴趣的:(Kubernetes中的Java和数据库应用程序服务发现)