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

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

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

推薦する

360buyの内部構造シリーズの詳細な説明

数日前、著者は「ウェブサイトアーキテクチャの観点からTaoxie.comのSEOをレイアウトする方法...

昨年を総括し、今年展開する Aruba のマジック クアドラントの秘密は何でしょうか?

2022年1月12日午後、アルバは「変化を把握し、未来を予見する」をテーマに、北京で2022年新年メ...

#黒5# cloudcone: 年間 11 ドル、384M メモリ/1 コア/10g SSD/3T 帯域幅、ロサンゼルス データ センター、PayPal/Alipay 決済

Cloudcone は今年のブラックフライデーに、ロサンゼルスの Multacom データセンターに...

ドメイン名の選び方を教えてくれる11の視点

個人のブログから大規模なポータルまで、どのような種類の Web サイトであっても、ドメイン名にリンク...

trentahost-49 USD/E3-1230/32 GB RAM/500 GB HDD/10 TB フロー/IPMI/ポートランド

Trentahostは2009年に事業を開始し、ドメイン名、仮想ホスティング(配信を含む)、ゲームホ...

Google、国内検索ユーザー向けに検索のヒントを公開

Google の使用中に一時的にアクセスできなくなることがありますか?多くの人がこの問題に遭遇したこ...

パス最適化はウェブサイトのランキングを向上します

優れたウェブサイトランキングの作成に影響を与える要因は多数あり、基本的な最適化とコンテンツの最適化に...

インテリジェンスを活用して小売SaaSに足がか​​りを得ている「隠れたチャンピオン」を知る時が来た

10歩ごとに1人を殺し、1000マイル以内に痕跡を残さない。仕事が終わると彼は自分の功績と名声を隠し...

ウェブサイト構造の最適化ディレクトリ設計のアイデア

今日、ネットサーフィンをしていたとき、とても落ち込むようなウェブサイトを見つけました。そのウェブサイ...

JD.comとPinduoduoのWeChat「ストリートファイト」が激化

電子商取引企業が共同でコミュニティに進出し、生鮮食品の共同購入やライブストリーミングによって消費者が...

hostyun: Tri-Network VIP Line VPS、10Gbps 帯域幅、月額 18 元から、Ryzen9 3950X+NVMe

Hostyun には、米国ロサンゼルスの cera データセンターに接続された 3 つのネットワーク...

アプリを宣伝するために必要なことをカウントダウンしましょう!チャネルを理解し、計画を立て、つながりを持ち、競合製品を分析します...

1.競合製品の分析方法を学ぶ競合分析は、あらゆる職種において最も重要なスキルの 1 つです。競合製品...

伝伝における仮想番号の実践と応用

1. はじめに仮想番号は、インターネット技術に基づいた電話番号サービスです。電話番号をユーザーの携帯...

Xiaomiのデジタルマーケティングの秘密について簡単に解説

Xiaomi が今日のような業績を達成したのは偶然ではありません。Xiaomi は、短期間で会社をこ...