アプリのデータベース構成を含むkubernetesConfigMapを使用していますが、データベースパスワードを持つシークレットがあります。 ConfigMapでこのシークレットを使用する必要があるため、ConfigMapに環境変数を追加し、シークレットからポッドデプロイメントの値を指定しようとすると、ConfigMapの値が取得したため、パスワードを使用してmysqlに接続できません。変数の正確な文字列。
apiVersion: v1
kind: ConfigMap
metadata:
name: config
data:
APP_CONFIG: |
port: 8080
databases:
default:
connector: mysql
Host: "mysql"
port: "3306"
user: "root"
password: "$DB_PASSWORD"
およびdeployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: app
labels:
app: backend
spec:
replicas: 1
template:
metadata:
labels:
app: backend
spec:
containers:
- name: app
image: simple-app-image
ports:
- name: "8080"
containerPort: 8080
env:
- name: APP_CONFIG
valueFrom:
configMapKeyRef:
name: config
key: APP_CONFIG
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: "mysql-secret"
key: "mysql-root-password"
注:シークレットが存在し、「mysql-root-password」値を取得してデータベースへのログインに使用できます
Kubernetesはその代わりを行うことはできません。コンテナのエントリポイントで、Shellを使用して置き換える必要があります。
これは実際の例です。デフォルトのエントリポイントを変更して、その置換で新しい変数を作成します。このコマンドの後に、目的のエントリポイントを追加する必要があります。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: app
labels:
app: backend
spec:
replicas: 1
template:
metadata:
labels:
app: backend
spec:
containers:
- name: app
image: simple-app-image
command:
- /bin/bash
- -c
args:
- "NEW_APP_CONFIG=$(echo $APP_CONFIG | envsubst) && echo $NEW_APP_CONFIG && <INSERT IMAGE ENTRYPOINT HERE>"
ports:
- name: "app"
containerPort: 8080
env:
- name: APP_CONFIG
valueFrom:
configMapKeyRef:
name: config
key: APP_CONFIG
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: "mysql-secret"
key: "mysql-root-password"
configMap
全体をsecret
に変換し、データベースのパスワードをそこに直接デプロイします。次に、シークレットをファイルとしてボリュームにマウントし、コンテナー内の通常の構成ファイルのように使用できます。