Khởi động lại vùng chứa trong nhóm


112

Tôi có một pod test-1495806908-xn5jnvới 2 hộp đựng. Tôi muốn khởi động lại một trong số chúng được gọi làcontainer-test . Có thể khởi động lại một vùng chứa trong một nhóm không và làm thế nào? Nếu không, làm cách nào để khởi động lại nhóm?

Nhóm được tạo bằng cách sử dụng deployment.yamlvới:

kubectl create -f deployment.yaml

Câu trả lời:


144

Có thể khởi động lại một vùng chứa duy nhất không

Không thông qua kubectl, mặc dù tùy thuộc vào thiết lập cụm của bạn, bạn có thể "gian lận" và docker kill the-sha-goes-here, điều này sẽ khiến kubelet khởi động lại vùng chứa "không thành công" (tất nhiên, giả sử chính sách khởi động lại cho Pod cho biết đó là những gì nó nên làm)

làm cách nào để khởi động lại nhóm

Điều đó phụ thuộc vào cách tạo Pod, nhưng dựa trên tên Pod mà bạn đã cung cấp, nó có vẻ nằm dưới sự giám sát của ReplicaSet, vì vậy bạn có thể chỉ kubectl delete pod test-1495806908-xn5jnvà kubernetes sẽ tạo một Pod mới ở vị trí của nó (Pod mới sẽ có tên khác, vì vậy không mong đợi kubectl get podstrở lại test-1495806908-xn5jnbao giờ nữa)


7
Chính sách khởi động lại mặc định là luôn luôn khởi động lại
Hem

Nếu tôi có thể làm điều này docker kill the-sha-goes-here:, thì tại sao không làm docker container restart the-sha-goes-herethay thế? tại sao dựa vào kubeletđể khởi động lại nó? Dù sao, vấn đề thực sự là tôi chạy dockerlệnh ở đâu, thậm chí có thể là nó để giết vùng chứa. Bật could-shell, dockerkhông hiển thị các vùng chứa từ các cụm k8s!
Nawaz

52

Có những trường hợp bạn muốn khởi động lại một vùng chứa cụ thể thay vì xóa nhóm và để Kubernetes tạo lại nó.

Làm kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5việc cho tôi.

(Tôi đã thay đổi lệnh từ rebootthành /sbin/killall5dựa trên các đề xuất bên dưới.)


28
Không phải mọi container đều có reboot; /sbin/killall5Thay vào đó, tôi đã gặp nhiều may mắn hơn khi thực hiện ; sẽ giết tất cả các quy trình và vùng chứa sẽ thoát.
Ingo Karkat

1
Và không phải mỗi container có dùng root;)
JuliSmz

4
-1, bởi vì ... Bạn đang sử dụng tác dụng phụ của 'khởi động lại' giết chết tất cả các quy trình và Kubernetes khôi phục nó. Nó đưa ra rất nhiều giả định: chạy dưới quyền root, tính sẵn có của tệp nhị phân trong vùng chứa, khởi động lạiPolicy đã được kích hoạt, v.v. Ngoài ra, điều này làm lộn xộn các bản ghi về lỗi của quá trình, điều này không lý tưởng.
gertvdijk

1
Vì vậy, có vẻ như alpine không có killall, nhưng / sbin / reboot hoạt động rất tốt. kubectl exec POD_NAME -c CONTAINER_NAME /sbin/rebootlàm việc như một sự quyến rũ
Atifm

38

Cả nhóm và vùng chứa đều là tạm thời, hãy thử sử dụng lệnh sau để dừng vùng chứa cụ thể và cụm k8s sẽ khởi động lại vùng chứa mới.

kubectl exec -it [POD_NAME] -c [CONTAINER_NAME] -- /bin/sh -c "kill 1"

Điều này sẽ gửi một SIGTERMtín hiệu đến quy trình 1, là quy trình chính đang chạy trong vùng chứa. Tất cả các quy trình khác sẽ là con của quy trình 1 và sẽ bị chấm dứt sau khi quy trình 1 thoát. Xem trang kill để biết các tín hiệu khác mà bạn có thể gửi.


3
Tôi đã thử các câu trả lời khác và câu trả lời này là câu trả lời duy nhất phù hợp với tôi, đối với tôi dường như đó là câu trả lời chung nhất.
Batato

làm cách nào để lấy tên vùng chứa đang chạy bên trong một nhóm ??
AATHITH RAJENDRAN

Hộp chứa Alpine của tôi đã rơi vào trạng thái không khỏe mạnh khi tôi thử điều này. kubectl get po hiển thị Lỗi trong cột trạng thái cho nhóm ..
Atifm Ngày

17

Toàn bộ lý do để có kubernetes là vì nó quản lý các vùng chứa cho bạn, do đó bạn không cần phải quan tâm nhiều đến kiểu sống của các vùng chứa trong nhóm.

Vì bạn có một deploymentthiết lập sử dụng replica set. Bạn có thể xóa nhóm bằng cách sử dụng kubectl delete pod test-1495806908-xn5jnvà kubernetes sẽ quản lý việc tạo nhóm mới với 2 vùng chứa mà không có bất kỳ thời gian chết nào. Việc cố gắng khởi động lại thủ công các vùng chứa đơn trong nhóm sẽ phủ nhận toàn bộ lợi ích của kubernetes.


2
Tôi có kinh nghiệm thời gian chết như quá trình pod chấm dứt của tôi trở nên 0/1
Dean Christian Armada

6
Bạn cần phải cẩn thận ghi rõ "không có bất kỳ thời gian chết nào". Nó phụ thuộc vào cấu hình chính xác của bạn. Cộng với thời gian chết không có thách thức của riêng nó.
Nicolas

Khi tôi xóa một nhóm trong triển khai của mình chỉ với 1 bản sao, tôi luôn gặp phải thời gian chết.
Nyein Chan Wynn

7

Tất cả các câu trả lời ở trên đã đề cập đến việc xóa nhóm ... nhưng nếu bạn có nhiều nhóm của cùng một dịch vụ thì sẽ thật tẻ nhạt khi xóa từng nhóm trong số chúng ...

Do đó, tôi đề xuất giải pháp sau, khởi động lại :

  • 1) Đặt tỷ lệ thành 0:

     kubectl scale deployment <<name>> --replicas=0 -n service 
    

    Lệnh trên sẽ kết thúc tất cả các nhóm của bạn bằng tên <<name>>

  • 2) Để bắt đầu lại nhóm, hãy đặt các bản sao thành nhiều hơn 0

    kubectl scale deployment <<name>> --replicas=2 -n service
    

    Lệnh trên sẽ bắt đầu lại nhóm của bạn với 2 bản sao.


5
Câu hỏi đặt ra về cách khởi động lại một vùng chứa trong một nhóm.
Chris Beach

Ngoài ra, giảm tỷ lệ xuống 0 nhóm sẽ không hoạt động đối với các ứng dụng có sẵn nhiều. Sử dụng kubectl patch deployment <deployment name> -p "{\"spec\": {\"template\": {\"metadata\": { \"labels\": { \"redeploy\": \"$(date +%s)\"}}}}}"thay thế. Điều này sẽ cập nhật việc triển khai và do đó bắt đầu tạo lại tất cả các nhóm do nó quản lý theo chiến lược cập nhật luân phiên.
Kostrahb

3

Chúng tôi sử dụng một dòng lệnh khá thuận tiện để buộc triển khai lại các hình ảnh mới trên pod tích hợp.
Chúng tôi nhận thấy rằng các thùng chứa trên núi cao của chúng tôi đều chạy lệnh "duy trì" của chúng trên PID 5. Do đó, việc gửi SIGTERMtín hiệu sẽ đưa thùng chứa xuống. imagePullPolicyđược đặt để Alwayscó kubelet kéo lại hình ảnh mới nhất khi nó đưa vùng chứa trở lại.

kubectl exec -i [pod name] -c [container-name] -- kill -15 5

1
-15 và 5 đại diện cho cái gì?
John Balvin Arias

2
@JohnBalvinArias nó nằm gọn trong mô tả ở trên, nhưng khi kill -15 5bạn đang chạy lệnh kill để gửi tín hiệu "-15" tới quy trình với PID 5. Đây là cách bạn thông báo cho một quy trình mà bạn muốn nó kết thúc (SIGTERM ) và dành thời gian để dọn dẹp mọi tài nguyên đã mở (tệp tạm thời, giao dịch rollback db, đóng kết nối, bất kỳ thứ gì). Ngược lại với -9 (SIGKILL), sẽ giết tiến trình ngay lập tức, không cho phép nó dọn dẹp bất kỳ tài nguyên nào đã mở.
Conrad.Dean

2

Giết quá trình được chỉ định trong Dockerfile's CMD/ ENTRYPOINTworks for me. (Vùng chứa tự động khởi động lại)

Không cho phép khởi động lại trong vùng chứa của tôi, vì vậy tôi phải sử dụng giải pháp thay thế này.


2

Đã xảy ra sự cố trong corednsnhóm, tôi đã xóa nhóm đó bằng

kubectl delete pod -n=kube-system coredns-fb8b8dccf-8ggcf

Nhóm của nó sẽ tự động khởi động lại.


2
kubectl exec -it POD_NAME -c CONTAINER_NAME bash - then kill 1

Giả sử vùng chứa được chạy dưới dạng root, điều này không được khuyến khích.

Trong trường hợp của tôi khi tôi thay đổi cấu hình ứng dụng, tôi phải khởi động lại vùng chứa được sử dụng trong một mẫu sidecar, tôi sẽ loại bỏ PID cho ứng dụng khởi động mùa xuân do người dùng docker sở hữu.


1
Nếu bạn viết kubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ..., nó sẽ giúp mọi người sao chép / dán dễ dàng hơn nhiều.
William Pursell
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.