KubernetesはPodPresetを用いてPodsに情報を注入する
12195 ワード
文書ディレクトリ1、PodPreset紹介 2、環境、ソフトウェア準備 3、K 8 s PodPreset構成を有効にする 4、PodPreset注入情報例 4.1、マッチング指定Podロード構成 4.2、あるNamespaceの下のすべてのPodロード構成に一致する 1、PodPreset紹介
PodPresetは、secrets、volume mounts、environment variablesなど、Podの作成時に他の実行時に必要な情報を注入するK 8 s APIリソースであり、ラベルセレクタを使用してPodを指定してPodPresetプリセット情報を適用することができます.PodPresetを使用する利点は、いくつかの一般的なPodプリセット情報をテンプレートとして構成できることです.これにより、各Podにすべての情報を明示的に提供する必要がなく、Pod初期化構成を簡素化し、構成を統一する効果もあります.
2、環境、ソフトウェアの準備
今回のプレゼンテーション環境では、本機のMAC OSで操作しています.以下はインストールされたソフトウェアとバージョンです. Docker: 18.06.3-ce Oracle VirtualBox: 6.0.8 r130520 (Qt5.6.3) Linux: 7.6.1810 Minikube: v0.30.0 Kubernetes: 1.12.1
注意:ここでKubernetesクラスタ構築はMinikubeを使用して完了します.Minikubeが起動したシングルノードk 8 s Nodeの例は、ネイティブのVM仮想マシンで実行する必要があるので、VMを事前にインストールする必要があります.ここでOracle VirtualBoxを選択します.k 8 sは下部にDockerコンテナを使用するため、本機はDocker環境を設置する必要がある.ここではDocker、VirtualBox、Minikube、Kubectlの設置過程を無視し、PodPresetの構成と使用に重点を置いて説明する.
3、K 8 s PodPreset構成を有効にする
K 8 sはデフォルトでPodPresetサポートをオンにしない.APIタイプは
PodPresetを有効にすると、K 8 s ApiServerで
以上のコマンドが複雑すぎる場合は、Yaml方式の構成を変更することもできます.MinikubeはStatic Pod方式でKubeletで各コンポーネントサービスを起動するので、対応するコンポーネントのYamlを変更してPodPresetをアクティブにすることができ、
切り取り修正後の
コンポーネントの再起動が完了したら、PodPresetがサポートされているかどうかを再度確認できます.
4.PodPreset注入情報例
ここでは、PodPresetを使用してPodに情報を注入する方法を示します.ここでは、指定したPodロード構成と、NamespaceのすべてのPodロード構成を一致させる2つの例を示します.
4.1、指定Podロード構成に一致する
上記の
次のような重要な情報が表示されます. PodPresetリソースApiVersionは ここで を含む.は、 に注入する.は、 に注入する.
このPodPresetリソースを作成してください.
次に、Pod Yamlリソースファイルを作成します.
注意:ここでは
作成に成功し、容器内に入ってPodPreset情報が正しく注入されているかどうかを確認しましょう.
検証に問題はありません.PodPreset情報はPodに注入されましたが、私たちのPod yamlファイルは非常に簡潔で、ある構成の変更を回避しました.すべての関連するPodはYaml構成を更新する必要があります.便利ではありませんか.PodPresetの実装方法をより深く理解し、PodのYamlファイルを取得してみましょう.
k 8 s admission controllerを通過した後のYamlファイルは、テンプレートのInclude機能と同様に、PodPresetとPodリソースMergeを統合すると同時に、
4.2、NamespaceのすべてのPodロード構成に一致する
1つ以上の指定されたPod注入情報を一致させるには、NamespaceのすべてのPod注入情報についてどのように構成すればいいですか?方法は、
説明:ここでは
次に、複数のPodをそれぞれ作成して、そのPodPreset情報を注入する.
以上のPodリソースを作成し、情報の注入に成功したかどうかを個別に確認します.
このNamespaceの下の2つのPodが構成情報を注入することに成功し、タイムゾーンも変更されたことがわかりますが、便利ではないでしょうか.しかし、Namespaceの次のPodを指定してPodPresetを使用しない場合は、どのように構成すればいいのでしょうか.結局、一部のパーソナライズされたPodは汎用構成を使用しません.
Podリソースを作成し、コンテナに情報が注入されているかどうかを確認します.
無視PodPreset注入annotationsが追加された後、情報は注入されず、時間はデフォルトの
PodPresetは、上記の2つの使い方に加えて、同じPodにマルチPodPresetを適用したり、複数のリソースタイプ(ReplicaSetなど)をサポートしたり、ConfigMapから値を取ることをサポートしたりします.また、PodPresetがPod構成と競合している場合、例えばPod Yamlコンテナマウント構成とPodPresetコンテナマウント構成が同じパスである場合、エラーメッセージが競合します.
最後に注意すべきことは、現在PodPresetのプリセット機能は進化中ですが、関連する管理作業を大幅に簡素化し、これらの共通構成を開発者から分離し、システム管理構成にすることができます. PodPresetはNamespaceレベルのオブジェクトで、同じネーミングスペースの下のコンテナでのみ機能します. は現在
参考資料 PodPreset Doc Enable PodPreset
PodPresetは、secrets、volume mounts、environment variablesなど、Podの作成時に他の実行時に必要な情報を注入するK 8 s APIリソースであり、ラベルセレクタを使用してPodを指定してPodPresetプリセット情報を適用することができます.PodPresetを使用する利点は、いくつかの一般的なPodプリセット情報をテンプレートとして構成できることです.これにより、各Podにすべての情報を明示的に提供する必要がなく、Pod初期化構成を簡素化し、構成を統一する効果もあります.
2、環境、ソフトウェアの準備
今回のプレゼンテーション環境では、本機のMAC OSで操作しています.以下はインストールされたソフトウェアとバージョンです.
注意:ここでKubernetesクラスタ構築はMinikubeを使用して完了します.Minikubeが起動したシングルノードk 8 s Nodeの例は、ネイティブのVM仮想マシンで実行する必要があるので、VMを事前にインストールする必要があります.ここでOracle VirtualBoxを選択します.k 8 sは下部にDockerコンテナを使用するため、本機はDocker環境を設置する必要がある.ここではDocker、VirtualBox、Minikube、Kubectlの設置過程を無視し、PodPresetの構成と使用に重点を置いて説明する.
3、K 8 s PodPreset構成を有効にする
K 8 sはデフォルトでPodPresetサポートをオンにしない.APIタイプは
settings.k8s.io/v1alpha1
である.クラスタがPodPresetサポートをオンにしているかどうかを確認しない場合は、kubectl api-versions
コマンドでタイプが存在するかどうかを確認するか、またはkubectl get podpreset
コマンドで表示し、オンにしていない場合はerror: the server doesn't have a resource type "podpreset"
エラーを提示する.PodPresetを有効にすると、K 8 s ApiServerで
--runtime-config=settings.k8s.io/v1alpha1=true
の構成を追加できます.Minikube方式でクラスタを起動し、起動時に次のコマンドを追加できます.minikube start --extra-config=apiserver.runtime-config=settings.k8s.io/v1alpha1=true --extra-config=apiserver.enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota,PodPreset`
以上のコマンドが複雑すぎる場合は、Yaml方式の構成を変更することもできます.MinikubeはStatic Pod方式でKubeletで各コンポーネントサービスを起動するので、対応するコンポーネントのYamlを変更してPodPresetをアクティブにすることができ、
/etc/kubernetes/manifests/kube-apiserver.yaml
ファイルを変更することで以下の構成を追加し、変更が完了するとKubeletはkube-apiserver各コンポーネントを自動的に再起動します.$ vim /etc/kubernetes/manifests/kube-apiserver.yaml
- --runtime-config=settings.k8s.io/v1alpha1=true #
- --enable-admission-plugins=NamespaceLifecycle...,PodPreset # ,PodPreset
切り取り修正後の
kube-apiserver.yaml
ファイルは以下の通りです.spec:
containers:
- command:
- kube-apiserver
- --authorization-mode=Node,RBAC
- --enable-admission-plugins=Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota,PodPreset
- --runtime-config=settings.k8s.io/v1alpha1=true
- --advertise-address=172.30.12.98
- --allow-privileged=true
- --client-ca-file=/var/lib/minikube/certs/ca.crt
- --enable-bootstrap-token-auth=true
コンポーネントの再起動が完了したら、PodPresetがサポートされているかどうかを再度確認できます.
$ kubectl api-versions | grep settings.k8s.io
settings.k8s.io/v1alpha1
4.PodPreset注入情報例
ここでは、PodPresetを使用してPodに情報を注入する方法を示します.ここでは、指定したPodロード構成と、NamespaceのすべてのPodロード構成を一致させる2つの例を示します.
4.1、指定Podロード構成に一致する
上記の
Pod, PodPreset
について説明したが、ここでは、指定したPodロード構成と一致する方法を説明する.まず、PodPreset Yamlリソースファイルを新規作成します.$ vim podpreset-busybox-hwy.yaml
apiVersion: settings.k8s.io/v1alpha1
kind: PodPreset
metadata:
name: busybox-hwy
namespace: wanyang3
spec:
selector:
matchLabels:
role: busybox-hwy
env:
- name: PODPRESET_MESSAGE
value: "This is podpreset message."
volumeMounts:
- mountPath: /opt/logs
name: logs-volume
volumes:
- name: logs-volume
emptyDir: {}
次のような重要な情報が表示されます.
settings.k8s.io/v1alpha1
selector. matchLabels
は、Labelsマッチングラベルを介してrole: busybox-why
を含むPod env
の環境変数PODPRESET_MESSAGE=This is podpreset message.
を、一致するPodのvolumes
ボリュームのマウントディレクトリを、一致するPodの/opt/logs
ディレクトリこのPodPresetリソースを作成してください.
$ kubectl create ns wanyang3
namespace/wanyang3 created
$ kubectl apply -f podpreset-busybox-hwy.yaml
podpreset.settings.k8s.io/busybox-hwy created
$ kubectl get podpreset -n wanyang3
NAME CREATED AT
busybox-hwy 2019-07-07T02:10:31Z
次に、Pod Yamlリソースファイルを作成します.
$ vim pod-busybox-hwy.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox-hwy
namespace: wanyang3
labels:
app: busybox-hwy
role: busybox-hwy
spec:
containers:
- name: busybox-hwy
image: busybox:latest
command: ["sleep", "60000"]
注意:ここでは
busybox
容器でテストします.ここでlabels role: busybox-hwy
は上のPodPreset selector. matchLabels
と一致しなければなりません.そうしないと、情報を注入できません.では、Podリソースを作成します.$ kubectl apply -f pod-busybox-hwy.yaml
pod/busybox-hwy created
$ kubectl get pod -n wanyang3
NAME READY STATUS RESTARTS AGE
busybox-hwy 1/1 Running 0 15s
作成に成功し、容器内に入ってPodPreset情報が正しく注入されているかどうかを確認しましょう.
$ kubectl exec -it busybox-hwy -n wanyang3 /bin/sh
/ # printenv |grep PODPRESET
PODPRESET_MESSAGE=This is podpreset message.
/ # df -h
Filesystem Size Used Available Use% Mounted on
overlay 36.0G 9.3G 26.7G 26% /
tmpfs 64.0M 0 64.0M 0% /dev
tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup
/dev/mapper/centos-root
36.0G 9.3G 26.7G 26% /opt/logs
/dev/mapper/centos-root
36.0G 9.3G 26.7G 26% /dev/termination-log
/dev/mapper/centos-root
36.0G 9.3G 26.7G 26% /etc/resolv.conf
/dev/mapper/centos-root
36.0G 9.3G 26.7G 26% /etc/hostname
/dev/mapper/centos-root
36.0G 9.3G 26.7G 26% /etc/hosts
......
検証に問題はありません.PodPreset情報はPodに注入されましたが、私たちのPod yamlファイルは非常に簡潔で、ある構成の変更を回避しました.すべての関連するPodはYaml構成を更新する必要があります.便利ではありませんか.PodPresetの実装方法をより深く理解し、PodのYamlファイルを取得してみましょう.
# kubectl get pod busybox-hwy -n wanyang3 -o yaml
apiVersion: v1
kind: Pod
metadata:
annotations:
podpreset.admission.kubernetes.io/podpreset-busybox-hwy: "24187"
creationTimestamp: 2019-07-07T02:22:27Z
labels:
app: busybox-hwy
role: busybox-hwy
name: busybox-hwy
namespace: wanyang3
resourceVersion: "24302"
selfLink: /api/v1/namespaces/wanyang3/pods/busybox-hwy
uid: 1066b217-a05e-11e9-aab0-080027a076a9
spec:
containers:
- command:
- sleep
- "60000"
env:
- name: PODPRESET_MESSAGE
value: This is podpreset message.
image: busybox:latest
imagePullPolicy: Always
name: busybox-hwy
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /opt/logs
name: logs-volume
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: default-token-nnbrm
readOnly: true
dnsPolicy: ClusterFirst
nodeName: minikube
......
k 8 s admission controllerを通過した後のYamlファイルは、テンプレートのInclude機能と同様に、PodPresetとPodリソースMergeを統合すると同時に、
podpreset.admission.kubernetes.io/podpreset-busybox-hwy: "24187"
という注釈を追加したものであり、この24187
リソース番号は、上のpodpreset-busybox-hwy
の作成が完了した後のresourceVersion: "24187"
リソースバージョン番号である.4.2、NamespaceのすべてのPodロード構成に一致する
1つ以上の指定されたPod注入情報を一致させるには、NamespaceのすべてのPod注入情報についてどのように構成すればいいですか?方法は、
selector.matchLabels
を構成するときにすべてをマッチングすればよい.$ vim podpreset-ns-test.yaml
apiVersion: settings.k8s.io/v1alpha1
kind: PodPreset
metadata:
name: podpreset-ns-test
namespace: podpreset-test
spec:
selector:
matchLabels: # ,
env:
- name: DB_PORT
value: "6379"
- name: TZ
value: Asia/Shanghai
説明:ここでは
matchLabels:
が空に設定されており、Namespacesの下にあるすべてのPodに一致し、podpreset-test
とDB_PORT= 6379
の2つの共通環境変数構成が注入されていることを示しています.注意:ここでのTZ=Asia/Shanghai
環境変数構成は、Podが属するタイムゾーンを変更するために使用できます.前にCentosコンテナの内部時間方式を変更しました.Docker/K 8 sを参照して、コンテナ内のタイムゾーンの不一致を解決する方法の文章を参照してください.ここでは、新しい簡便な方法でタイムゾーンを構成することができます.これにより、名前空間のすべてのPodがタイムゾーンを統一的に変更できます(Centosのデフォルト時間はTZ=Asia/Shanghai
です).次に、このPodPresetリソースを作成します.$ kubectl create ns podpreset-test
namespace/podpreset-test created
$ kubectl apply -f podpreset-ns-test.yaml
podpreset.settings.k8s.io/podpreset-ns-test created
$ kubectl get podpreset -n podpreset-test
NAME CREATED AT
podpreset-ns-test 2019-07-07T03:52:42Z
次に、複数のPodをそれぞれ作成して、そのPodPreset情報を注入する.
$ vim pod-nginx-test-1.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-test-1
namespace: podpreset-test
labels:
app: nginx-test-1
spec:
containers:
- name: nginx-test-1
image: nginx:latest
$ vim pod-nginx-test-2.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-test-2
namespace: podpreset-test
labels:
app: nginx-test-2
spec:
containers:
- name: nginx-test-2
image: nginx:latest
以上のPodリソースを作成し、情報の注入に成功したかどうかを個別に確認します.
$ kubectl apply -f pod-nginx-test-1.yaml
pod/nginx-test-1 created
$ kubectl apply -f pod-nginx-test-2.yaml
pod/nginx-test-2 created
$ kubectl get pod -n podpreset-test
NAME READY STATUS RESTARTS AGE
nginx-test-1 1/1 Running 0 26s
nginx-test-2 1/1 Running 0 20s
#
$ kubectl exec -it nginx-test-1 -n podpreset-test /bin/sh
# printenv
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=nginx-test-1
DB_PORT=6379
HOME=/root
PKG_RELEASE=1~stretch
TERM=xterm
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
NGINX_VERSION=1.17.1
......
PWD=/
TZ=Asia/Shanghai
# date
Sun Jul 7 12:16:53 CST 2019
$ kubectl exec -it nginx-test-2 -n podpreset-test /bin/sh
# printenv
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=nginx-test-2
DB_PORT=6379
HOME=/root
PKG_RELEASE=1~stretch
TERM=xterm
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
NGINX_VERSION=1.17.1
......
PWD=/
TZ=Asia/Shanghai
# date
Sun Jul 7 12:17:26 CST 2019
このNamespaceの下の2つのPodが構成情報を注入することに成功し、タイムゾーンも変更されたことがわかりますが、便利ではないでしょうか.しかし、Namespaceの次のPodを指定してPodPresetを使用しない場合は、どのように構成すればいいのでしょうか.結局、一部のパーソナライズされたPodは汎用構成を使用しません.
UTC
注釈を構成して、PodがPodPresetに注入されないことを示すことができ、次に説明する.$ vim pod-nginx-test-3.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-test-3
namespace: podpreset-test
annotations:
podpreset.admission.kubernetes.io/exclude: "true"
labels:
app: nginx-test-3
spec:
containers:
- name: nginx-test-3
image: nginx:latest
Podリソースを作成し、コンテナに情報が注入されているかどうかを確認します.
$ kubectl apply -f pod-nginx-test-3.yaml
$ kubectl exec -it nginx-test-3 -n podpreset-test /bin/sh
$ printenv | grep TZ
$ printenv | grep DB_PORT
$ date
Sun Jul 7 04:18:54 UTC 2019
無視PodPreset注入annotationsが追加された後、情報は注入されず、時間はデフォルトの
podpreset.admission.kubernetes.io/exclude: "true"
時間であることがわかります.PodPresetは、上記の2つの使い方に加えて、同じPodにマルチPodPresetを適用したり、複数のリソースタイプ(ReplicaSetなど)をサポートしたり、ConfigMapから値を取ることをサポートしたりします.また、PodPresetがPod構成と競合している場合、例えばPod Yamlコンテナマウント構成とPodPresetコンテナマウント構成が同じパスである場合、エラーメッセージが競合します.
最後に注意すべきことは、
UTC
バージョンで、まだ成熟していません.例えば、作成したPodPresetに対して非常に少量の修正を実行した場合、applyまたはreplaceを再試行すると、サービス側は更新されません(親測に問題があり、再構築を削除するしかありません)、自分で試してみることができます.参考資料