Java程序員如何快速理解Kubernetes


我們希望微服務是可復制的,可替換的工作節點,這樣可以輕松進行升級或降級,同時無需任何停機時間,并花費最少代價的管理。我們可以說我們希望他們成為我們的小黃人(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)

@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以端口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
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386984.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386984.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386984.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NLP基礎 : HMM 隱馬爾可夫模型

Hidden Markov Model, HMM 隱馬爾可夫模型&#xff0c;是一種描述隱性變量(狀態)和顯性變量(觀測狀態)之間關系的模型。該模型遵循兩個假設&#xff0c;隱性狀態i只取決于前一個隱性狀態i-1&#xff0c;而與其他先前的隱形狀態無關。觀測狀態也只取決于當前的隱形狀態。因此我們…

關于秒殺系統優化方向

今天聽了一節咕泡學院的公開課&#xff0c;有收獲。 秒殺系統的特點&#xff1a; 1.限時&#xff1b;2.限量供應&#xff1b;3.并發量大&#xff1b;如何優化&#xff1a; 1.客戶端數據緩存。 2.CDN加速。 3.nginx動靜分離&#xff0c;靜態資源緩存&#xff0c;負載均衡。 4.se…

Mysql插入很慢,找到了稍微快點的方法

MYSQL批量插入數據庫實現語句性能分析 假定我們的表結構如下 代碼如下 CREATE TABLE example ( example_id INT NOT NULL, name VARCHAR( 50 ) NOT NULL, value VARCHAR( 50 ) NOT NULL, other_value VARCHAR( 50 ) NOT NULL ) 通常情況下單條插入的sql語句我們會這么寫&…

Linux - 時間相關命令 - ntpdate, date, hwclock

1. 概述 最近也不知道寫啥了, 把之前的老文檔整理一下, 湊個數什么的配置時間這種工作, 偶爾還是要用一下主要描述 3 個命令的簡單適用 ntpdatehwlock2. ntpdate 1. 概述 用于同步時鐘的命令2. 機制 通常是有一個服務器對外提供時間客戶端可以與時間服務器同步ntp 是他們之間交…

RUNOOB python練習題1

用來練手的python 練習題&#xff0c;原鏈接 : python練習實例1 題干 : 有四個數字&#xff1a;1、2、3、4&#xff0c;能組成多少個互不相同且無重復數字的三位數&#xff1f;各是多少&#xff1f; import numpy as np cen np.array([1,2,3,4]) tens np.array([1,2,3,4])…

mysql explain用法和結果的含義

explain顯示了mysql如何使用索引來處理select語句以及連接表。可以幫助選擇更好的索引和寫出更優化的查詢語句。 使用方法&#xff0c;在select語句前加上explain就可以了&#xff1a; 如&#xff1a; explain select surname,first_name form a,b where a.idb.id EXPLAIN列…

日志模塊logging用法

一、常用日志記錄場景及最佳解決方案&#xff1a; 日志記錄方式 最佳記錄日志方案 普通情況下&#xff0c;在控制臺顯示輸出 print() 報告正常程序操作過程中發生的事件 logging.info()(或者更詳細的logging.debug()) 發出有關特定事件的警告 warnings.warn()或者loggin…

MySQL 億級數據需求的優化思路(一),交易流水記錄的查詢

對MySQL的性能和億級數據的處理方法思考&#xff0c;以及分庫分表到底該如何做&#xff0c;在什么場景比較合適&#xff1f; 比如銀行交易流水記錄的查詢 限鹽少許&#xff0c;上實際實驗過程&#xff0c;以下是在實驗的過程中做一些操作&#xff0c;以及踩過的一些坑&#…

RUNOOB python練習題2

用來練手的python 練習題&#xff0c;原鏈接 : python練習實例2 題干 : 企業發放的獎金根據利潤提成。利潤(I)低于或等于10萬元時&#xff0c;獎金可提10%&#xff1b;利潤高于10萬元&#xff0c;低于20萬元時&#xff0c;低于10萬元的部分按10%提成&#xff0c;高于10萬元的…

dubbo負載均衡策略和集群容錯策略

dubbo負載均衡策略 random loadbalance 默認情況下&#xff0c;dubbo是random load balance隨機調用實現負載均衡&#xff0c;可以對provider不同實例設置不同的權重&#xff0c;會按照權重來負載均衡&#xff0c;權重越大分配流量越高&#xff0c;一般就用這個默認的就可以了。…

MySQL 億級數據需求的優化思路(二),100億數據,1萬字段屬性的秒級檢索

最近在研究億級數據的時候&#xff0c;無意中看到了一個關于寫58同城的文章 https://blog.csdn.net/admin1973/article/details/55251499?fromtimeline 其實上面講的versionext的方式以及壓縮json的思路&#xff0c;對于我來講都可以看得懂&#xff0c;想得通&#xff0c;其…

RUNOOB python練習題3

用來練手的python 練習題&#xff0c;原鏈接 : python練習實例3 拿到題目就寫了如下代碼&#xff0c;思路是因為使用**0.5進行開平方操作時&#xff0c;python會將數據類型自動轉換為float單精度浮點型。這里利用提取其整數部分&#xff0c;來判斷這個數是否是完全平方數。 z…

使用git將項目上傳到github(最簡單方法)

使用git將項目上傳到github&#xff08;最簡單方法&#xff09; 首先你需要一個github賬號&#xff0c;所有還沒有的話先去注冊吧&#xff01; https://github.com/ 我們使用git需要先安裝git工具&#xff0c;這里給出下載地址&#xff0c;下載后一路直接安裝即可&#xff1…

數據庫 概念詳解

數據庫 概念詳解 一、MySQL MySQL 事務 MySQL 鎖 MySQL 二、Redis 三、MongoDB 四、Memcached 轉載于:https://www.cnblogs.com/guozepingboke/p/10743648.html

RUNOOB python練習題4

用來練手的python習題其四&#xff0c; 原題鏈接: python練習實例4 題干: 輸入某年某月某日&#xff0c;判斷這一天是這一年的第幾天&#xff1f; 這個題目比較簡單&#xff0c;只需要注意閏年和非閏年的區別就可以了。我這里使用numpy矩陣存儲每個月的天數&#xff0c;之后用…

GitHub入門:如何上傳與下載工程?

由于經常要在家寫代碼&#xff0c;所以需要有個能夠方便訪問代碼管理工具。最近嘗試了一下GitHub。經過了一翻糾結之后&#xff0c;基本上掌握了他的使用方式。 要使用GitHub需要首先在其網站上進行注冊。其官方網站是https://github.com/。注冊的流程在這里就不多少了&#x…

如何解決PIP命令不可用

今天想用PIP裝一個python包&#xff0c;發現PIP報錯&#xff0c;不是內部或外部命令。。。 遇事百度&#xff0c;有兩種說法&#xff0c;一&#xff0c;沒安裝包&#xff0c;不管那么多命令執行了再說 在命令行輸入&#xff1a;python -m ensurepip 將pip.exe文件下載下來 再pi…

RUNOOB python練習題5

用來練手的python 練習題其五&#xff0c;原鏈接 : python練習實例5 題干 : 輸入三個整數x,y,z&#xff0c;請把這三個數由小到大輸出。 又是非常簡單的排序算法&#xff0c;只要使用numpy矩陣的排序方法或者使用python list的排序算法就可以輕松解決。 源代碼如下 : import …

初步使用github,并上傳下載文件

使用GitHub需要先注冊GitHub的賬號,登陸進去 然后開始創建項目 start a project 創建完成,開始生成公私鑰,可以不必每次都要輸密碼 ssh-keygen -t rsa -C "mghxy123163.com" //填寫email地址&#xff0c;然后一直“回車”ok 然后把公鑰導入GitHub中的key里面去,也…

NOIP2000提高組復賽C 單詞接龍

題目鏈接&#xff1a;https://ac.nowcoder.com/acm/contest/248/C 題目大意&#xff1a; 略 分析&#xff1a; 注意點&#xff1a;1.前綴和后綴的公共部分應該選最短的。2.如果兩個字符串前綴和后綴的公共部分恰好是其中一個字符串&#xff0c;那么這兩個字符串不能合并。 代碼…