@RequestMapping( method=GET)
@ResponseBody
public String minion() throws UnknownHostException {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Host: ").append(InetAddress.getLocalHost().getHostName()).append("
");
return stringBuilder.toString();
}
但这并不能完全满足需求。我们可以输出ASCII字,但选择哪种minion类型?为此可以使用一个技巧。创建一个可以采用我们选择的任何minion类型的应用程序。要做到这一点,需要它包含一个ASCII艺术字库。因此,我们创建了一个名为MinionsLibrary的类,使用@Component注解,在内部我们创建了一个地图,我们使用此博客[2]中的一些minions初始化:
@Component
public class MinionsLibrary {
private Map map = new HashMap<>();
public MinionsLibrary(){
map.put("one-eyed-minion",);
map.put("two-eyed-minion",);
map.put("sad-minion",);
map.put("happy-minion",);
}
}
或者你可以从https://github.com/ryandawsonuk/minions/tree/master/src/main/java/org/minions/demo获取。
@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("
");
stringBuilder.append("Minion Type: ").append(appName).append("
");
stringBuilder.append("IP: ").append(InetAddress.getLocalHost().getHostAddress()).append("
");
stringBuilder.append("Version: ").append(version).append("
");
stringBuilder.append(minionsLibrary.getMinion(appName));
return stringBuilder.toString();
}
}
现在选择'image'包以匹配应用程序名称,该名称将是minion类型名称(例如'单眼小黄人')。
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参数来限制程序的内存占用(关于降低内存,可以参考该文章[3])。
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服务将自动将请求路由到其中一个或另一个。
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 delete pod happy-minion-58c9c46d67-j84s9
如果你在浏览器中点击刷新几次(杀死小黄人兵可能需要一点时间),你会看到该服务会使用该类型的另一个小黄人。如果浏览Pod部分,您将看到Kubernetes创建了一个新的Pod来代替您删除的那个,以保证该部署中有两个节点。
minReadySeconds: 10
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
docker build . -t minion:0.2
然后打开minion-army.yml并找到 - 用“0.2”替换所有“最新”,保存更改并执行:
kubectl apply -f minion-army.yml --record
刷新其中一个minion类型的浏览器,以查看版本更改是否与kubectl rollout status部署中看到的内容一致,其中是minion类型(例如one-eyed-minion)。
kubectl delete -f minion-army.yml
用“minikube stop”停止minikube。
https://github.com/ryandawsonuk/minions/blob/master/minion-army.yml
http://textart4u.blogspot.co.uk/2013/08/minions-emoticons-text-art-for-facebook.html
https://dzone.com/articles/how-to-decrease-jvm-memory-consumption-in-docker-u