kubernetes 配置JAVA微服务
构建和部署Java微服务
首先,确保设置了Kubernetes环境。一旦终端输出完消息并准备好输入,就应该设置它。要确认已准备就绪,请运行以下命令:
kubectl version
现在应该可以看到kubectl客户机和服务器的版本了。如果是这样的话,你的环境就都设置好了。如果看不到Kubernetes服务器的版本,请稍等片刻,然后重复前面的命令,直到它显示出来。
现在您需要导航到为您提供的项目目录。这包括微文件微服务的实现、微文件运行时的配置和Kubernetes配置。
cd sample-kubernetes-config/start/
您将注意到有一个“finish”目录。其中包含本教程的完成代码,以供参考。
您将部署的两个微服务称为“system”和“inventory”。系统微服务返回它正在运行的容器的JVM属性。inventory微服务将系统微服务中的属性添加到inventory中。这演示了如何在Kubernetes集群中的独立pod中实现两个微服务之间的通信。要使用Maven构建应用程序,请依次运行以下命令:
mvn package -pl system
mvn package -pl inventory
一旦构建了服务,就需要将它们部署到Kubernetes。要了解有关Kubernetes清单的更多信息,请查看以下文档:https://kubernetes.io/docs/concepts/cluster-administration/manage-deployment/
为此,请使用以下命令:
kubectl apply -f kubernetes.yaml
向微服务发出请求
下面的两个命令将检查pods的状态,并检查它们何时处于就绪状态。这是通过向命令提供pod的标签(如inventory)来实现的。发出以下命令以检查微服务的状态:
kubectl wait --for=condition=ready pod -l app=inventory
kubectl wait --for=condition=ready pod -l app=system
一旦您看到上述每个命令满足了输出条件,就意味着您的微服务已经准备好接收请求。
既然您的微服务已经部署并以就绪状态运行,那么您就可以发送一些请求了。接下来,您将使用curl向“system”服务发出httpget请求。该服务由请求中传递的用户id和密码进行保护。
curl -u bob:bobpwd http://( minikube ip ):32000/inventory/systems/system-service
清单服务将调用系统服务并在返回结果之前将响应数据存储在清单服务中。
在本教程中,您将使用Kubernetes ConfigMap修改X-App-Name:response头。通过运行以下curl命令查看它们的当前值:
curl -# -I -u bob:bobpwd -D - http://$( minikube ip ):31000/system/properties | grep -i ^X-App-Name:
修改系统微服务
系统服务被硬编码为将system作为应用程序名称。为了使其可配置,您将添加appName成员和代码,以将X-App-Name设置到/sample kubernetes config/start/system/src/main/java/system/SystemResource.java文件中。单击上面的链接打开文件,然后使用Katacode文本编辑器将现有代码替换为以下代码:
复制到剪贴簿包装系统;
package system;
// CDI
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.ws.rs.GET;
// JAX-RS
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.eclipse.microprofile.config.inject.ConfigProperty;
@RequestScoped
@Path("/properties")
public class SystemResource {
@Inject
@ConfigProperty(name = "APP_NAME")
private String appName;
@Inject
@ConfigProperty(name = "HOSTNAME")
private String hostname;
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getProperties() {
return Response.ok(System.getProperties())
.header("X-Pod-Name", hostname)
.header("X-App-Name", appName)
.build();
}
}
这些更改使用microfile Config和CDI将名为APP\u NAME的环境变量的值注入到SystemResource类的appName成员中。microfile Config支持从中接收配置的许多配置源,包括环境变量。
修改资源清册微服务
清单服务是硬编码的,以使用bob和bobpwd作为凭据来对系统服务进行身份验证。您将使用Kubernetes秘密配置这些凭据。在Katacoda文本编辑器中,通过单击以下链接打开该文件/sample kubernetes config/start/inventory/src/main/java/inventory/client/SystemClient.java并将//Basic Auth Credentials下的两行替换为
// Basic Auth Credentials
@Inject
@ConfigProperty(name = "SYSTEM_APP_USERNAME")
private String username;
@Inject
@ConfigProperty(name = "SYSTEM_APP_PASSWORD")
private String password;
这些更改使用microfile Config和CDI将环境变量 SYSTEM_APP_USERNAME 和 SYSTEM APP PASSWORD的值注入到SystemClient类中。
创建ConfigMap和Secret
有几种方法可以在容器中配置环境变量。您将使用Kubernetes ConfigMap和Kubernetes secret来设置这些值。这些是Kubernetes提供的资源,用于向容器提供配置值。一个好处是它们可以跨多个容器重用,包括为不同的容器分配不同的环境变量。
使用以下kubectl命令创建ConfigMap以配置应用程序名称:
kubectl create configmap sys app name--from literal name=my system
此命令将名为sys app name的ConfigMap部署到集群。它有一个名为name的键,其值为my system。--from literal标志允许您指定要存储在此ConfigMap中的各个键值对。其他可用的选项,例如--from file和--from env file,提供了关于如何配置的更多功能。关于这些选项的详细信息可以在这里的Kubernetes CLI文档中找到https://kubernetes.io/docs/concepts/configuration/configmap/.
使用以下kubectl命令创建一个机密以配置清单服务将用于对系统服务进行身份验证的凭据:
kubectl create secret generic sys-app-credentials --from-literal username=bob --from-literal password=bobpwd
这个命令看起来与创建ConfigMap的命令非常相似,一个区别是generic这个词。这意味着你正在创建一个通用的秘密,这意味着它不是一个特殊类型的秘密。有不同类型的秘密,例如存储Docker凭据的秘密和存储公钥/私钥对的秘密。
机密与ConfigMap类似,只是机密用于敏感信息(如凭据)。其中一个主要的区别是,你必须明确地告诉kubectl给你看一个秘密的内容。此外,当它确实向您显示信息时,它只向您显示Base64编码版本,以便临时旁观者不会意外地看到任何敏感数据。默认情况下,“秘密”不提供任何加密,这是您需要自己完成或找到其他选项来配置的。
更新Kubernetes资源
现在,您将根据ConfigMap和Secret中配置的值更新Kubernetes部署,以设置容器中的环境变量。编辑kubernetes.yaml文件(位于start目录中)。此文件定义Kubernetes部署。请注意valueFrom字段。这指定了环境变量的值,可以从各种源进行设置。源包括ConfigMap、Secret和有关集群的信息。在本例中,configMapKeyRef使用ConfigMap sys app name的值设置密钥名称。类似地,secretKeyRef使用Secret sys app credentials中的值设置密钥username和password。
通过单击上面的链接打开/sample kubernetes config/start/kubernetes.yaml文件,并用以下内容替换内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: system-deployment
labels:
app: system
spec:
selector:
matchLabels:
app: system
template:
metadata:
labels:
app: system
spec:
containers:
- name: system-container
image: system:1.0-SNAPSHOT
ports:
- containerPort: 9080
# Set the APP_NAME environment variable
env:
- name: APP_NAME
valueFrom:
configMapKeyRef:
name: sys-app-name
key: name
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: inventory-deployment
labels:
app: inventory
spec:
selector:
matchLabels:
app: inventory
template:
metadata:
labels:
app: inventory
spec:
containers:
- name: inventory-container
image: inventory:1.0-SNAPSHOT
ports:
- containerPort: 9080
# Set the SYSTEM_APP_USERNAME and SYSTEM_APP_PASSWORD environment variables
env:
- name: SYSTEM_APP_USERNAME
valueFrom:
secretKeyRef:
name: sys-app-credentials
key: username
- name: SYSTEM_APP_PASSWORD
valueFrom:
secretKeyRef:
name: sys-app-credentials
key: password
---
apiVersion: v1
kind: Service
metadata:
name: system-service
spec:
type: NodePort
selector:
app: system
ports:
- protocol: TCP
port: 9080
targetPort: 9080
nodePort: 31000
---
apiVersion: v1
kind: Service
metadata:
name: inventory-service
spec:
type: NodePort
selector:
app: inventory
ports:
- protocol: TCP
port: 9080
targetPort: 9080
nodePort: 32000
部署更改
现在需要重新构建和部署应用程序,以使更改生效。使用以下命令重新生成应用程序,确保位于开始目录中:
mvn package -pl system
mvn package -pl inventory
现在,您需要删除旧的Kubernetes部署,然后通过发出以下命令部署更新的部署:
kubectl replace --force -f kubernetes.yaml
您应该看到命令的以下输出:
kubectl replace --force -f kubernetes.yaml
deployment.apps "system-deployment" deleted
deployment.apps "inventory-deployment" deleted
service "system-service" deleted
service "inventory-service" deleted
deployment.apps/system-deployment replaced
deployment.apps/inventory-deployment replaced
service/system-service replaced
service/inventory-service replaced
使用以下工具检查服务的pods的状态:
kubectl get --watch pods
您最终应该看到这两个服务的就绪状态。按Ctrl-C退出终端命令。
调用更新的系统服务并使用curl命令检查标头:
curl -# -I -u bob:bobpwd -D - http://( minikube ip ):32000/inventory/systems/system-service
如果请求失败,请检查您是否正确配置了密码。