前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java程序员如何快速理解Kubernetes

Java程序员如何快速理解Kubernetes

作者头像
用户7886150
修改2020-12-02 14:28:28
3280
修改2020-12-02 14:28:28
举报
文章被收录于专栏:bit哲学院

参考链接: 如何成为一名优秀的Java程序员

我们希望微服务是可复制的,可替换的工作节点,这样可以轻松进行升级或降级,同时无需任何停机时间,并花费最少代价的管理。我们可以说我们希望他们成为我们的小黄人(minions)。本文我们将通过一个简单的例子来了解Kubernetes可以通过创建和编排一群“小黄人"来为我们做些什么。您可以与本文一起编码或从此处[1]克隆项目。

 先决条件

 需要将使用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)@ResponseBodypublic 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初始化:

 @Componentpublic 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变为:

 @RestControllerpublic 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 BUILDMINIONCOPY src /usr/src/myapp/srcCOPY pom.xml /usr/src/myappRUN mvn -f /usr/src/myapp/pom.xml clean package -DskipTestsFROM openjdk:alpineCOPY --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/v1beta1kind: Deploymentmetadata: name: one-eyed-minionlabels:   serviceType: one-eyed-minionspec: replicas: 2template:   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: v1kind: Servicemetadata: name: one-eyed-minion-entrypointnamespace: defaultspec: selector:   serviceType: one-eyed-minionports:   - port: 8080     targetPort: 8080     nodePort: 30080type: 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):30080open http://$(minikube ip):30081open http://$(minikube ip):30082open 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: 10strategy:   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.ymlhttp://textart4u.blogspot.co.uk/2013/08/minions-emoticons-text-art-for-facebook.htmlhttps://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

 Kubernetes实战培训

 Kubernetes应用实战培训将于2018年10月12日在深圳开课,3天时间带你系统学习Kubernetes

 。本次培训包括:容器基础、Docker基础、Docker进阶、Kubernetes架构及部署、Kubernetes常用对象、Kubernetes网络、存储、服务发现、Kubernetes的调度和服务质量保证、监控和日志、Helm、项目实践等,点击下方图片查看详情。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档