Cách tốt nhất để chia sẻ / gắn kết một tệp vào một nhóm là gì?


102

Tôi đã xem xét sử dụng bí mật để gắn kết một tệp duy nhất nhưng có vẻ như bạn chỉ có thể gắn kết thư mục sẽ ghi đè tất cả nội dung khác. Làm cách nào để chia sẻ một tệp cấu hình duy nhất mà không cần gắn thư mục?

Câu trả lời:


154

Ví dụ: bạn có một sơ đồ cấu hình chứa 2 tệp cấu hình:

kubectl create configmap config --from-file <file1> --from-file <file2>

Bạn có thể sử dụng subPath như thế này để gắn kết một tệp vào thư mục hiện có:

---
        volumeMounts:
        - name: "config"
          mountPath: "/<existing folder>/<file1>"
          subPath: "<file1>"
        - name: "config"
          mountPath: "/<existing folder>/<file2>"
          subPath: "<file2>"
      restartPolicy: Always
      volumes:
        - name: "config"
          configMap:
            name: "config"
---

Đầy đủ ví dụ ở đây


5
nhầm lẫn tại sao điều này hiển thị ví dụ cho 2 tệp khi OP chỉ cần 1, tôi cho rằng điều này cũng áp dụng cho trường hợp của một tệp duy nhất.
Randy L

6
@ the0ther yea chỉ để làm cho nó rõ ràng như thế nào nó hoạt động với nhiều file
Tommy Nguyễn

@TommyNguyen, có cách nào không nếu tôi chỉ muốn gắn đường dẫn chính chứ không phải đường dẫn phụ như ./abc.txt trong đó abc.txt nằm bên trong vùng chứa tại thư mục chính chứ không phải thư mục phụ.
PrinceT

2
Điều gì sẽ xảy ra nếu tệp không phải là Bản đồ cấu hình hoặc không có trong Bản đồ cấu hình? Có thể gắn một tệp tùy ý từ đĩa cục bộ của bạn không?
LondonRob

3
@LondonRob trong trường hợp của bạn, bạn nên sử dụng hostPath, xem kubernetes.io/docs/concept/storage/volumes/#hostpath
Masupilami

46

Tôi sẽ bắt đầu với ví dụ làm việc này từ đây . Đảm bảo rằng bạn đang sử dụng ít nhất Kubernetes 1.3.

Đơn giản chỉ cần tạo một Bản đồ cấu hình như sau:

apiVersion: v1
kind: ConfigMap
metadata:
  name: test-pd-plus-cfgmap
data:
  file-from-cfgmap: file data

Và sau đó tạo một nhóm như thế này:

apiVersion: v1
kind: Pod
metadata:
  name: test-pd-plus-cfgmap
spec:
  containers:
  - image: ubuntu
    name: bash
    stdin: true
    stdinOnce: true
    tty: true
    volumeMounts:
    - mountPath: /mnt
      name: pd
    - mountPath: /mnt/file-from-cfgmap
      name: cfgmap
      subPath: file-from-cfgmap
  volumes:
  - name: pd
    gcePersistentDisk:
      pdName: testdisk
  - name: cfgmap
    configMap:
      name: test-pd-plus-cfgmap

1
Điều này chắc chắn sẽ ghi đè lên toàn bộ thư mục giống như OP đã đề cập.
davegallant

5
Tôi không đồng ý. Đã kiểm tra cách tiếp cận bao gồm "đường dẫn con" và chỉ các tệp được gắn kết chứ không phải toàn bộ thư mục. Đã thử nghiệm với Kubernetes 1.5.
dmorlock

@dmorlock Câu hỏi được diễn đạt một cách mơ hồ. Điều này sẽ là các quốc gia tiêu đề "share / gắn kết một tập tin vào một pod" và giống như câu hỏi yêu cầu "chia sẻ một tập tin cấu hình mà không cần lắp một thư mục"
Joel B

1
Tôi đã phải hỏi câu hỏi này ba lần vì từ "đường dẫn con" không được đề cập ở bất kỳ đâu trong tài liệu tại kubernetes.io/docs/tasks/configure-pod-container/… . Tôi đoán đó là một tài liệu PR thân thiện cần được tạo và gửi.
Todd Lyons

@JoelB, có cách nào không nếu tôi chỉ muốn gắn đường dẫn chính chứ không phải đường dẫn phụ như ./abc.txt trong đó abc.txt nằm bên trong vùng chứa tại thư mục chính chứ không phải thư mục phụ.
PrinceT

7

Hiện tại (v1.0, v1.1) không có cách nào để gắn khối lượng một tệp cấu hình duy nhất. Cấu trúc Bí mật đương nhiên có khả năng đại diện cho nhiều bí mật, có nghĩa là nó phải là một thư mục.

Khi chúng tôi nhận được các đối tượng cấu hình, các tệp đơn lẻ sẽ được hỗ trợ.

Trong thời gian ngắn, bạn có thể gắn một thư mục và liên kết biểu tượng vào nó từ hình ảnh của bạn, có thể không?


1
Điều này có còn đúng không?
neu242

7
Bạn có thể sử dụng tính năng subPath của volumeMounts để tải một tệp duy nhất ngay bây giờ
Tim Hockin

1
Điều này là có thể vào lúc này. Đánh dấu vào câu trả lời ở trên: stackoverflow.com/a/43404857/5091346
Andrii Abramov

0

Giả sử bạn muốn gắn một log4j2.xml mới vào một triển khai đang chạy để tăng cường ghi nhật ký

# Variables
k8s_namespace=xcs
deployment_name=orders-service
container_name=orders-service
container_working_dir=/opt/orders-service

# Create config map and patch deployment
kubectl -n ${k8s_namespace} create cm log4j \
 --from-file=log4j2.xml=./log4j2.xml

kubectl -n ${k8s_namespace} patch deployment ${deployment_name} \
 -p '{"spec":{"template":{"spec":{"volumes":[{"configMap":{"defaultMode": 420,"name": "log4j"},"name": "log4j"}]}}}}'

kubectl -n ${k8s_namespace} patch deployment ${deployment_name} \
 -p '{"spec":{"template":{"spec":{"containers":[{"name": "'${container_name}'","volumeMounts": [{  "mountPath": "'${container_working_dir}'/log4j2.xml","name": "log4j","subPath": "log4j2.xml"}]}]}}}}'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.