淘宝优惠券返利网站怎么做,手机网站设计公司皆选亿企邦,宝应百度贴吧,网站已收录的404页面的查询我们希望微服务是可复制的#xff0c;可替换的工作节点#xff0c;这样可以轻松进行升级或降级#xff0c;同时无需任何停机时间#xff0c;并花费最少代价的管理。我们可以说我们希望他们成为我们的小黄人#xff08;minions#xff09;。本文我们将通过一个简单的例子来… 我们希望微服务是可复制的可替换的工作节点这样可以轻松进行升级或降级同时无需任何停机时间并花费最少代价的管理。我们可以说我们希望他们成为我们的小黄人minions。本文我们将通过一个简单的例子来了解Kubernetes可以通过创建和编排一群“小黄人来为我们做些什么。您可以与本文一起编码或从此处[1]克隆项目。 先决条件 需要将使用Docker容器化微服务以便在Kubernetes中运行它们。我们将使用Minikube而不是使用云托管的Kubernetes以便可以在本地沙箱运行。 目的 我们的小黄人军团将是Java微服务。我们希望军团中有不同类型的工作角色以便能够了解Kubernetes可以为我们做些什么。因此我们的目标是让每个微服务都响应一个简单的http请求其响应如下
使用ASCII字来表示minion的类型。 构建Java Minion服务 我们可以通过Spring Boot Web应用程序来启动我们的微服务程序使用具有Web启动依赖性的Spring Initializr初始化
在项目中创建一个使用RestController注释的Controller来处理请求。使用RequestMappingmethod GET来提供响应主体。所以首先我们可以这样做 RequestMapping( methodGET)
ResponseBody
public String minion() throws UnknownHostException { StringBuilder stringBuilder new StringBuilder(); stringBuilder.append(Host: ).append(InetAddress.getLocalHost().getHostName()).append(br/); return stringBuilder.toString();
}
但这并不能完全满足需求。我们可以输出ASCII字但选择哪种minion类型为此可以使用一个技巧。创建一个可以采用我们选择的任何minion类型的应用程序。要做到这一点需要它包含一个ASCII艺术字库。因此我们创建了一个名为MinionsLibrary的类使用Component注解在内部我们创建了一个地图我们使用此博客[2]中的一些minions初始化 Component
public class MinionsLibrary { private MapString,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/ryandawsonuk/minions/tree/master/src/main/java/org/minions/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.minionsLibraryminionsLibrary; } RequestMapping( methodGET) 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 --fromBUILDMINION /usr/src/myapp/target/*.jar /maven/
CMD java $JAVA_OPTS -jar maven/*.jar
从开始到FROM openjdkalpine是构建JAR然后jar包被拷贝到基于轻量的openjdk:alpine镜像的下一阶段构建。使用JAVA_OPTS参数来限制程序的内存占用关于降低内存可以参考该文章[3]。 然后使用命令“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服务将自动将请求路由到其中一个或另一个。 该服务将通过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”会发生什么可以通过仪表板的Pod部分删除 kubectl delete pod happy-minion-58c9c46d67-j84s9
如果你在浏览器中点击刷新几次杀死小黄人兵可能需要一点时间你会看到该服务会使用该类型的另一个小黄人。如果浏览Pod部分您将看到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部署中看到的内容一致其中是minion类型例如one-eyed-minion。 小黄人回滚 要查看已部署的历史记录请执行kubectl rollout history deployment 回滚执行 kubectl rollout undo deployment --to-revision 1可能需要一段时间。 销毁军团 用以下方法摧毁军队 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