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

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

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

推薦する

クリスマス: SiteGround - 70% オフ / 無制限ホスティング

SiteGround は、クリスマス前に 70% オフのクリスマス プロモーションを開始しました。現...

ウェブサイトがブロックされた後、ウェブマスターはウェブサイトを復元するためにどのような問題を分析する必要がありますか?

ウェブサイトが K 状態になるのはよくある問題です。ウェブサイトの最適化に取り組み始めてから、自分の...

1API-.clubドメインを1ドルで登録

世界的に有名なドメイン名登録業者 1API は、.club ドメイン名のプロモーションを実施していま...

Google SEO: 2013 年版ウェブサイトに関するよくある質問 (PR、外部リンク、ペナルティ関連、301)

2週間前、私たちはWeiboでオンラインQ&Aイベントを開催し、ウェブマスターからのSEOと...

初心者が語るウェブサイトのキーワードランキングが不安定になる7つの理由

企業のウェブサイトを作る場合でも、個人のブログを作る場合でも、私たちは自分のウェブサイトをより多くの...

CNCF 2020 クラウド ネイティブ アプリケーション調査レポート: コンテナの採用率は 2016 年以降 300% 増加

現在、CNCF コミュニティは発展を続けており、ユーザーによるオープンソース テクノロジの応用がます...

クラウドネイティブアプリケーションをマスターするには、これらの10のポイントをマスターしてください

[[436589]]簡単に言えば、クラウド ネイティブとは、クラウドで生まれ、クラウドで実行されるす...

DDoS 状況レポート: DDoS 攻撃は二極化している

最近、国内のネットワーク セキュリティ企業 NSFOCUS が 2015 年上半期の DDoS 脅威...

百度の検索コレクションの悪用と百度の手動介入現象

百度の手動介入問題に関しては、誰もが知っていますが、百度の関係者はそのような仕組みがあるかどうかにつ...

米国のフラッシュセールサイトFabが1億5000万ドルの資金を調達、テンセントも投資に参加

新浪科技報、北京時間6月19日正午のニュースによると、米国のフラッシュセールサイトFabは火曜日、シ...

「スパイダーウェブ」内部リンクを構築する必要がある理由の分析

最近、フォーラムでは、特にアップデートがプッシュされるときにフォーラム署名は無価値であるとよく言われ...

企業がウェブサイトを構築するためにどのような準備が必要ですか?

オンラインプロモーションの発展に伴い、ウェブサイトの重要性に注目する企業がますます増えています。イン...

「疫病との戦い」から都市統治の近代化まで、デジタルイノベーションが成都ハイテク区をよりスマートにする

中国政府による感染予防・抑制の常態化への対応として、先ほど終了した2回の会議では、感染予防・抑制に関...

業界のウェブサイトを構築するのは簡単ですが、維持するのは困難です。

この記事は、私が1年間業界ウェブサイトを運営してきた経験についてのみ書いています。私は失敗者なので、...