Java程序猿怎样高速理解Kubernetes
https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/82892167
我们能够说我们希望他们成为我们的小黄人(minions)。
本文我们将通过一个简单的样例来了解Kubernetes能够通过创建和编排一群“小黄人"来为我们做些什么。您能够与本文一起编码或从此处[1]克隆项目。
先决条件
目的
我们希望军团中有不同类型的工作角色,以便能够了解Kubernetes能够为我们做些什么。因此,我们的目标是让每一个微服务都响应一个简单的http请求,其响应例如以下:
使用ASCII字来表示minion的类型。
构建Java Minion服务
在项目中。创建一个使用@RestController凝视的Controller来处理请求。使用@RequestMapping(method = GET)来提供响应主体。所以首先我们能够这样做:
@RequestMapping( method=GET)
@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 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/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.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类型名称(比如'单眼小黄人')。容器化并部署
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參数来限制程序的内存占用(关于减少内存。能够參考该文章[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以port30080暴露对外提供服务 (对于真正的Kubernetes,该服务的这一点会有所不同,由于我们使用LoadBalancer而不是NodePort。而且不会限制在minikubeport范围)。
服务将使用与服务匹配的Pod来处理它。
我们将为每种类型提供一种服务。
minion类型的部署将创建两个Pod。
每一个人都是这样的类型的工作节点。
我们能够为每一个minion类型反复上面的配置,每次添加外部port号以便使用不同的port。或者我们能够使用这个GitHub存储库,它还具有其它配置,能够在不停机的情况下进行小型版本号升级(假设我们使用Helm。我们能够避免反复。但我们不想加入比我们很多其它的工具)。
创建军团
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页面:
创造很多其它的部队
一个小黄人倒下,还有一个替补他的位置
假设杀死“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
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
原文链接:https://dzone.com/articles/minions-in-minikube-a-kubernetes-intro-for-java-de