Làm thế nào để di cư khỏi Dockershim trong

[ad_1]

Sửa máy tính tại nhà TPHCM

Kubernetes v1.24 và sau đó phát hành không có Dockershim sau khi ngừng sử dụng vào bản phát hành v1.20 vào tháng 12 năm 2020. Dockershim không còn khả dụng dưới dạng thời gian chạy vùng chứa được tích hợp sẵn. Thay vào đó, bạn cần sử dụng thời gian chạy được hỗ trợ khác, chẳng hạn như containerd, CRI-O hoặc Docker Engine với cri-dockerd bộ chuyển đổi.

Trong bài viết này, chúng tôi sẽ hướng dẫn cách kiểm tra xem bạn có bị ảnh hưởng hay không, sau đó giải thích cách bạn có thể chuyển sang thời gian chạy khác. Bạn nên thực hiện các bước sau trước bạn nâng cấp lên Kubernetes v1.24 hoặc phiên bản mới hơn để khối lượng công việc của cụm của bạn không bị ảnh hưởng.

Dockershim là gì?

Dockershim được phát triển như một thành phần cần thiết để Kubernetes có thể hỗ trợ nhiều thời gian chạy vùng chứa hơn. Khi bắt đầu dự án, Kubernetes chỉ làm việc với Docker Engine. Hạn chế này đã được loại bỏ nhờ sự ra đời của tiêu chuẩn CRI. Giờ đây, mọi thời gian chạy tương thích với CRI đều có thể được sử dụng với Kubernetes, bao gồm containerd và CRI-O, một triển khai OCI của tiêu chuẩn.

Trong khi CRI mang lại sự linh hoạt mới cho Kubernetes, nó đã đưa ra một vấn đề đối với các cụm hiện có. Docker thiếu hỗ trợ cho tiêu chuẩn CRI vì vậy Dockershim được xây dựng để cho phép khả năng tương thích của lớp Kubernetes ở trên cùng. Dockershim là một tích hợp trực tiếp với Docker Engine luôn được dự định là một biện pháp tạm thời.

Phong trào vùng chứa giờ đây nhiều hơn Docker, như Kubernetes ban đầu đẩy lên CRI thể hiện. Docker tự nó đã chia thành các thành phần riêng lẻ với thời gian chạy của nó được trích xuất dưới dạng containerd, một người tốt nghiệp của Cloud Native Computing Foundation (CNCF).

containerd được Kubernetes hỗ trợ đầy đủ và phù hợp hơn để sử dụng độc lập trong môi trường đám mây. Kubernetes không yêu cầu Docker CLI và hàng loạt tính năng của nó để chạy Pod của bạn; tất cả những gì nó cần là khả năng khởi động và chạy các thùng chứa ở mức tương đối thấp. Dockershim đã bị xóa vì khó bảo trì. Việc sử dụng nó đã tạo ra mã mỏng manh được kết hợp chặt chẽ với việc triển khai Docker Engine.

Kiểm tra xem bạn có đang sử dụng Dockershim hay không

Các cụm được tạo gần đây trên các nền tảng hiện đại rất khó có khả năng sử dụng Dockershim. Điều này bao gồm các cụm được quản lý bởi các nhà cung cấp đám mây phổ biến như Amazon EKS, Azure AKS, Google GKE và DigitalOcean DOKS.

Nhiều khả năng bạn cần phải hành động nếu bạn duy trì cụm của riêng mình và lần đầu tiên thiết lập nó vài năm trước. Bạn có thể kiểm tra xem mình có đang sử dụng Dockershim làm thời gian chạy cho bất kỳ Nút nào của mình hay không bằng cách chạy lệnh Kubectl này:

$ kubectl get nodes -o wide
NAME    STATUS  VERSION     CONTAINER-RUNTIME
node-1  Ready   v1.22.8     docker://19.3.1
node-2  Ready   v1.22.8     containerd://1.4.13

Trong ví dụ này, một trong các nút đang sử dụng containerd và có thể để nguyên. Nút khác được định cấu hình bằng Docker và có thể bị ảnh hưởng bởi việc xóa Dockershim. Bạn có thể kiểm tra bằng cách chạy lệnh này trên Node:

$ tr  ' ' < /proc/"$(pgrep kubelet)"/cmdline | grep "--container-runtime"

Node của bạn đang sử dụng Dockershim để chạy các vùng chứa nếu không có đầu ra nào được hiển thị. Nếu bạn nhận được một số đầu ra, hãy kiểm tra --container-runtime-endpoint giá trị cờ để xác định xem Dockershim có đang hoạt động hay không. Một điểm cuối thời gian chạy của unix:///run/containerd/containerd.sock tín hiệu containerd được sử dụng, vì vậy không cần di chuyển.

Thay đổi thời gian chạy của nút

Các nút đang sử dụng Dockershim cần được cập nhật để sử dụng thời gian chạy khác. Trước tiên, tiêu hao khối lượng công việc của Node bằng Kubectl, do đó, các Pod của bạn được lên lịch lại thành các Node khác trong cụm của bạn. Bạn cũng nên kết nối Node để dừng bất kỳ Pod mới nào đang được lên lịch.

$ kubectl cordon node-1
$ kubectl drain node-1 --ignore-daemonsets

Tiếp theo, chạy các lệnh sau trên chính Node. Bắt đầu bằng cách dừng trình nền Docker và quy trình công nhân Kubelet của Node:

$ systemctl stop kubelet
$ systemctl disable docker.service --now

Bây giờ bạn có thể cài đặt thời gian chạy mới của mình.

Sử dụng containerd

containerd nói chung là giải pháp ưu tiên cho các cụm hiện tại. Bạn có thể chuyển sang containerd nếu bạn không dựa vào các tính năng cụ thể của Docker Engine. Nếu đúng như vậy, hãy chuyển đến phần sau và cài đặt cri-dockerd để thay thế.

Thêm kho lưu trữ của Docker vào hệ thống của bạn nếu danh sách gói của bạn chưa bao gồm nó. containerd được phân phối trong kho lưu trữ của Docker.

$ sudo apt-get update
$ sudo apt-get install ca-certificates curl gnupg lsb-release
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo 
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian 
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Cài đặt containerd:

$ sudo apt update
$ sudo apt install containerd

Bây giờ hãy cập nhật tệp cấu hình Kubelet của Node để sử dụng thời gian chạy mới. Mở /var/lib/kubelet/kubeadm-flags.env. Tìm kiếm hoặc thêm --container-runtime--container-runtime-endpoint cờ với các giá trị sau:

  • --container-runtime=remote
  • --container-runtime-endpoint=unix:///run/containerd/containerd.sock

Tiếp theo, thay đổi chú thích ổ cắm được lưu so với đối tượng Node trong mặt phẳng điều khiển Kubernetes:

$ kubectl edit node node-1

Trong tệp mở ra, hãy tìm kubeadm.alpha.kubernetes.io/cri-socket chú thích và thay đổi nó thành unix:///run/containerd/containerd.sock. Lưu và đóng tệp để cập nhật đối tượng của Node.

Bây giờ khởi động lại Kubelet:

$ systemctl start kubelet

Cho phép Node khởi động trong giây lát và kết nối với mặt phẳng điều khiển Kubernetes. Bạn sẽ có thể lặp lại get nodes và thấy rằng containerd hiện đang được sử dụng.

$ kubectl get nodes -o wide
NAME    STATUS  VERSION     CONTAINER-RUNTIME
node-1  Ready   v1.22.8     containerd://1.4.13
node-2  Ready   v1.22.8     containerd://1.4.13

Cuối cùng, loại bỏ dây bạn đã đặt xung quanh Node để nó có thể bắt đầu nhận Pod:

$ kubectl uncordon node-1

Sử dụng cri-dockerd

cri-dockerd là một thời gian chạy do Docker và Mirantis cùng phát triển. Nó thực sự là một phiên bản độc lập của Dockershim được duy trì độc lập. Nó cho phép bạn tiếp tục sử dụng chức năng quen thuộc mà không cần mã hóa dự án Kubernetes với các yêu cầu bảo trì của Dockershim.

Đảm bảo rằng bạn đã cài đặt Docker Engine. Sau đó, cài đặt cri-dockerd bằng cách tải xuống bản nhị phân mới nhất từ ​​các bản phát hành GitHub:

$ wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.0/cri-dockerd-v0.2.0-linux-amd64.tar.gz
$ tar xvf cri-dockerd-v0.2.0-linux-amd64.tar.gz
$ mv cri-dockerd /usr/local/bin/

Tiếp theo, tải xuống, cài đặt và kích hoạt cấu hình dịch vụ systemd của cri-dockerd:

wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.service
wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socket
sudo mv cri-docker.socket cri-docker.service /etc/systemd/system/
sudo sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service

sudo systemctl daemon-reload
sudo systemctl enable cri-docker.service
sudo systemctl enable --now cri-docker.socket

Giờ đây, bạn có thể sửa đổi cấu hình Kubelet của Node để sử dụng cri-dockerd. Điều này tương tự như cấu hình Node để sử dụng containerd.

Mở /var/lib/kubelet/kubeadm-flags.env. Tìm kiếm hoặc thêm --container-runtime--container-runtime-endpoint cờ với các giá trị sau:

  • --container-runtime=remote
  • --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock

Tiếp theo thay đổi chú thích ổ cắm của đối tượng Node:

$ kubectl edit node node-1

Trong tệp mở ra, hãy tìm kubeadm.alpha.kubernetes.io/cri-socket chú thích và thay đổi nó thành unix:///var/run/cri-dockerd.sock. Lưu và đóng tệp để cập nhật đối tượng của Node.

Bây giờ khởi động lại Kubelet:

$ systemctl start kubelet

Chờ một lát rồi sử dụng Kubectl để kiểm tra Node đã hoạt động chưa. Nó sẽ vẫn hiển thị thời gian chạy Docker nhưng giờ đây nó dựa trên cri-dockerd độc lập, thay vì Dockershim được tích hợp với Kubernetes.

$ kubectl get nodes -o wide
NAME    STATUS  VERSION     CONTAINER-RUNTIME
node-1  Ready   v1.22.8     docker://19.3.1
node-2  Ready   v1.22.8     containerd://1.4.13

Bây giờ bạn có thể tháo dây buộc bạn đã đặt xung quanh Node. Nó sẽ bắt đầu chấp nhận lại các yêu cầu lập lịch Pod.

$ kubectl uncordon node-1

Sự kết luận

Kubernetes v1.24 đã loại bỏ thành phần Dockershim trước đó đã tích hợp khả năng tương thích CRI cho Docker Engine. Mặc dù hầu hết các cụm gần đây sẽ không bị ảnh hưởng, bạn nên kiểm tra xem mình có đang sử dụng Dockershim hay không trước khi nâng cấp lên bản phát hành mới.

Thời gian chạy để chuyển sang tùy thuộc vào cách bạn hiện đang sử dụng cụm của mình. containerd thường là một lựa chọn tốt nếu bạn không sử dụng các tính năng của Docker. Bạn có thể sử dụng cri-dockerd để khôi phục lại tích hợp giống Dockershim nếu bạn cần duy trì khả năng tương thích với công cụ hiện có phụ thuộc vào Docker Engine. Điều này cũng hữu ích nếu bạn đang gắn ổ cắm Docker daemon (/var/run/docker.sock) vào vùng chứa của bạn để cung cấp năng lượng cho quy trình làm việc Docker-in-Docker.

Việc xóa Dockershim không ảnh hưởng đến cách bạn xây dựng và sử dụng hình ảnh vùng chứa. Kubernetes vẫn có thể chạy các hình ảnh được tạo bằng docker build và chúng tương thích với tất cả các thời gian chạy được hỗ trợ. Thời gian chạy CRI hoạt động với bất kỳ hình ảnh định dạng OCI nào, dưới dạng đầu ra của Docker và các trình xây dựng hình ảnh khác.

dịch vụ cài win online từ xa

[ad_2]

Vui lòng đánh giá về dịch vụ tại nhà