書籍出典:Cloudman「1日5分で遊ぶKubernetes」
学習中に先生の授業内容やテストノートを整理してみんなで共有してください。違反しているものは削除されます。よろしくお願いします。
概要投稿を添付してください: Play Kubernetes in 5 minutes in a day | Summary_COCOgsta's Blog-CSDN Blog
Deployment によってデプロイされたレプリカ ポッドは各ノードに分散され、各ノードで複数のレプリカが実行される場合があります。DaemonSet の違いは、各ノードが最大 1 つのコピーしか実行できないことです。
DaemonSet の一般的なアプリケーション シナリオは次のとおりです。
(1) クラスターの各ノードで glusterd や ceph などのストレージ デーモンを実行します。
(2) 各ノードで、flunentd や logstash などのログ収集デーモンを実行します。
(3) Prometheus Node Exporter やcollectd などの監視デーモンを各ノードで実行します。
実際、Kubernetes 自体は DaemonSet を使用してシステム コンポーネントを実行します。図に示すように、次のコマンドを実行します。
kubectl get daemonset --namespace=kube-system
図に示すように、DaemonSet kube-flannel-ds と kube-proxy は、各ノードで flannel コンポーネントと kube-proxy コンポーネントを実行する役割を果たします。
flannel と kube-proxy はシステム コンポーネントであるため、コマンド ラインで --namespace=kube-system を通じて名前空間 kube-system を指定する必要があります。指定しない場合、デフォルトの名前空間のリソースのみが返されます。
5.2.1 kube-flannel-ds
以下では、kube-flannel-ds を分析して DaemonSet を学習します。
以前にフランネル ネットワークがどのように展開されたかを覚えていますか? 以下のコマンドを実行しました(海外サイトのファイルはダウンロードできないため、実際にはこの方法ではデプロイされません)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
注: 構成ファイルの完全な内容はさらに複雑なので、DaemonSet をよりよく学ぶために、最も重要な内容のみがここに保持されています。
① DaemonSet 設定ファイルの構文と構造は、種類が DaemonSet に設定されることを除いて、Deployment の構文と構造とほぼ同じです。
② hostName は、Pod が Node ネットワークを直接使用することを指定します。これは、docker run - -network=host と同等です。フランネルがクラスターへのネットワーク接続を提供する必要があることを考慮すると、この要件は合理的です。
③containers は、flannel サービスを実行する 2 つのコンテナを定義します。
別の DaemonSet kube-proxy を分析してみましょう。
5.2.2 プロキシになる
kube-proxy の YAML ファイルを取得できないため、次のコマンドを実行して構成を表示することしかできません。
kubectl edit daemonset kube-proxy --namespace=kube-system
結果を図に示します。
また、理解を容易にするために、ここには最も重要な情報のみが記載されています。
① kind: DaemonSet は、これが DaemonSet タイプのリソースであることを指定します。
②コンテナはkube-proxyのコンテナを定義します。
③ status は現在の DaemonSet の実行時のステータスで、この部分は kubectl edit に固有のものです。実際、Kubernetes クラスター内で現在実行中の各リソースは、kubectl edit (kubectl editdeployment nginx-deployment など) を通じてその構成と実行ステータスを表示できます。
5.2.3 独自の DaemonSet の実行
このセクションでは、Prometheus Node Exporter を例として取り上げ、ユーザーが独自の DaemonSet を実行する方法を示します。
Prometheus は一般的なシステム監視ソリューションであり、Node Exporter は Prometheus のエージェントであり、監視対象の各ノード上でデーモンの形式で実行されます。
Node Exporter コンテナを Docker で直接実行する場合、コマンドは次のとおりです。
docker run -d \
-v "/proc:/host/proc" \
-v "/sys:/host/sys" \
-v "/:/rootfs" \
--net=host \
prom/node-exporter \
--path.procfs /host/proc \
--path.sysfs /host/sys \
--collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
以下に示すように、DaemonSet の YAML 設定ファイル node_exporter.yml に変換します。
[root@k8s-master ~]# cat node_exporter.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter-daemonset
spec:
selector:
matchLabels:
app: prometheus
template:
metadata:
labels:
app: prometheus
spec:
hostNetwork: true
containers:
- name: node-exporter
image: prom/node-exporter
imagePullPolicy: IfNotPresent
command:
- /bin/node_exporter
- --path.procfs
- /host/proc
- --path.sysfs
- /host/sys
- --collector.filesystem.ignored-mount-points
- ^/(sys|proc|dev|host|etc)($|/)
volumeMounts:
- name: proc
mountPath: /host/proc
- name: sys
mountPath: /host/sys
- name: root
mountPath: /rootfs
volumes:
- name: proc
hostPath:
path: /proc
- name: sys
hostPath:
path: /sys
- name: root
hostPath:
path: /
[root@k8s-master ~]#
① ホストのネットワークを直接使用します。
②コンテナ起動コマンドを設定します。
③ ホストパス /proc、/sys、/ をボリューム経由でコンテナにマッピングします。ボリュームについては後で詳しく説明します。
図に示すように、kubectl apply -f node_exporter.yml を実行します。
DaemonSet ノード-エクスポーター-デーモンセットは正常にデプロイされ、ノード エクスポーター ポッドがそれぞれ k8s-node1 と k8s-node2 で実行されています。