https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/82892167 javascript
咱們可以說咱們但願他們成爲咱們的小黃人(minions)。css
本文咱們將經過一個簡單的樣例來了解Kubernetes可以經過建立和編排一羣「小黃人"來爲咱們作些什麼。您可以與本文一塊兒編碼或今後處[1]克隆項目。html
先決條件java
咱們但願軍團中有不一樣類型的工做角色,以便可以瞭解Kubernetes可以爲咱們作些什麼。所以,咱們的目標是讓每個微服務都響應一個簡單的http請求,其響應例如如下:
使用ASCII字來表示minion的類型。node
構建Java Minion服務nginx
@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類型?爲此可以使用一個技巧。git
建立一個可以採用咱們選擇的不論什麼minion類型的應用程序。要作到這一點。需要它包括一個ASCII藝術字庫。github
所以。咱們建立了一個名爲MinionsLibrary的類。使用@Component註解。在內部咱們建立了一個地圖,咱們使用此博客[2]中的一些minions初始化:
spring
@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設置環境變量)來運行此操做。sql
它還將幫助咱們稍後在響應中顯示咱們的應用程序版本號,因此現在的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服務將本身主動將請求路由到當中一個或還有一個。
服務將使用與服務匹配的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 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