Deployment構成起動プローブjavaスクロール配置を実現
18041 ワード
生存、準備、起動プローブの構成
私达はふだんk 8 sを使う时バージョンのアップグレードの问题に直面することができて、私の个人の开発の使用する基本はjava言语で、だからきっと1つの问题のコードの起动が遅いことにも出会うことができます.
Deploymentのバージョンを更新するときにjavaの起動が遅れるとリクエストが失敗し、それを解決するためにカナリアを使用してリリースすることができます.
2つのバージョンを表すには、2つのDeploymentを使用します.2つのDeploymentには同じLabelがあります.新しいバージョンのDeploymentが完全に起動した後、削除するにはDeploymentが必要です.
しかし,この方法は操作が比較的複雑であり,k 8 sの更新規則に反している.
プローブを使用してpodがready状態であることを確認
このような状況を解決するためにDeploymentは準備検出器を提供し、容器がいつ準備され、要求流量を受け入れることができるかを知ることができ、1つのPodの中のすべての容器が準備されている場合、このPodを準備と見なすことができる.
プローブの内容についてはここではあまり説明しませんが、文末のジャンプで公式サイトに接続できるチュートリアルです.
テスト
ここで私は自分でテストする流れを示して、みんなが理解するのに便利です.
準備されたサービス: cliden-demo(20秒遅れて起動):健康なインタフェースを提供してhelloに戻ります!! 対応ingress、service、deployment Javaコード
論理はとても簡単なGET要求で、/helloはパラメータがなくて、要求した後にHelloに帰って、Spring!ログを印刷
再起動時
k 8 s関連yaml
テスト結果
サービス開始時間を増大させるために起動前に20 s待ったと再宣言
ここでreplicasを3に設定し、deploymentバージョンを更新します.
サービスが削除されていないことがわかりますが、新しいclient-demo-server-76788 f 74 c-gx 6 dfpodが現れ、Running状態にありますが、readyはありません.
ここでdeploymentスクロール更新とスケジューリングの原理は公式ドキュメントで詳しく紹介されています
新しく拡張されたpodのログを表示
サービスが起動中であり、カウントダウンが終了して起動が完了するとpodはサービスの/helloインタフェースを呼び出し、ステータスコードが200に戻ったときにサービスが正常に起動したと考えられることがわかる.
すでに老けているpodが見えてきました
の最後の部分
ここまでは基本的にプレゼンテーションが終わりました
参考記事 k 8 s公式サイト
私达はふだんk 8 sを使う时バージョンのアップグレードの问题に直面することができて、私の个人の开発の使用する基本はjava言语で、だからきっと1つの问题のコードの起动が遅いことにも出会うことができます.
Deploymentのバージョンを更新するときにjavaの起動が遅れるとリクエストが失敗し、それを解決するためにカナリアを使用してリリースすることができます.
2つのバージョンを表すには、2つのDeploymentを使用します.2つのDeploymentには同じLabelがあります.新しいバージョンのDeploymentが完全に起動した後、削除するにはDeploymentが必要です.
しかし,この方法は操作が比較的複雑であり,k 8 sの更新規則に反している.
プローブを使用してpodがready状態であることを確認
このような状況を解決するためにDeploymentは準備検出器を提供し、容器がいつ準備され、要求流量を受け入れることができるかを知ることができ、1つのPodの中のすべての容器が準備されている場合、このPodを準備と見なすことができる.
プローブの内容についてはここではあまり説明しませんが、文末のジャンプで公式サイトに接続できるチュートリアルです.
テスト
ここで私は自分でテストする流れを示して、みんなが理解するのに便利です.
準備されたサービス:
論理はとても簡単なGET要求で、/helloはパラメータがなくて、要求した後にHelloに帰って、Spring!ログを印刷
再起動時
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 20; i++) {
System.out.println(i + " seconds late run");
Thread.sleep(1000);
}
SpringApplication.run(DemoApplication.class, args);
}
public Mono<ServerResponse> hello(ServerRequest request) {
log.info("hello!!!");
return ServerResponse.ok()
.contentType(MediaType.TEXT_PLAIN)
.body(BodyInserters.fromObject("Hello, Spring!"));
}
@Bean
public RouterFunction<ServerResponse> route(GreetingHandler greetingHandler) {
return RouterFunctions.route(
RequestPredicates.GET("/hello").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
greetingHandler::hello);
}
k 8 s関連yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: client-demo-server
namespace: paas
spec:
replicas: 3
selector:
matchLabels:
run: client-demo-server
template:
metadata:
labels:
run: client-demo-server
spec:
containers:
- name: client-demo-server-containers
image: registry.cn-beijing.aliyuncs.com/spring-cloud-client-demo-image:0.0.2
# , ,
readinessProbe:
httpGet:
port: 8083
path: /hello
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 100
# pod
livenessProbe:
httpGet:
port: 8083
path: /hello
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 20
volumeMounts:
- name: host-time
mountPath: /etc/localtime
ports:
- containerPort: 8083
resources:
requests:
cpu: 1
memory: 1024Mi
limits:
cpu: 1
memory: 1024Mi
imagePullSecrets:
- name: paas
volumes:
- name: host-time
hostPath:
path: /etc/localtime
---
apiVersion: v1
kind: Service
metadata:
name: client-demo-server
namespace: paas
labels:
run: client-demo-server
spec:
type: NodePort
ports:
- port: 8083
selector:
run: client-demo-server
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: client-demo-server
namespace: paas
spec:
rules:
- host: client-demo-server.jbzm.internal.com
http:
paths:
- backend:
serviceName: client-demo-server
servicePort: 8083
テスト結果
サービス開始時間を増大させるために起動前に20 s待ったと再宣言
kubectl get pod -n paas
NAME READY STATUS RESTARTS AGE
client-demo-server-57c468986d-2r9lh 1/1 Running 0 14m
client-demo-server-57c468986d-k8xxw 1/1 Running 0 14m
client-demo-server-57c468986d-wmcxf 1/1 Running 0 14m
client-demo-server-767868f74c-gx6df 0/1 Running 0 49s
ここでreplicasを3に設定し、deploymentバージョンを更新します.
サービスが削除されていないことがわかりますが、新しいclient-demo-server-76788 f 74 c-gx 6 dfpodが現れ、Running状態にありますが、readyはありません.
ここでdeploymentスクロール更新とスケジューリングの原理は公式ドキュメントで詳しく紹介されています
新しく拡張されたpodのログを表示
kubectl logs -f --tail=100 -n paas client-demo-server-767868f74c-gx6df
0 seconds late run
1 seconds late run
2 seconds late run
3 seconds late run
4 seconds late run
5 seconds late run
6 seconds late run
7 seconds late run
サービスが起動中であり、カウントダウンが終了して起動が完了するとpodはサービスの/helloインタフェースを呼び出し、ステータスコードが200に戻ったときにサービスが正常に起動したと考えられることがわかる.
kubectl get pod -n paas
NAME READY STATUS RESTARTS AGE
client-demo-server-57c468986d-2r9lh 1/1 Running 0 15m
client-demo-server-57c468986d-k8xxw 0/1 Terminating 0 15m
client-demo-server-57c468986d-wmcxf 1/1 Running 0 15m
client-demo-server-767868f74c-gx6df 1/1 Running 0 74s
client-demo-server-767868f74c-lzwxw 0/1 ContainerCreating 0 17s
すでに老けているpodが見えてきました
の最後の部分
ここまでは基本的にプレゼンテーションが終わりました
参考記事