Kubernetes でのコンテナ検出について理解していますか?

Kubernetes でのコンテナ検出について理解していますか?

1. 概要

コンテナ検出は、コンテナ内のアプリケーション インスタンスが適切に動作しているかどうかを検出するために使用されます。これは、ビジネスの可用性を確保するための従来のメカニズムです。検出後、インスタンスのステータスが期待どおりでない場合、Kubernetes は問題のあるインスタンスを「削除」し、ビジネス トラフィックを処理しなくなります。 Kubernetes は、コンテナ検出を実装するための 2 つのプローブを提供します。

  • 活性プローブ: 活性プローブは、アプリケーション インスタンスが現在正常に動作しているかどうかを検出するために使用されます。そうでない場合、k8sはコンテナを再起動します
  • 準備状況プローブ: 準備状況プローブは、アプリケーション インスタンスが現在リクエストを受信できるかどうかを検出するために使用されます。そうでない場合、k8sはトラフィックを転送しません

livenessProbe はコンテナを再起動するかどうかを決定し、readinessProbe はリクエストをコンテナに転送するかどうかを決定します。

上記の 2 つのプローブは現在、次の 3 つの検出方法をサポートしています。

  • コマンド実行: コンテナ内でコマンドを実行します。コマンド実行の終了コードが 0 の場合、プログラムは正常とみなされ、それ以外の場合は異常とみなされます。
 …… livenessProbe: exec: command: - cat - /tmp/healthy ……

  • TCPSocket: ユーザー コンテナのポートにアクセスしようとします。接続を確立できればプログラムは正常とみなされ、そうでない場合は異常とみなされます。
 …… livenessProbe: tcpSocket: port: 8080 ……

  • HTTPGet: コンテナ内の Web アプリケーションの URL を呼び出します。返されたステータス コードが 200 ~ 399 の場合、プログラムは正常であるとみなされます。そうでなければ異常です。
 …… livenessProbe: httpGet: path: / #URI地址port: 80 #端口号host: 127.0.0.1 #主机地址scheme: HTTP #支持的协议,http或者https ……

2. 生存探査

(1)実行モード

pod-liveness-exec.yaml を作成します。

 apiVersion: v1 kind: Pod metadata: name: pod-liveness-exec namespace: dev spec: containers: - name: nginx image: nginx ports: - name: nginx-port containerPort: 80 livenessProbe: exec: command: ["/bin/cat","/tmp/hello.txt"] # 执行一个查看文件的命令

/tmp/hello.txt ファイルが存在しないため、コンテナは繰り返し再起動されます。

 #进入yaml目录[root@k8s-master ~]# ls anaconda-ks.cfg pod-liveness-exec.yaml [root@k8s-master ~]# clear [root@k8s-master ~]# [root@k8s-master ~]# #查看当前dev命名空间下无pod [root@k8s-master ~]# kubectl get pod -n dev No resources found in dev namespace. [root@k8s-master ~]# #创建pod [root@k8s-master ~]# kubectl apply -f pod-liveness-exec.yaml pod/pod-liveness-exec created [root@k8s-master ~]# #再次查看dev命名空间已创建pod [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pod-liveness-exec 0/1 ContainerCreating 0 5s #查看pod详情[root@k8s-master ~]# kubectl describe pod pod-liveness-exec -n dev #在最下面Events中,容器创建过程报错Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 28s default-scheduler Successfully assigned dev/pod-liveness-exec to k8s-node2 Normal Pulling 27s kubelet Pulling image "nginx" Normal Pulled 11s kubelet Successfully pulled image "nginx" in 15.48165061s Normal Created 11s kubelet Created container nginx Normal Started 11s kubelet Started container nginx Warning Unhealthy 7s kubelet Liveness probe failed: /bin/cat: /tmp/hello.txt: No such file or directory #再次频繁查看dev下pod信息可以发现pod的重启次数一直在增加[root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pod-liveness-exec 1/1 Running 3 (53s ago) 2m54s [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pod-liveness-exec 1/1 Running 4 (20s ago) 3m1s

今回は、既存のファイルを表示するために yaml を変更します。

 apiVersion: v1 kind: Pod metadata: name: pod-liveness-exec namespace: dev spec: containers: - name: nginx image: nginx ports: - name: nginx-port containerPort: 80 livenessProbe: exec: command: ["/bin/cat","/usr/share/nginx/html/index.html"] # 执行一个查看文件的命令此文件为nginx欢迎页面因为我们的容器就是nginx所以这个文件肯定存在的

効果をもう一度見てみましょう:

(2)TCPソケットモード

pod-liveness-tcpsocket.yaml を作成します。

 apiVersion: v1 kind: Pod metadata: name: pod-liveness-tcpsocket namespace: dev spec: containers: - name: nginx image: nginx ports: - name: nginx-port containerPort: 80 livenessProbe: tcpSocket: port: 8080 # 尝试访问8080端口,端口不存在

コンテナ内でポート 8080 が開いていないため、接続は失敗します。

 [root@k8s-master ~]# ls anaconda-ks.cfg pod-liveness-tcpsocket.yaml [root@k8s-master ~]# #创建pod [root@k8s-master ~]# kubectl apply -f pod-liveness-tcpsocket.yaml pod/pod-liveness-tcpsocket created [root@k8s-master ~]# #获取pod [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pod-liveness-tcpsocket 1/1 Running 0 12s #查看详情可以看出最后一步连接被拒绝[root@k8s-master ~]# kubectl describe pod pod-liveness-tcpsocket -n dev Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 23s default-scheduler Successfully assigned dev/pod-liveness-tcpsocket to k8s-node2 Normal Pulling 22s kubelet Pulling image "nginx" Normal Pulled 21s kubelet Successfully pulled image "nginx" in 475.556438ms Normal Created 21s kubelet Created container nginx Normal Started 21s kubelet Started container nginx Warning Unhealthy 2s (x2 over 12s) kubelet Liveness probe failed: dial tcp 172.17.169.138:8080: connect: connection refused #频繁获取pod详情可以看出重启次数也在不断增加[root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pod-liveness-tcpsocket 1/1 Running 3 (32s ago) 2m13s [root@k8s-master ~]# [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pod-liveness-tcpsocket 1/1 Running 3 (46s ago) 2m27s [root@k8s-master ~]# [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pod-liveness-tcpsocket 1/1 Running 4 (16s ago) 2m37s

次に、tcpSocket.port を 80 に変更し、上記の手順を繰り返すと、コンテナーが正常に起動することがわかります。

(3)HTTPGetモード

pod-liveness-httpget.yaml を作成します。

 apiVersion: v1 kind: Pod metadata: name: pod-liveness-httpget namespace: dev spec: containers: - name: nginx image: nginx ports: - name: nginx-port containerPort: 80 livenessProbe: httpGet: # 其实就是访问http://127.0.0.1:80/hello scheme: HTTP #支持的协议,http或者https port: 80 #端口号path: /hello #URI地址此地址不存在

[root@k8s-master ~]# #创建pod [root@k8s-master ~]# kubectl apply -f pod-liveness-httpget.yaml pod/pod-liveness-httpget created #获取pod [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pod-liveness-httpget 0/1 ContainerCreating 0 7s [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pod-liveness-httpget 0/1 ContainerCreating 0 13s #查看pod详情发现最后HTTP执行报404 [root@k8s-master ~]# kubectl describe pod pod-liveness-httpget -n dev Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 24s default-scheduler Successfully assigned dev/pod-liveness-httpget to k8s-node2 Normal Pulling 23s kubelet Pulling image "nginx" Normal Pulled 8s kubelet Successfully pulled image "nginx" in 15.416092349s Normal Created 8s kubelet Created container nginx Normal Started 8s kubelet Started container nginx Warning Unhealthy 4s kubelet Liveness probe failed: HTTP probe failed with statuscode: 404 #频繁获取pod,发现pod重启次数不断增加[root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pod-liveness-httpget 1/1 Running 0 36s [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pod-liveness-httpget 1/1 Running 1 (3s ago) 43s [root@k8s-master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pod-liveness-httpget 1/1 Running 2 (47s ago) 117s

次に、httpGet.path を / に変更し、上記の手順を繰り返すと、コンテナーが正常に起動することがわかります。

これまでに、Liveness Probe を使用した 3 つの検出方法が実証されています。ただし、livenessProbe のサブプロパティを見ると、これら 3 つの方法に加えて、ここで説明する他の構成がいくつかあることがわかります。

 [root@k8s-master01 ~]# kubectl explain pod.spec.containers.livenessProbe FIELDS: exec <Object> tcpSocket <Object> httpGet <Object> initialDelaySeconds <integer> # 容器启动后等待多少秒执行第一次探测timeoutSeconds <integer> # 探测超时时间。默认1秒,最小1秒periodSeconds <integer> # 执行探测的频率。默认是10秒,最小1秒failureThreshold <integer> # 连续探测失败多少次才被认定为失败。默认是3。最小值是1 successThreshold <integer> # 连续探测成功多少次才被认定为成功。默认是1

<<:  クラウドへの移行は最善の選択肢ではないかもしれない

>>:  光ファイバー相互接続: クラウド コンピューティング ネットワークを改善する方法

推薦する

優れた SEO 担当者に求められるものは何でしょうか?

みなさんこんにちは。私は warsion です。SEO と SEO とオンライン マーケティング プ...

今日の話題: 道徳と法律の境界線を歩く「秘密の」匿名ソーシャルネットワーキングはどこまでできるのか?

A5ウェブマスターネットワーク(www.admin5.com)は5月15日、リリース初日に爆発的な成...

この小さなコードは、Web サイトの組み込み、表示、並べ替えに直接影響します。

今日、Jingjingは[ランディングページ時間係数]についてお話ししたいと思います。これはほんの小...

ERPが危機に瀕している理由

[[211676]] ERP の概念、事例、ソリューションが普及しているこの時代においても、ほとんど...

開発者の力を高める: グレープシティはローコードを通じて産業エコロジカルサービスシステムを構築

プログラマーに関して言えば、残業と高給は、ソフトウェア開発者に常に連想される 2 つのイメージです。...

AWS が Amazon EC2 向け Apple macOS インスタンスを開始

本日正式に開始された AWS re:Invent カンファレンスにおいて、Amazon Web Se...

中国企業はITの複雑性という課題に直面している。企業の46%が自社のIT環境が2年前よりも複雑になっていると考えている。

Citrix は本日、「中国の情報技術の複雑性の現状」と題する調査レポートの正式リリースを発表しまし...

IBM初のグローバルKVMセンター・オブ・エクセレンスが北京にオープン

2012年11月28日、IBMは北京で「IBM KVM(北京)センター・オブ・エクセレンス」の除幕式...

App Store SEO と App Store ASO の違いは何ですか?

ASO (「 App Store最適化」)は、アプリ ストアを最適化することでアプリのダウンロード数...

MarketsandMarkets: クラウド コンピューティング市場は 2026 年までに 9,473 億ドルに達する

市場調査コンサルティング会社MarketsandMarketsが最近発表したレポートによると、クラウ...

商人はそれを認めた! WeChatは「行商人」ではない。断片化されたトラフィックは、小さくて美しいものにのみ適している

【編集者注】JD.comは明日の夜、米国ナスダック証券取引所に上場する。それまでは、WeChatとの...

あなたのウェブサイトをすぐに取り入れるための10のコツ

インクルージョンは SEO の必須コンテンツの一つであり、安定した良好なインクルージョンは良いランキ...

Baidu Enterprise は誰のチーズが移動されたか知っていますか?

Baidu Knows は Baidu の最も強力な製品の一つです。Baidu Tieba と合わせ...

ウェブサイトKPIシリーズ:サイト内検索・商品検索利用率

サイト検索と製品検索は、ユーザーが Web サイト内で特定の情報を見つけるために使用する一般的なツー...