内容简介:【编者的话】通过Minikube向Java开发人员Kubernetes的相关操作我们希望微服务是可复制的,可替换的工作节点,这样可以轻松进行升级或降级,同时无需任何停机时间,并花费最少代价的管理。我们可以说我们希望他们成为我们的小黄人(minions)。本文我们将通过一个简单的例子来了解Kubernetes可以通过创建和编排一群“小黄人"来为我们做些什么。您可以与本文一起编码或从需要将使用Docker容器化微服务以在Kubernetes中运行它们。我们将使用Minikube,而不是使用云托管的Kubern
【编者的话】通过Minikube向 Java 开发人员Kubernetes的相关操作
我们希望微服务是可复制的,可替换的工作节点,这样可以轻松进行升级或降级,同时无需任何停机时间,并花费最少代价的管理。我们可以说我们希望他们成为我们的小黄人(minions)。本文我们将通过一个简单的例子来了解Kubernetes可以通过创建和编排一群“小黄人"来为我们做些什么。您可以与本文一起编码或从 此处 克隆项目。
先决条件
需要将使用 Docker 容器化微服务以在Kubernetes中运行它们。我们将使用Minikube,而不是使用云托管的Kubernetes,以便可以在本地沙箱运行。
目的
我们的小黄人军团将是Java微服务。我们希望军团中有不同类型的工作角色,以便能够了解Kubernetes可以为我们做些什么。因此,我们的目标是让每个微服务都响应一个简单的http请求,其响应如下:
使用ASCII字来表示minion的类型。
构建Java Minion服务
我们可以通过Spring Boot Web应用程序来启动我们的微服务,程序使用具有Web启动依赖性的 Spring Initializr 初始化:
在项目中,创建一个使用@RestController注释的Controller来处理请求。使用@RequestMapping(method = GET)来提供响应主体。所以首先我们可以这样做:
```
@RequestMapping(method = GET)
@ResponseBody
public String minion()throwUnknownHostException {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(“Host:”)。append(InetAddress.getLocalHost()。getHostName())。append(“<br/>”);
return stringBuilder.toString();
}
```
但这并不能完全满足需求。我们可以输出ASCII字,但选择哪种minion类型?为此可以使用一个技巧。创建一个可以采用我们选择的任何minion类型的应用程序。要做到这一点,我们需要它包含一个ASCII艺术字库。因此,我们创建了一个名为MinionsLibrary的类,使用@Component注解,在内部我们创建了一个地图,我们使用 此博客 中的一些minions初始化:
```
@Component
public class MinionsLibrary {
private Map<String,String> map = new HashMap<>();
public MinionsLibrary(){
map.put("one-eyed-minion",<COPY-PASTE MINION ASCII ART HERE>);
map.put("two-eyed-minion",<COPY-PASTE MINION ASCII ART HERE>);
map.put("sad-minion",<COPY-PASTE MINION ASCII ART HERE>);
map.put("happy-minion",<COPY-PASTE MINION ASCII ART HERE>);
}
}
```
或者你可以从 https://github.com/ryandawsonu ... /demo 获取。
然后告诉微服务是哪种minion类型。使用spring应用程序的名称属性(我们稍后可以使用docker环境变量设置)来执行此操作。它还将帮助我们稍后在响应中显示我们的应用程序版本,所以现在的Controller变为:
```
@RestController
public class Controller {
private final String version = "0.1";
private MinionsLibrary minionsLibrary;
@Value("${spring.application.name}")
private String appName;
public Controller(MinionsLibrary minionsLibrary){
this.minionsLibrary=minionsLibrary;
}
@RequestMapping( method=GET)
@ResponseBody
public String minion() throws UnknownHostException {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Host: ").append(InetAddress.getLocalHost().getHostName()).append("<br/>");
stringBuilder.append("Minion Type: ").append(appName).append("<br/>");
stringBuilder.append("IP: ").append(InetAddress.getLocalHost().getHostAddress()).append("<br/>");
stringBuilder.append("Version: ").append(version).append("<br/>");
stringBuilder.append(minionsLibrary.getMinion(appName));
return stringBuilder.toString();
}
}
```
现在选择'image'包以匹配应用程序名称,该名称将是minion类型名称(例如'单眼小黄人')。
容器化并部署
需要为我们的应用程序创建一个Docker镜像。我们想在Docker镜像中构建可执行的jar,然后在容器启动时启动Java应用程序。可以使用多阶段Docker构建来完成此任务。 Dockerfile是:
```
FROM maven:3.5-jdk-8 as BUILDMINION
COPY src /usr/src/myapp/src
COPY pom.xml /usr/src/myapp
RUN mvn -f /usr/src/myapp/pom.xml clean package -DskipTests
FROM openjdk:alpine
COPY --from=BUILDMINION /usr/src/myapp/target/*.jar /maven/
CMD java $JAVA_OPTS -jar maven/*.jar
```
从开始到'FROM openjdk:alpine'是构建JAR,然后jar包被拷贝到基于 轻量的openjdk:alpine镜像的下一阶段构建。
使用JAVA_OPTS参数来限制程序的内存占用(关于降低内存,可以参考 该文章 )
然后使用命令“docker build . -t minion”构建一个镜像。
通过创建Kubernetes部署文件来部署它。我们称之为“minion-army.yml”。这将包含每个minion类型的条目。这是其中的一个minion类型:
```
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: one-eyed-minion
labels:
serviceType: one-eyed-minion
spec:
replicas: 2
template:
metadata:
name: one-eyed-minion
labels:
serviceType: one-eyed-minion
spec:
containers:
- name: one-eyed-minion
image: minion:latest
imagePullPolicy: Never
ports:
- containerPort: 8080
env:
- name: JAVA_OPTS
value: -Xmx64m -Xms64m
- name: SPRING_APPLICATION_NAME
value: "one-eyed-minion"
---
apiVersion: v1
kind: Service
metadata:
name: one-eyed-minion-entrypoint
namespace: default
spec:
selector:
serviceType: one-eyed-minion
ports:
-
port: 8080
targetPort: 8080
nodePort: 30080
type: NodePort
```
请注意,“SPRING_APPLICATION_NAME”变量会自动与spring.application.name属性匹配,以便此minion服务成为单眼小黄人类型。有两个这种minion类型的实例(副本)可用,Kubernetes服务将自动将请求路由到其中一个或另一个。
该服务将面向Kubernetes以外的世界 - 与Minikube一起请求30080端口将进入该服务。 (对于真正的Kubernetes,服务的这一点会有所不同,因为我们使用LoadBalancer而不是NodePort,并且不会限制在minikube端口范围。)服务将使用与服务匹配的Pod来处理它。我们将为每种类型提供一种服务。
minion类型的部署将创建两个Pod。每个人都是这种类型的奴才。
我们可以为每个minion类型重复上面的配置,每次增加外部端口号以便使用不同的端口。或者我们可以使用这个Github存储库,它还具有其他配置,可以在不停机的情况下进行小型版本升级。 (如果我们使用helm,我们可以避免重复,但我们不想添加比我们更多的工具。)
创建军团
首先启动mMinikube:
minikube start --memory 4000 --cpus 3
等待它开始,然后将您的Docker registry 链接到Minikube,并为Minikube构建minion图像:
```
eval $(minikube docker-env)
docker build . -t minion
```
然后我们可以部署军团:
kubectl create -f minion-army.yml
并看到类型:
```
open http://$(minikube ip):30080
open http://$(minikube ip):30081
open http://$(minikube ip):30082
open http://$(minikube ip):30083
```
每个看起来都很像文章开头的快乐小黄人页面。
我们可以通过“kubectl get pods”来查看整个军队,或者“minikube dashboard”进到Pods页面
创造更多的部队
我们可以在minikube dashboard的Deployments部分下创建更多特定类型的minions:
一个小黄人倒下,另一个替补他的位置
假设从浏览器点击快乐小黄人服务时得到的:
如果杀死“happy-minion-58c9c46d67-j84s9”会发生什么们可以通过仪表板的Pods部分删除:
kubectl delete pod happy-minion-58c9c46d67-j84s9
如果你在浏览器中点击刷新几次(杀死小黄人兵可能需要一点时间),你会看到该服务会使用该类型的另一个小黄人。如果浏览Pods部分,您将看到Kubernetes创建了一个新的Pod来代替您删除的那个,以保证该部署中有两个节点。
Minion升级
我们还可以为小黄人进行滚动升级。为此,我们应该在minions-army.yml文件的每个Deployment部分的'spec'部分下面(它可以直接位于同一级别的'replicas'下面):
```
minReadySeconds: 10
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
```
然后将Controller类中的版本更改为0.2,保存它然后执行:
docker build . -t minion:0.2
然后打开minion-army.yml并找到 - 用“0.2”替换所有“最新”,保存更改并执行:
kubectl apply -f minion-army.yml --record
刷新其中一个minion类型的浏览器,以查看版本更改是否与kubectl rollout status部署中看到的内容一致,其中<deployment_name>是minion类型(例如one-eyed-minion)。
小黄人回滚
要查看已部署的历史记录,请执行kubectl rollout history deployment <deployment_name>,回滚执行 kubectl rollout undo deployment <deployment_name> --to-revision = 1(可能需要一段时间)
销毁军团
用以下方法摧毁军队:
kubectl delete -f minion-army.yml
用“minikube stop”停止minikube。
原文链接: Minions in Minikube - A Kubernetes Intro for Java Developers (翻译:姜俊厚)
以上所述就是小编给大家介绍的《Minikube中的小黄人 - 面向Java开发人员的Kubernetes简介》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
ANSI Common Lisp
Paul Graham / Prentice Hall / 1995-11-12 / USD 116.40
For use as a core text supplement in any course covering common LISP such as Artificial Intelligence or Concepts of Programming Languages. Teaching students new and more powerful ways of thinking abo......一起来看看 《ANSI Common Lisp》 这本书的介绍吧!