版权声明:本文为博主原创文章,未经博主同意不得转载。

https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/82892167

https://mmbiz.qpic.cn/mmbiz_jpg/A1HKVXsfHNnV94CLpWx1R0xuffk82oAB94KDtS9fXs1XnoPPTCla6kQBg3gXlBOvUr8hSZqxVzdG5VpM3SNNYA/640" alt="640" />

我们希望微服务是可复制的。可替换的工作节点。这样能够轻松进行升级或降级,同一时候无需不论什么停机时间,并花费最少代价的管理。

我们能够说我们希望他们成为我们的小黄人(minions)。

本文我们将通过一个简单的样例来了解Kubernetes能够通过创建和编排一群“小黄人"来为我们做些什么。您能够与本文一起编码或从此处[1]克隆项目。

先决条件

须要将使用Docker容器化微服务以便在Kubernetes中运行它们。我们将使用Minikube。而不是使用云托管的Kubernetes,以便能够在本地沙箱运行。
目的

我们的小黄人军团将是Java微服务。

我们希望军团中有不同类型的工作角色,以便能够了解Kubernetes能够为我们做些什么。因此,我们的目标是让每一个微服务都响应一个简单的http请求,其响应例如以下:

使用ASCII字来表示minion的类型。

构建Java Minion服务

https://mmbiz.qpic.cn/mmbiz_png/b2YlTLuGbKDsbJzupnILVFhPtMaRjmvPKYRqTMjibE9pnd8oiawLVrQbOHQe4wBXkBQkzpKCWPKBqWgOLgwccBug/640" alt="640" />

我们能够通过Spring Boot Web应用程序来启动我们的微服务。程序使用具有Web启动依赖性的Spring Initializr初始化:

在项目中。创建一个使用@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类型名称(比如'单眼小黄人')。
容器化并部署

须要为我们的应用程序创建一个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參数来限制程序的内存占用(关于减少内存。能够參考该文章[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。我们能够避免反复。但我们不想加入比我们很多其它的工具)。

创建军团

首先启动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:

https://mmbiz.qpic.cn/mmbiz_png/A1HKVXsfHNnV94CLpWx1R0xuffk82oAB3icnsxslQIQibC3rQgCotkDauv0bLuxI6pcZS09YE60ianPibDZVj5hiccA/640" alt="640" />
一个小黄人倒下,还有一个替补他的位置

假设从浏览器点击快乐小黄人服务时得到的:

假设杀死“happy-minion-58c9c46d67-j84s9”会发生什么?能够通过仪表板的Pod部分删除:

kubectl delete pod happy-minion-58c9c46d67-j84s9

假设你在浏览器中点击刷新几次(杀死小黄人兵可能须要一点时间),你会看到该服务会使用该类型的还有一个小黄人。

假设浏览Pod部分,您将看到Kubernetes创建了一个新的Pod来取代您删除的那个。以保证该部署中有两个节点。
Minion升级

https://mmbiz.qpic.cn/mmbiz_png/b2YlTLuGbKDsbJzupnILVFhPtMaRjmvPKYRqTMjibE9pnd8oiawLVrQbOHQe4wBXkBQkzpKCWPKBqWgOLgwccBug/640" alt="640" />

我们还能够为小黄人进行滚动升级。

为此,我们应该在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)。

小黄人回滚

https://mmbiz.qpic.cn/mmbiz_png/b2YlTLuGbKDsbJzupnILVFhPtMaRjmvPKYRqTMjibE9pnd8oiawLVrQbOHQe4wBXkBQkzpKCWPKBqWgOLgwccBug/640" alt="640" />

要查看已部署的历史记录,请运行kubectl rollout history deployment ,回滚运行 kubectl rollout undo deployment --to-revision = 1(可能须要一段时间)。
销毁军团

https://mmbiz.qpic.cn/mmbiz_png/b2YlTLuGbKDsbJzupnILVFhPtMaRjmvPKYRqTMjibE9pnd8oiawLVrQbOHQe4wBXkBQkzpKCWPKBqWgOLgwccBug/640" alt="640" />

用以下方法摧毁军队:

kubectl delete -f minion-army.yml

用“minikube stop”停止minikube。

相关链接:

  1. https://github.com/ryandawsonuk/minions/blob/master/minion-army.yml

  2. http://textart4u.blogspot.co.uk/2013/08/minions-emoticons-text-art-for-facebook.html

  3. 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-deKubernetes实战培训

Kubernetes应用实战培训将于2018年10月12日在深圳开课,3天时间带你系统学习Kubernetes本次培训包括:容器基础、Docker基础、Docker进阶、Kubernetes架构及部署、Kubernetes经常使用对象、Kubernetes网络、存储、服务发现、Kubernetes的调度和服务质量保证、监控和日志、Helm、项目实践等,点击下方图片查看详情。

https://mmbiz.qpic.cn/mmbiz_jpg/A1HKVXsfHNm7AUVR1sibd656VWmsAbcYXLk2EpqRKAL0fSOJgiasHhsWvbxsT1icybPIicGt08diaf3icrocojUINWag/640?" alt="640?" />

Java程序猿怎样高速理解Kubernetes的更多相关文章

  1. JAVA程序猿怎么才干高速查找到学习资料?

    JAVA程序猿怎么才干高速查找到学习资料? JAVA学习资料在互联网上较为零散,并且大多是英文的.以下介绍3种方式,让程序猿能够高速地找到自己想要的资料. 一.导航站点: 有非常多类似hao123的站 ...

  2. 回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议

    引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...

  3. zx一篇让Java程序猿随时可以翻看的Oracle总结

    一篇让Java程序猿随时可以翻看的Oracle总结 前言:Oracle学习也有十几天了,但是呢,接下来还要学习许多其他的东西,并不能提步不前,所以在此总结了以下Oracle中常用的命令和语句,没有语法 ...

  4. 给Java程序猿们推荐一些值得一看的好书

    学习的最好途径就是看书 "学习的最好途径就是看书",这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 1.能出版出来的书一定是经过反复的思考.雕琢和审核的 ...

  5. [转] java书籍(给Java程序猿们推荐一些值得一看的好书 + 7本免费的Java电子书和教程 )

    7本免费的Java电子书和教程 1. Thinking in Java (Third Edition) 本书的作者是Bruce Eckel,它一直都是Java最畅销的免费电子书.这本书可以帮助你系统的 ...

  6. Java程序猿的JavaScript学习笔记(8——jQuery选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  7. Java程序猿从笨鸟到菜鸟之(九十二)深入java虚拟机(一)——java虚拟机底层结构具体解释

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 在曾经的博客里面,我们介绍了在java领域中大部分的知识点,从最基础的java最基本的语法 ...

  8. Java程序猿学习当中各个阶段的建议

    回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议   引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的 ...

  9. Java程序猿JavaScript学习笔记(4——关闭/getter/setter)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

随机推荐

  1. 分布式配置 Spark 2.0版本 2.1版本 1.6版本

    apache的各个软件各个版本下载:  http://archive.apache.org/dist/ 1.下载spark. sudo tar -zxf ~/下载/spark-2.0.2-bin-wi ...

  2. AtCoder Grand Contest 026 (AGC026) E - Synchronized Subsequence 贪心 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/AGC026E.html 题目传送门 - AGC026E 题意 给定一个长度为 $2n$ 的字符串,包含 $n$ ...

  3. mysql配置utf8_mb4

    http://blog.csdn.net/u013145194/article/details/51527389 注:以上是转载,但我实际使用的时候,修改配置文件重启数据库,然后修改表的类型即可 20 ...

  4. nginx安装,运行(ubuntu)

    文本只涉及单节点nginx 安装gcc g++依赖库 apt-get install build-essential apt-get install libtool 安装pcre依赖库 apt-get ...

  5. Floyd算法-傻子也能看懂的弗洛伊德算法(转)

                暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程.          ...

  6. jsp的c标签使用

    http://blog.csdn.net/chabale/article/details/9406437

  7. Scala-Unit4-Scala数组/集合

    一.Scala数组 1.数组的定义: 方法一:val arr = new Array[String](3) String代表数据的元素类型.3表示数组的长度 方法二:val arr = Array[I ...

  8. Ajax技术使用(一)

    Ajax技术使用 目录 AJAX介绍 XMLHttpRequest 请求和响应 onreadystatechange 事件 AJAX介绍 什么是 AJAX AJAX = 异步 JavaScript 和 ...

  9. 从零搭建 ES 搜索服务(二)基础搜索

    一.前言 上篇介绍了 ES 的基本概念及环境搭建,本篇将结合实际需求介绍整个实现过程及核心代码. 二.安装 ES ik 分析器插件 2.1 ik 分析器简介 GitHub 地址:https://git ...

  10. shell crlf to lf

    UNIX/Linux Commands You can use the following tools: dos2unix (also known as fromdos) – converts tex ...