CRI-O thay thế cho Docker làm thời gian chạy cho Kubernetes: Thiết lập trên CentOS 8

Xin chào! Tên tôi là Sergey, tôi là DevOps tại Surf. Bộ phận DevOps tại Surf không chỉ nhằm mục đích thiết lập sự tương tác giữa các chuyên gia và tích hợp quy trình công việc, mà còn tích cực nghiên cứu và triển khai các công nghệ liên quan cả trong cơ sở hạ tầng của chính họ và cơ sở hạ tầng của khách hàng.

Dưới đây tôi sẽ nói một chút về những thay đổi trong ngăn xếp công nghệ cho các thùng chứa mà chúng tôi đã gặp khi nghiên cứu phân phối. CentOS 8 và về những gì là CRI-O và làm thế nào để nhanh chóng thiết lập một môi trường thực thi với nó cho Kubernetes.

CRI-O thay thế cho Docker làm thời gian chạy cho Kubernetes: Thiết lập trên CentOS 8

Tại sao Docker bị thiếu trong bản phân phối tiêu chuẩn của CentOS 8

Sau khi cài đặt các bản phát hành chính mới nhất RHEL 8 hoặc CentOS 8 không thể bỏ qua: các bản phân phối và kho lưu trữ chính thức này đang thiếu ứng dụng phu bến tàu, thay thế các gói về mặt ý thức hệ và chức năng podman, xây dựng (hiện diện trong bản phân phối theo mặc định) và CRI-O. Điều này là do việc triển khai thực tế các tiêu chuẩn do Red Hat phát triển, trong số những tiêu chuẩn khác, như một phần của dự án Sáng kiến ​​Vùng chứa Mở (OCI).

Mục tiêu của OCI, một phần của The Linux Foundation, là tạo ra các tiêu chuẩn công nghiệp mở cho các định dạng vùng chứa và môi trường thực thi có thể giải quyết một số vấn đề cùng một lúc. Đầu tiên, chúng không mâu thuẫn với triết lý của Linux (ví dụ, trong phần đó, mỗi chương trình phải thực hiện một hành động nào đó và phu bến tàu là một loại kết hợp tất cả trong một). Thứ hai, chúng tôi có thể loại bỏ tất cả các thiếu sót hiện có trong phần mềm phu bến tàu. Thứ ba, chúng sẽ hoàn toàn tương thích với các yêu cầu kinh doanh do các nền tảng thương mại hàng đầu đưa ra để triển khai, quản lý và duy trì các ứng dụng được đóng gói (ví dụ: Red Hat OpenShift).

Hạn chế phu bến tàu và những ưu điểm của phần mềm mới đã được mô tả chi tiết trong bài viết nàyvà mô tả chi tiết về cách toàn bộ ngăn xếp phần mềm được cung cấp như một phần của dự án OCI và các tính năng kiến ​​trúc của nó có thể được tìm thấy trong tài liệu chính thức và các bài viết từ chính Red Hat (tốt bài viết trong blog Red Hat) và trong bên thứ ba đánh giá.

Điều quan trọng cần lưu ý là các thành phần của ngăn xếp được đề xuất có chức năng gì:

  • podman - tương tác trực tiếp với các thùng chứa và lưu trữ hình ảnh thông qua quy trình runC;
  • xây dựng - lắp ráp và tải vào sổ đăng ký hình ảnh;
  • CRI-O - môi trường thời gian chạy cho các hệ thống điều phối vùng chứa (ví dụ: Kubernetes).

Tôi nghĩ rằng để hiểu sơ đồ tương tác chung giữa các thành phần của ngăn xếp, nên đưa ra ở đây một sơ đồ kết nối Kubernetes c chạyC và các thư viện cấp thấp sử dụng CRI-O:

CRI-O thay thế cho Docker làm thời gian chạy cho Kubernetes: Thiết lập trên CentOS 8

CRI-O и Kubernetes tuân theo cùng chu kỳ phát hành và hỗ trợ (ma trận tương thích rất đơn giản: các bản phát hành chính Kubernetes и CRI-O trùng khớp), và điều này, có tính đến việc các nhà phát triển tập trung vào thử nghiệm đầy đủ và toàn diện công việc của ngăn xếp này, cho chúng tôi quyền mong đợi sự ổn định tối đa có thể đạt được trong công việc trong mọi tình huống sử dụng (độ nhẹ tương đối cũng có lợi ở đây). CRI-O so với phu bến tàu do hạn chế có mục đích của chức năng).

Khi cài đặt Kubernetes cách "đúng cách" (dĩ nhiên là theo OCI) bằng cách sử dụng CRI-O trên CentOS 8 Chúng tôi gặp một số khó khăn nhỏ, tuy nhiên, chúng tôi đã vượt qua thành công. Tôi rất sẵn lòng chia sẻ với bạn các hướng dẫn cài đặt và cấu hình, tổng cộng sẽ mất tối đa 10 phút.

Cách triển khai Kubernetes trên CentOS 8 bằng môi trường CRI-O

Điều kiện tiên quyết: Có ít nhất một máy chủ (2 lõi, RAM 4 GB, dung lượng lưu trữ ít nhất 15 GB) với CentOS 8 (cấu hình cài đặt được đề xuất là "Máy chủ"), cũng như các mục nhập cho nó trong DNS cục bộ (trong trường hợp cực đoan, bạn có thể thực hiện bằng một mục nhập trong /etc/hosts). Và đừng quên vô hiệu hóa trao đổi.

Chúng tôi thực hiện tất cả các hoạt động trên máy chủ thay mặt cho người dùng root, hãy cẩn thận.

  1. Trong bước đầu tiên, chúng tôi sẽ thiết lập HĐH, cài đặt và định cấu hình các phụ thuộc sơ bộ cho CRI-O.
    • Cập nhật hệ điều hành:
      dnf -y update
      

    • Tiếp theo, bạn cần cấu hình tường lửa và SELinux. Ở đây, mọi thứ phụ thuộc vào môi trường mà máy chủ hoặc máy chủ của chúng tôi sẽ hoạt động. Bạn có thể thiết lập tường lửa như được đề xuất trong tài liệuhoặc nếu bạn đang sử dụng mạng đáng tin cậy hoặc sử dụng tường lửa của bên thứ ba, hãy thay đổi vùng mặc định thành đáng tin cậy hoặc tắt tường lửa:
      firewall-cmd --set-default-zone trusted
      
      firewall-cmd --reload

      Để tắt tường lửa, bạn có thể sử dụng lệnh sau:

      systemctl disable --now firewalld
      

      SELinux cần được tắt hoặc đặt ở chế độ "cho phép":

      setenforce 0
      
      sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

    • tải các gói và mô-đun hạt nhân cần thiết, định cấu hình tự động tải mô-đun “br_netfilter” khi khởi động hệ thống:
      modprobe overlay
      
      modprobe br_netfilter
      
      echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf
      
      dnf -y install iproute-tc
      

    • Để kích hoạt chuyển tiếp gói và xử lý chính xác lưu lượng, chúng tôi sẽ thực hiện các cài đặt phù hợp:
      cat > /etc/sysctl.d/99-kubernetes-cri.conf <<EOF
      net.bridge.bridge-nf-call-iptables = 1
      net.ipv4.ip_forward = 1
      net.bridge.bridge-nf-call-ip6tables = 1
      EOF
      

      áp dụng các cài đặt đã thực hiện:

      sysctl --system

    • đặt phiên bản cần thiết CRI-O (phiên bản chính CRI-O, như đã đề cập, giống với phiên bản được yêu cầu Kubernetes) kể từ phiên bản ổn định mới nhất Kubernetes hiện tại 1.18:
      export REQUIRED_VERSION=1.18
      

      thêm các kho lưu trữ cần thiết:

      dnf -y install 'dnf-command(copr)'
      
      dnf -y copr enable rhcontainerbot/container-selinux
      
      curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/CentOS_8/devel:kubic:libcontainers:stable.repo
      
      curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:$REQUIRED_VERSION.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$REQUIRED_VERSION/CentOS_8/devel:kubic:libcontainers:stable:cri-o:$REQUIRED_VERSION.repo

    • bây giờ chúng ta có thể cài đặt CRI-O:
      dnf -y install cri-o
      

      Hãy chú ý đến sắc thái đầu tiên mà chúng ta gặp trong quá trình cài đặt: bạn cần chỉnh sửa cấu hình CRI-O trước khi bắt đầu dịch vụ, vì thành phần chung được yêu cầu có vị trí khác với vị trí được chỉ định:

      sed -i 's//usr/libexec/crio/conmon//usr/bin/conmon/' /etc/crio/crio.conf

      Bây giờ bạn có thể kích hoạt và khởi động daemon CRI-O:

      systemctl enable --now crio
      

      Bạn có thể kiểm tra trạng thái của daemon:

      systemctl status crio
      

  2. Cài đặt và kích hoạt Kubernetes.
    • Thêm kho lưu trữ cần thiết:
      cat <<EOF > /etc/yum.repos.d/kubernetes.repo
      [kubernetes]
      name=Kubernetes
      baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-$basearch
      enabled=1
      gpgcheck=1
      repo_gpgcheck=1
      gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
      exclude=kubelet kubeadm kubectl
      EOF
      

      Bây giờ chúng ta có thể cài đặt Kubernetes (phiên bản 1.18, như đã đề cập ở trên):

      dnf install -y kubelet-1.18* kubeadm-1.18* kubectl-1.18* --disableexcludes=kubernetes

    • Sắc thái quan trọng thứ hai: vì chúng tôi không sử dụng daemon phu bến tàu, nhưng sử dụng daemon CRI-O, trước khi khởi chạy và khởi chạy Kubernetes bạn cần thực hiện các cài đặt phù hợp trong tệp cấu hình /var/lib/kubelet/config.yaml, sau khi tạo thư mục cần thiết:
      mkdir /var/lib/kubelet
      
      cat <<EOF > /var/lib/kubelet/config.yaml
      apiVersion: kubelet.config.k8s.io/v1beta1
      kind: KubeletConfiguration
      cgroupDriver: systemd
      EOF

    • Điểm quan trọng thứ ba mà chúng tôi gặp phải trong quá trình cài đặt: mặc dù thực tế là chúng tôi đã chỉ định trình điều khiển được sử dụng nhómvà cấu hình của nó thông qua các đối số được truyền kubelet đã lỗi thời (được chỉ định trực tiếp trong tài liệu), chúng ta cần thêm các đối số vào tệp, nếu không thì cụm của chúng ta sẽ không được khởi tạo:
      cat /dev/null > /etc/sysconfig/kubelet
      
      cat <<EOF > /etc/sysconfig/kubelet
      KUBELET_EXTRA_ARGS=--container-runtime=remote --cgroup-driver=systemd --container-runtime-endpoint='unix:///var/run/crio/crio.sock'
      EOF

    • Bây giờ chúng ta có thể kích hoạt daemon kubelet:
      sudo systemctl enable --now kubelet
      

      Để tùy chỉnh máy bay điều khiển hoặc công nhân các nút trong vài phút, bạn có thể sử dụng kịch bản này.

  3. Đã đến lúc khởi tạo cụm của chúng tôi.
    • Để khởi tạo cụm, hãy chạy lệnh:
      kubeadm init --pod-network-cidr=10.244.0.0/16
      

      Đảm bảo viết lệnh tham gia cụm "kubeadm join...", được cung cấp ở cuối đầu ra hoặc ít nhất là các mã thông báo được chỉ định.

    • Cài đặt plugin (CNI) cho mạng Pod. Tôi khuyên bạn nên sử dụng một thứ vải trắng. Có thể phổ biến hơn Flannel có vấn đề tương thích với nftables, vâng và vâng một thứ vải trắng - triển khai CNI duy nhất được đề xuất và thử nghiệm đầy đủ bởi dự án Kubernetes:
      kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml 

    • Để kết nối nút công nhân với cụm của chúng tôi, bạn cần định cấu hình nút đó theo hướng dẫn 1 và 2 hoặc sử dụng kịch bản, sau đó chạy lệnh từ đầu ra "kubeadm init..." mà chúng ta đã ghi ở bước trước:
      kubeadm join $CONTROL_PLANE_ADDRESS:6443 --token $TOKEN 
          --discovery-token-ca-cert-hash $TOKEN_HASH

    • Hãy kiểm tra xem cụm của chúng ta đã được khởi tạo và bắt đầu hoạt động chưa:
      kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
      

    Sẵn sàng! Bạn đã có thể lưu trữ tải trọng trên cụm K8 của mình.

Điều gì ở phía trước cho chúng ta

Tôi hy vọng rằng các hướng dẫn ở trên đã giúp bạn tiết kiệm thời gian và thần kinh.
Kết quả của các quy trình diễn ra trong ngành thường phụ thuộc vào cách chúng được chấp nhận bởi phần lớn người dùng cuối và nhà phát triển phần mềm khác trong phân khúc thích hợp. Không hoàn toàn rõ ràng các sáng kiến ​​​​của OCI sẽ dẫn đến đâu trong một vài năm tới, nhưng chúng tôi sẽ sẵn lòng theo dõi nó. Bạn có thể chia sẻ ý kiến ​​​​của bạn ngay bây giờ trong các ý kiến.

Hãy theo dõi!

Bài viết này được tạo ra nhờ các nguồn sau:



Nguồn: www.habr.com

Thêm một lời nhận xét