目次
序文: 構成管理の原則
多くの構成ファイルを変更する必要がある場合は、構成リソースを作成し、構成リソースを各 Pod にマウントして Pod に使用すると、構成リソースのみを変更する必要があります。
1: シークレット
1.1 シークレットの紹介
Secret は、パスワード、トークン、秘密鍵などの機密データをイメージや Pod Spec に公開することなく、これらの機密データを構成する問題を解決します。シークレットは、ボリュームまたは環境変数として使用できます。
Secret: 暗号化されたファイルを保存し、データを暗号化して Etcd に保存し、Volume をマウントすることで Pod コンテナーにアクセスできるようにします
secret には 3 つのオプション パラメータがあります。
- generic: 一般的なタイプで、通常はパスワード データを格納するために使用されます。
- tls:このタイプは、秘密鍵と証明書を格納するためにのみ使用されます。
- docker-registry: docker ウェアハウスの認証情報を保存する場合は、このタイプを使用して作成する必要があります。
秘密の種類:
- サービス アカウント:サービス アカウントによって参照されていました。サービス アカウントが作成されると、Kubernetes はデフォルトで対応するシークレットを作成します。Pod が serviceaccount を使用する場合、対応するシークレットが Pod の /run/secrets/kubernetes.io/serviceaccount ディレクトリに自動的にマウントされます。
- 不透明: base64 エンコード形式のシークレットで、パスワードや秘密鍵などの保存に使用されます。base64 --decode デコードで元のデータを取得できるため、セキュリティが弱い。
- kubernetes.io/dockerconfigjson:プライベート Docker レジストリの認証情報を保存するために使用されます
Pod は、シークレットを使用する前に参照する必要があります。Pod がシークレットを使用するには、次の 3 つの方法があります。
- 1 つ以上のコンテナーにマウントされたボリューム内のファイルとして。
- コンテナーの環境変数として。
- ポッドのイメージをプルするときに kubelet によって使用されます。
アプリケーション シナリオ: 資格情報
公式ウェブサイト:
1.2 作成と使用
1.2.1 ファイル形式に基づく
1. ユーザー名とパスワードのファイルを作成する
[root@master ~]# echo -n 'admin' > username.txt ##创建username文件存放用户名admin;-n:不转行输出
[root@master ~]# echo -n '123456' > password.txt ##创建password文件存放密码123456
2. リソースを見る
[root@master ~]# kubectl create secret generic db-user-pass --from-file=username.txt --from-file=password.txt ##创以数据库形式的资源,以文件形式导入凭据存放
secret/db-user-pass created
[root@master ~]# kubectl get secret ##查看secret资源
[root@master ~]# kubectl describe secret db-user-pass
##查看资源详细信息
1.2.2 パラメータに基づいてシークレットを作成する
1. 可変パラメーターを作成し、最初に 64 ビットのエンコード方法を渡し、平文を暗号文に変換します
[root@master ~]# echo -n 'admin' | base64 ##基于用户名生成64位编码
YWRtaW4= ##生成的编码
[root@master ~]# echo -n '123456' | base64 ##基于密码生成64位编码
MTIzNDU2 ##生成的编码
2. yaml ファイルを作成し、暗号文を引用してシークレットを作成します
[root@master ~]# cd demo/
[root@master demo]# vim secret.yaml
apiVersion: v1
kind: Secret ##资源格式
metadata:
name: mysecret ##资源名称
type: Opaque ##opa凭证类型
data:
username: YWRtaW4= ##复制生成的用户名编码
password: MTIzNDU2 ##复制生成的密码编码
3.秘密のリソースを作成し、情報を表示する
[root@master demo]# kubectl create -f secret.yaml ##创建了配置资源
secret/mysecret created
[root@master demo]# kubectl get secret
1.2.3 秘密資源の利用方法
1. シークレットの変数を使用して Pod にインポートする
例: key:username を SECRET_USERNAME に、
key:password を SECRET_PASSWORD に、上のシークレット リソースのユーザー名とパスワードを再割り当てします。
[root@master demo]# vim secret-var.yaml
apiVersion: v1
kind: Pod ##类型为pod
metadata:
name: mypod
spec:
containers:
- name: nginx ##名字为nginx
image: nginx ##镜像为nginx
env: ##环境代理
- name: SECRET_USERNAME ##username赋值给SECRET_USERNAME
valueFrom: ##值来自于谁
secretKeyRef:
name: mysecret ##值来自于mysecret资源
key: username ##资源的值:username
- name: SECRET_PASSWORD ##password 赋值给SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
[root@master demo]# kubectl apply -f secret-var.yaml ##创建资源
pod/mypod created
[root@master demo]# kubectl get pods ##查看pod资源
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 29s
[root@master demo]# kubectl exec -it mypod bash ##进入资源
root@mypod:/# echo $SECRET_USERNAME ##输出username变量
admin
root@mypod:/# echo $SECRET_PASSWORD ##输出PASSWORD变量
123456
ポッドに入り、 環境変数SECRET_PASSWORD の値を パスワードとして表示します
2. Pod の特定のディレクトリにボリュームとしてマウントします。
[root@master demo]# vim secret-vol.yaml ##编写secret-vol文件
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
volumeMounts: ##容器卷挂载
- name: foo ##指明挂载卷的名称
mountPath: "/etc/foo" ##挂载的路径在容器中的/etc/foo
readOnly: true ##设置权限为只读模式
volumes: ##被挂载的外部资源
- name: foo ##创建挂载卷名称
secret:
secretName: mysecret ## secret资源
[root@master demo]# kubectl delete -f secret-var.yaml ##删除之前的secret资源
pod "mypod" deleted
[root@master demo]# kubectl create -f secret-vol.yaml ##创建资源
pod/mypod created
[root@master demo]# kubectl get pods ##查看资源
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 50s ##创建成功
[root@master ~]# kubectl exec -it mypod bash ##进入mypod资源
root@mypod:/# ls /etc/foo
password username ##挂载成功
root@mypod:/# cat /etc/foo/password
123456 ##看到password对应的值
root@mypod:/etc/foo# cat username
admin ##看到username对应的值
2: 構成マップ
2.1 configmap の紹介
Configmap is a resource object in k8s, which is used to save non-confidential configuration . データは、 キーと値のキーと値のペアの形式
、またはファイルの形式で保存できます。
機能:
サービスを展開するとき、各サービスには独自の構成ファイルがあります. 複数のサービスが 1 つのサーバーに展開されている場合: nginx、Tomcat、Apache など、これらの構成はすべてこのノードに存在します. サーバーが要件を満たすことができない場合オンライン同時実行性が高い場合は、サーバーを拡張する必要があります. 拡張後も、サーバーは複数のサービスを展開する必要があります: nginx, tomcat, and apache. これらのサービスの構成は、新しく追加されたサーバーで管理する必要があります.サービスの1つに問題があり、構成ファイルを変更する必要があり、各物理ノードの構成を変更する必要があります.この方法では、大規模なオンライン構成変更の要件を満たすことはできません. そのため、k8s は Configmap リソース オブジェクトを導入します。これをボリュームとして使用し、ポッドにマウントして、統合された構成管理を実現できます。ConfigMap の主な機能は、イメージの移植性と再利用性を実現するために、構成ファイルからイメージを切り離すことです。
特徴:
Configmap は k8s のリソースであり、構成ファイルに相当します. 1 つまたは複数の Configmap が
存在する可能性があります. Configmap はボリュームにすることができます. k8s ポッドが開始されると、コンテナ内の指定されたディレクトリにマッピングされます.ボリュームの形式;
コンテナ内のアプリケーションは元の方法に従います コンテナの特定のディレクトリにある構成ファイルを読み取ります;
コンテナの観点からは、構成ファイルはコンテナ内の特定のディレクトリにパッケージ化されているようなものです.プロセス全体がアプリケーションに侵入することはありません。
アプリケーション シナリオ: アプリケーション構成
ConfigMap の使用に関する制限:
- Pod が起動する前に ConfigMap を作成する必要があります。
- また、ConfigMap と Pod が同じ名前空間にある場合にのみ、Pod から参照できます。
- Pod が ConfigMap にバインドされたディレクトリをマウントすると、ディレクトリの下のディレクトリは Pod にマウントされず、ディレクトリの下のファイルのみがマウントされます。
知識構造図:
2.2 ConfigMap の作成
2.2.1 kubectl フォームに基づく
[root@master demo]# vim redis.properties ##创建redis的配置文件中需要的参数文件
redis.host=127.0.0.1 ##主机地址
redis.port=6379 ##端口
redis.password=123456 ##密钥
[root@master demo]# kubectl create configmap redis-config --from-file=redis.properties ##创建configmap资源,名称为redis-config文件来自于redis.properties文件
configmap/redis-config created
[root@master demo]# kubectl get configmap ##查看资源
NAME DATA AGE
redis-config 1 69s
[root@master demo]# kubectl get cm ##缩写查看资源
NAME DATA AGE
redis-config 1 95s
[root@master demo]# kubectl describe cm redis-config ##查看参数信息
--from-file
:指定されたディレクトリ内のすべてのファイルは、ConfigMap でキーと値のペアを作成するために使用されます。キーの名前はファイル名で、値はファイルの内容です。
mypod リソース ビュー ファイルのインポートの作成
[root@master demo]# kubectl delete pod/mypod ##先将原先创建的mypod资源删除
pod "mypod" deleted
[root@master demo]# vim cm.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: busybox
image: busybox ##镜像为linux最小内核
command: [ "/bin/sh","-c","cat /etc/config/redis.properties" ] ##执行在pod中查看 /etc/config/redis.properties文件中的数据信息
volumeMounts:
- name: config-volume ##使用指定资源的标签
mountPath: /etc/config ##挂载点
volumes:
- name: config-volume ##指定资源标签
configMap:
name: redis-config ##指定的资源名称
restartPolicy: Never
[root@master demo]# kubectl apply -f cm.yaml ##创建资源
pod/mypod created
[root@master demo]# kubectl get pods ##查看pod资源
NAME READY STATUS RESTARTS AGE
mypod 0/1 Completed 0 25s ##执行完任务状态就为Completed
[root@master demo]# kubectl logs mypod ##查看mypod的日志信息
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
2.2.2 可変パラメータ形式に基づく
[root@master demo]# vim myconfig.yaml ##创建变量资源
apiVersion: v1
kind: ConfigMap
metadata:
name: myconfig
namespace: default
data:
special.level: info ##定义两个键值
special.type: hello
[root@master demo]# kubectl create -f myconfig.yaml ##创建资源
configmap/myconfig created
configmap リソース出力変数パラメーターを使用して mypod を作成する
[root@master demo]# vim config-var.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: busybox
image: busybox
command: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ] ##输出LEVEL和TYPE两个变量
env: ##定义环境变量
- name: LEVEL ##定义LEVEL变量
valueFrom: ##值来自于
configMapKeyRef: ##来自于configMap类型资源
name: myconfig ##创建的configMap的资源
key: special.level ##key来自于configMap中的special.level
- name: TYPE ##定义TYPE变量
valueFrom:
configMapKeyRef:
name: myconfig
key: special.type
restartPolicy: Never
[root@master demo]# kubectl delete pod mypod ##删除重复的名称的资源
pod "mypod" deleted
[root@master demo]# kubectl apply -f config-var.yaml ##创建mypod资源
pod/mypod created
[root@master demo]# kubectl logs mypod ##通过查看日志查看变量的输出
info hello
K8s 1.6 バージョン以降、新しいフィールド envFrom が導入され、ConfigMap 内のすべての key:value を環境変数として自動的に生成できるようになりました。
env と envFrom の違い:前者は変数名をカスタマイズできますが、繰り返し操作が必要で、後者は変数名をカスタマイズできませんが、非常に便利です。
configMapKeyRef と configMapRef の違い:前者はキーと configmap を指定する必要がありますが、後者は configMap のみを指定する必要があります。