Khởi động lại nhóm khi cập nhật cấu hình trong Kubernetes?


119

Làm cách nào để tôi tự động khởi động lại các nhóm và nhóm Kubernetes liên quan đến việc triển khai khi cấu hình của chúng được thay đổi / cập nhật?


Tôi biết đã có cuộc nói chuyện về khả năng tự động khởi động lại các nhóm khi bản đồ cấu hình thay đổi nhưng theo hiểu biết của tôi thì điều này chưa có trong Kubernetes 1.2.

Vì vậy, những gì (tôi nghĩ) tôi muốn làm là "khởi động lại" tài nguyên triển khai được liên kết với các nhóm tiêu thụ bản đồ cấu hình. Có thể không, và nếu vậy, làm thế nào để buộc khởi động lại một triển khai trong Kubernetes mà không thay đổi bất cứ điều gì trong mẫu thực tế? Đây có phải là cách tốt nhất để làm điều đó hay có một lựa chọn tốt hơn?


$ kubectl set env deployment my deployment --env="LAST_RESTART=$(date)" --namespace ...làm công việc cho tôi
maciek

Câu trả lời:


59

Báo hiệu một bản cập nhật pod trên cấu hình bản đồ là một tính năng trong công việc ( https://github.com/kubernetes/kubernetes/issues/22368 ).

Bạn luôn có thể viết pid1 tùy chỉnh để thông báo confimap đã thay đổi và khởi động lại ứng dụng của bạn.

Bạn cũng có thể ví dụ: gắn bản đồ cấu hình tương tự vào 2 vùng chứa, hiển thị kiểm tra sức khỏe http trong vùng chứa thứ hai không thành công nếu hàm băm của nội dung bản đồ cấu hình thay đổi và chuyển sang dạng thăm dò độ nhạy của thùng chứa thứ nhất (vì các thùng chứa trong một pod chia sẻ cùng một không gian tên mạng). Các kubelet sẽ khởi động lại container đầu tiên của bạn cho bạn khi đầu dò thất bại.

Tất nhiên, nếu bạn không quan tâm đến việc các nút được bật, bạn chỉ cần xóa chúng và bộ điều khiển sao chép sẽ "khởi động lại" chúng cho bạn.


Với "xóa nhóm", ý bạn là: Thu thập tất cả tên nhóm, xóa tên, đợi cho đến khi thay thế, xóa cái thứ hai, đợi cho đến khi thay thế, v.v ... Đúng không?
Torsten Bronger

6
sử dụng một triển khai tôi sẽ thu nhỏ nó xuống và sau đó lên. Bạn vẫn sẽ có một lượng nhỏ thời gian xuống mặc dù. Bạn có thể làm điều đó trong một dòng để giảm bớt điều đó ... kubectl scale deployment/update-demo --replicas=0; kubectl scale deployment/update-demo --replicas=4;
Nick H

Nếu bạn không muốn tìm tất cả các nhóm và không quan tâm đến thời gian chết - chỉ cần xóa RC và sau đó tạo lại RC.
vẽ

1
Điều này có nghĩa là âm lượng được gắn vào được cập nhật và bạn chỉ cần đọc lại tệp trên nhóm mà không cần khởi động lại toàn bộ nhóm?
Matt Williamson

@NickH Nhanh chóng và bẩn thỉu, may mắn là thời gian chết là chấp nhận được trong trường hợp của tôi và điều này đã làm việc rất tốt, cảm ơn!
ChocolateAndCheese

128

Giải pháp tốt nhất hiện tại cho vấn đề này (được tham khảo sâu trong https://github.com/kubernetes/kubernetes/issues/22368 được liên kết trong câu trả lời của anh chị em) là sử dụng Triển khai và coi Cấu hình của bạn là bất biến.

Khi bạn muốn thay đổi cấu hình của mình, hãy tạo một Bản đồ cấu hình mới với những thay đổi bạn muốn thực hiện và hướng triển khai của bạn vào Cấu hình bản đồ mới. Nếu cấu hình mới bị hỏng, Triển khai sẽ từ chối thu nhỏ bản sao hoạt động của bạn. Nếu cấu hình mới hoạt động, thì Bản sao cũ của bạn sẽ được thu nhỏ thành 0 bản sao và bị xóa, và các nhóm mới sẽ được bắt đầu với cấu hình mới.

Không hoàn toàn nhanh như chỉ chỉnh sửa ConfigMap tại chỗ, nhưng an toàn hơn nhiều.


2
Đây là cách tiếp cận mà chúng tôi đã thực hiện
Johan

4
Đáng nói là công cụ thử nghiệm mới kustomizehỗ trợ tự động tạo hàm băm cấu hình xác định, nghĩa là bạn không cần phải tự tạo một cấu hình mới: github.com/kubernetes-sigs/kustomize/blob/
xứng

Đây là những gì Spinnaker làm đằng sau hậu trường, vì vậy nếu bạn sử dụng nó, bạn sẽ không phải lo lắng về điều này.
Gus

31

https://github.com/kubernetes/mus/blob/master/docs/charts_tips_and_tricks.md#user-content-automatically-roll-deployments-when-configmaps-or-secrets-change

Thông thường các lần cấu hình hoặc bí mật được chèn dưới dạng tệp cấu hình trong các thùng chứa. Tùy thuộc vào ứng dụng, có thể cần phải khởi động lại những lần tiếp theo helm upgrade, nhưng nếu bản thân thông số triển khai không thay đổi, ứng dụng sẽ tiếp tục chạy với cấu hình cũ dẫn đến việc triển khai không nhất quán.

Các sha256sumchức năng có thể được sử dụng cùng với các includechức năng để đảm bảo triển khai phần mẫu được cập nhật nếu một thay đổi spec:

kind: Deployment
spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }}
[...]

Trong trường hợp của tôi, vì một số lý do, $.Template.BasePathđã không hoạt động nhưng $.Chart.Namekhông:

spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: admin-app
      annotations:
        checksum/config: {{ include (print $.Chart.Name "/templates/" $.Chart.Name "-configmap.yaml") . | sha256sum }}

8
Không áp dụng cho việc sử dụng Kubernetes chung, chỉ áp dụng cho Helm
Emii Khaos

2
Câu trả lời rất hữu ích nhưng có lẽ không liên quan đến câu hỏi này
Anand Singh Kunwar

helm3 đã được phát hành gần đây. Do đó, liên kết đã lỗi thời. Nó chỉ vào masterchi nhánh. URL sau sẽ dẫn đến (hiện tại) helm2 tài liệu mới nhất : github.com/mus/mus/blob/release-2.16/docs/ Kẻ
Marcel Hoyer

Dung dịch mát. Tôi đã đổi thành sha1sum, vì trong trường hợp của tôi, sha256sum có 65 ký tự dẫn đến Deployment.apps "xxx" is invalid: metadata.labels: Invalid value: "xxx": must be no more than 63 characters. Thay thế sẽ là | trunc 63, nhưng sha1sum nên "độc đáo hơn".
iptizer

30

Điều tốt nhất cách tôi đã tìm thấy để làm điều đó là chạy reloader

Nó cho phép bạn xác định cấu hình hoặc bí mật để xem, khi chúng được cập nhật, một bản cập nhật triển khai của bạn được thực hiện. Đây là một ví dụ:

Bạn có một triển khai foovà một Sơ đồ cấu hình được gọi foo-configmap. Bạn muốn cuộn các nhóm triển khai mỗi khi thay đổi cấu hình. Bạn cần chạy Trình tải lại với:

kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml

Sau đó chỉ định chú thích này trong triển khai của bạn:

kind: Deployment
metadata:
  annotations:
    configmap.reloader.stakater.com/reload: "foo-configmap"
  name: foo
...

Trình tải lại tương thích với kubernetes> = 1.9
jacktrade

10

Bạn có thể cập nhật nhãn siêu dữ liệu không liên quan đến việc triển khai của bạn. nó sẽ kích hoạt một bản cập nhật

ví dụ:

metadata:
  labels:
    configmap-version: 1

Tôi đang tìm tài liệu về siêu dữ liệu: nhãn: configmap-version: 1
c4f4t0r

7
thay đổi nhãn siêu dữ liệu không kích hoạt khởi động lại các nhóm
dan carter

Câu trả lời này có upwote nên tôi cần hỏi. Nếu chúng tôi cập nhật siêu dữ liệu, cụm Kubernetes có kích hoạt cập nhật không? @ Maoz-Xa-đốc
Titus

Tôi tin rằng nó hoạt động miễn là nhãn siêu dữ liệu nằm dướitemplate.spec
Saikiran Yerram

1

Có vấn đề này khi Triển khai nằm trong biểu đồ con và các giá trị kiểm soát nó nằm trong tệp giá trị của biểu đồ mẹ. Đây là những gì chúng tôi sử dụng để kích hoạt khởi động lại:

spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ tpl (toYaml .Values) . | sha256sum }}

Rõ ràng điều này sẽ kích hoạt khởi động lại trên bất kỳ thay đổi giá trị nhưng nó hoạt động cho tình huống của chúng tôi. Những gì ban đầu trong biểu đồ con sẽ chỉ hoạt động nếu config.yaml trong biểu đồ con tự thay đổi:

    checksum/config: {{ include (print $.Template.BasePath "/config.yaml") . | sha256sum }}

0

Tôi thực hiện giải pháp lượng tử và nó hoạt động hoàn hảo. Nhưng điều tôi không hiểu là pod thực sự không khởi động lại ... Vỏ vẫn như cũ nhưng thay đổi là có!

Ví dụ: Pod đang chạy từ 50 phút và tôi thay đổi một cái gì đó và thay đổi là trực tuyến Tôi có thể thấy nó trên trình duyệt của mình và pod vẫn đang chạy + 50 phút !! Tôi đang sử dụng Helm3 ... Bạn có biết điều gì có thể thực hiện được mà không cần khởi động lại cập nhật configmap không?


1
Đồng ý! Tôi tìm thấy nó ... Bởi vì chúng tôi đã gắn cấu hình của chúng tôi dưới dạng một ổ đĩa và được cập nhật động ... Đó là lý do tại sao khi tôi thực hiện công cụ "'checksum' 'này thì pod của tôi không khởi động lại nhưng những thay đổi ở đó! giải pháp tốt :)
Ibrahim Yesilay

-1

Một cách khác là dán nó vào phần lệnh của Triển khai:

...
command: [ "echo", "
  option = value\n
  other_option = value\n
" ]
...

Ngoài ra, để làm cho nó giống Cấu hình hơn, hãy sử dụng một Triển khai bổ sung sẽ chỉ lưu trữ cấu hình đó trong commandphần và thực hiện kubectl createtrên đó trong khi thêm một 'phiên bản' duy nhất vào tên của nó (như tính toán hàm băm của nội dung) và sửa đổi tất cả triển khai sử dụng cấu hình đó:

...
command: [ "/usr/sbin/kubectl-apply-config.sh", "
  option = value\n
  other_option = value\n
" ]
...

Có lẽ tôi sẽ đăng kubectl-apply-config.shnếu nó kết thúc làm việc.

(đừng làm vậy; nó trông rất tệ)

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.