Apakah ini permintaan bantuan? (Jika ya, Anda harus menggunakan panduan pemecahan masalah dan saluran dukungan komunitas kami, lihat http://kubernetes.io/docs/troubleshooting/.): Tidak
Kata kunci apa yang Anda cari di edisi Kubernetes sebelum mengajukan yang ini? (Jika Anda menemukan duplikat, Anda harus membalas di sana.): command not found configmap kubernetes
Apakah ini LAPORAN BUG atau PERMINTAAN FITUR? (pilih salah satu): BUG
Versi Kubernetes (gunakan kubectl version
):
Versi Klien: v1.6.1 GitCommit:"b0b7a323cc5a4a2019b2e9520c21c7830b7f708e"
Versi Server: v1.6.0 GitCommit:"fff5156092b56e6bd60fff75aad4dc9de6b6ef37
Lingkungan :
uname -a
): host adalah Linux dev1 4.4.0-72-generic #93-Ubuntu SMP Jum 31 Mar 14:07:41 UTC 2017 x86_64 x86_64 x86_64 GNU/LinuxApa yang terjadi :
Ketika saya mencoba membuat penerapan dengan file configmap yang dipasang ke direktori yang sama dengan titik masuk, wadah gagal memulai dengan kesalahan berikut
"Respons kesalahan dari daemon: Perintah penampung '/app/app.sh' tidak ditemukan atau tidak ada."
Spesifikasi pod menyertakan configmap yang dipasang ke direktori yang sama dengan titik masuk
Tampaknya skrip titik masuk hilang setelah memasang volume untuk peta konfigurasi di direktori yang sama
Jika saya memasang file configmap ke dalam sub direktori, semuanya berfungsi seperti yang diharapkan
Apa yang Anda harapkan terjadi :
Saya berharap file peta konfigurasi dibuat di direktori tanpa memengaruhi konten direktori yang ada yang dalam hal ini berisi skrip titik masuk
Cara memperbanyaknya (seminimal dan setepat mungkin):
File Docker - perhatikan titik masuknya
FROM busybox:latest
RUN mkdir /app
COPY app.sh /app
ENTRYPOINT ["/app/app.sh"]
Skrip titik masuk - loop tak terbatas
#!/bin/sh
seq=1
while [[ true ]]; do
echo "${seq} $(date) working"
sleep .5s
let seq=$((seq + 1))
done
k8s configmap dan file penyebaran
apiVersion: v1
kind: ConfigMap
metadata:
labels:
product: k8s-demo
name: demo
data:
settings.json: |
{
"store": {
"type": "InMemory",
}
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
labels:
product: k8s-demo
name: demo
spec:
replicas: 1
template:
metadata:
labels:
app: demo
product: k8s-demo
spec:
containers:
- name: demo
image: pmcgrath/shellloop:1
imagePullPolicy: Always
volumeMounts:
- name: demo-config
mountPath: /app
volumes:
- name: demo-config
configMap:
name: demo
items:
- key: settings.json
path: settings.json
Ketika saya menjalankan kubectl apply -d k8s.yaml dan melihat pod saya dapat melihat kesalahan berikut
kesalahan rpc: kode = 2 desc = gagal memulai wadah "f9e0112c80ebba568d4b508f99ffb053bf1ae5a4f095ce7f45bff5f38900b617": Tanggapan kesalahan dari daemon: Perintah wadah '/app/app.sh' tidak ditemukan atau tidak ada.
Hal lain yang perlu kita ketahui :
Jika saya mengubah mountPath untuk volume ke direktori lain, itu berfungsi seperti yang diharapkan
Saya menguji ini secara langsung dengan buruh pelabuhan di Host saya (17.03.0-ce) dan itu berfungsi seperti yang diharapkan
touch settings.json
docker container run -ti -v $(pwd)/settings.json:/app/settings.json pmcgrath/shellloop:1
@pmcgrath
Checkout di sini .
sepertinya saya mengerti masalah Anda. Saya memiliki pertanyaan yang sama sebelumnya, tetapi sebenarnya ada jawaban dalam situasi Anda.
Untuk mempersingkat kasus Anda, Anda memiliki configmap( settings.json: blahblah
), dan ingin memasang ke folder /app
. Kemudian di bawah ini adalah apa yang perlu Anda ketahui:
mountPath
, jadi dalam kasus Anda, folder /app
hanya akan berisi settings.json
.mountPath: /app/settings.json
, hanya dengan cara itu, konten asli di folder /app
tidak akan terpengaruh.Ini adalah sesuatu yang pada akhirnya akan Anda dapatkan:
containers:
- volumeMounts:
- name: demo-config
mountPath: /app/settings.json
subPath: settings.json
volumes:
- name: demo-config
configMap:
name: demo
@zhouhaibing089
Terima kasih atas jawabannya, bekerja berdasarkan saran Anda, saya menghargai penjelasannya
Saya senang untuk menutup masalah ini
Menepuk
Untuk referensi, penyebutan asli dari solusi ini tampaknya ada di sini: https://github.com/kubernetes/kubernetes/issues/23748#issuecomment -230390309
Sepertinya dokumentasi untuk ini hilang, yang membuat kasus ini cukup membingungkan/menyesatkan, dan dokumen proyeksi tampaknya membuatnya lebih menyesatkan juga - tidak yakin apakah itu hilang karena pembaruan otomatis tampaknya tidak berfungsi sesuai masalah itu
Persyaratan untuk nama file yang akan ditentukan baik di bawah mountPath
dan subPath
adalah berlawanan dengan intuisi.
Solusi yang disediakan oleh @zhouhaibing089 berfungsi tetapi konten file yang di-mount di subPath
tidak diperbarui jika kita mengeditnya dalam file ConfigMap.
IMO, ini tidak _benar-benar_ terpecahkan. Seharusnya ada opsi untuk menambahkan setiap kunci daripada menimpa.
Sesuatu seperti:
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-conf
data:
example1.conf: |
server {
server_name example1.com;
# config here...
}
example2.conf: |
server {
server_name example2.com;
# config here...
}
Yang seperti itu...
- name: nginx-conf
mountPath: /etc/nginx/conf.d
append: true
... menyimpan default.conf
ada dan artefak lain dari gambar Docker, tetapi menambah dengan example*.conf
Mengulangi info yang sama di subPath hanya _icky_.
+1 pada opsi append: true
@leebenson .
Menurut jawaban @leebenson : adakah yang bisa menjelaskan dari mana datangnya opsi append: true
??
itu tidak berhasil untuk saya, saya mendapat:
error: error validating "hdfs/21-namenode-statefulset.yaml": error validating data: ValidationError(StatefulSet.spec.template.spec.containers[1].volumeMounts[1]): unknown field "append" in io.k8s.api.core.v1.VolumeMount; if you choose to ignore these errors, turn validation off with --validate=false
Juga, itu tidak ada di api docs untuk volume mount :
https://k8smeetup.github.io/docs/api-reference/v1.9/#volumemount -v1-core
Menurut jawaban @leebenson : adakah yang bisa menjelaskan dari mana datangnya opsi
append: true
??itu tidak berhasil untuk saya, saya mendapat:
error: error validating "hdfs/21-namenode-statefulset.yaml": error validating data: ValidationError(StatefulSet.spec.template.spec.containers[1].volumeMounts[1]): unknown field "append" in io.k8s.api.core.v1.VolumeMount; if you choose to ignore these errors, turn validation off with --validate=false
Juga, itu tidak ada di api docs untuk volume mount :
https://k8smeetup.github.io/docs/api-reference/v1.9/#volumemount -v1-core
itu tidak ada, itu saran. yang baik untuk kasus penggunaan.
Saya mencoba menggunakan metode ini, tetapi saya mendapatkan kesalahan sistem file Read-only, ketika saya menerapkan statefulset. Adakah yang tahu cara memperbaikinya?
(Saya menimpa file yang ada, yang berisi pengaturan untuk elasticsearch, pesan kesalahan aktual --> /usr/share/elasticsearch/bin/run.sh: line 28: ./config/elasticsearch.yml: Read-only file system
)
Komentar yang paling membantu
@pmcgrath
Checkout di sini .
sepertinya saya mengerti masalah Anda. Saya memiliki pertanyaan yang sama sebelumnya, tetapi sebenarnya ada jawaban dalam situasi Anda.
Untuk mempersingkat kasus Anda, Anda memiliki configmap(
settings.json: blahblah
), dan ingin memasang ke folder/app
. Kemudian di bawah ini adalah apa yang perlu Anda ketahui:mountPath
, jadi dalam kasus Anda, folder/app
hanya akan berisisettings.json
.mountPath: /app/settings.json
, hanya dengan cara itu, konten asli di folder/app
tidak akan terpengaruh.Ini adalah sesuatu yang pada akhirnya akan Anda dapatkan: