你好! 我叫 Sergey,是 Surf 的 DevOps 人員。 Surf 的 DevOps 部門不僅旨在建立專家之間的互動和集成工作流程,而且還積極研究並在自己的基礎設施和客戶的基礎設施中實施相關技術。
下面我就講一下我們在研究發行版時遇到的容器技術棧的變化。 CentOS 8的 以及關於什麼是 CRI-O 以及如何快速搭建可執行環境 Kubernetes.
為什麼 CentOS 8 標準發行版中缺少 Docker
安裝最新的主要版本後 RHEL 8 或 CentOS 8的 不可忽視:這些發行版和官方存儲庫缺少應用程序 碼頭工人,它在思想和功能上取代了軟件包 波德曼, 布達赫 (默認情況下存在於發行版中)和 CRI-O。 這是由於紅帽作為開放容器計劃 (OCI) 項目的一部分制定的標準的實際實施。
OCI 是 Linux 基金會的一部分,其目標是為容器格式和可執行環境創建開放的行業標準,以同時解決多個問題。 首先,它們與 Linux 的哲學並不矛盾(例如,每個程序必須執行某個操作,並且 碼頭工人 是一種一體化的組合)。 其次,我們可以消除軟件中現有的所有缺陷 碼頭工人。 第三,它們將完全兼容領先商業平台針對部署、管理和維護容器化應用程序(例如紅帽OpenShift)提出的業務需求。
限制 碼頭工人 新軟件的優點已經在
重要的是要注意建議堆棧的組件具有哪些功能:
- 波德曼 - 通過runC進程直接與容器和鏡像存儲交互;
- 布達赫 - 組裝並加載到圖像註冊表中;
- CRI-O - 容器編排系統的運行時環境(例如 Kubernetes)。
我認為為了理解堆棧組件之間交互的一般方案,建議在這裡給出一個連接圖 Kubernetes c 運行C 和低級庫使用 CRI-O:
CRI-O и Kubernetes 遵循相同的版本和支持週期(兼容性矩陣非常簡單:主要版本 Kubernetes и CRI-O 一致),考慮到開發人員對該堆棧工作的全面和全面測試的重點,使我們有權期望在任何使用場景中都能實現最大的工作穩定性(相對輕便在這裡也是有益的)。 CRI-O 和....相比 碼頭工人 由於有意限制功能)。
安裝時 Kubernetes “正確的方式”方式(當然,根據 OCI)使用 CRI-O 上 CentOS 8的 我們遇到了一些小困難,但我們都成功地克服了。 我很樂意與您分享安裝和配置說明,總共最多需要 10 分鐘。
如何使用 CRI-O 環境在 CentOS 8 上部署 Kubernetes
先決條件:至少擁有一台主機(2 核、4 GB RAM、至少 15 GB 存儲空間) CentOS 8的 (推薦安裝配置文件“服務器”),以及本地 DNS 中的條目(在極端情況下,您可以使用 /etc/hosts 中的條目)。 並且不要忘記
我們代表root用戶在主機上執行所有操作,請小心。
- 第一步,我們將設置操作系統,安裝並配置 CRI-O 的初步依賴項。
- 更新操作系統:
dnf -y update
- 接下來,您需要配置防火牆和 SELinux。 在這裡,一切都取決於我們的主機或主機的工作環境。 您可以按照中的建議設置防火牆
文件 ,或者如果您位於受信任的網絡上或使用第三方防火牆,請將默認區域更改為受信任或關閉防火牆:firewall-cmd --set-default-zone trusted firewall-cmd --reload
要關閉防火牆,可以使用以下命令:
systemctl disable --now firewalld
SELinux 需要禁用或設置為“寬容”模式:
setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
- 加載必要的內核模塊和包,配置在系統啟動時自動加載“br_netfilter”模塊:
modprobe overlay modprobe br_netfilter echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf dnf -y install iproute-tc
- 為了激活數據包轉發並正確處理流量,我們將進行適當的設置:
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
應用所做的設置:
sysctl --system
- 設置需要的版本 CRI-O (主要版本 CRI-O,正如已經提到的,與所需的版本相同 Kubernetes)自最新穩定版本以來 Kubernetes 目前1.18:
export REQUIRED_VERSION=1.18
添加必要的存儲庫:
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
- 現在我們可以安裝 CRI-O:
dnf -y install cri-o
請注意我們在安裝過程中遇到的第一個細微差別:您需要編輯配置 CRI-O 在啟動服務之前,因為所需的通用組件的位置與指定的位置不同:
sed -i 's//usr/libexec/crio/conmon//usr/bin/conmon/' /etc/crio/crio.conf
現在您可以激活並啟動守護進程 CRI-O:
systemctl enable --now crio
您可以檢查守護進程的狀態:
systemctl status crio
- 更新操作系統:
- 安裝和激活 Kubernetes.
- 添加所需的存儲庫:
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
現在我們可以安裝了 Kubernetes (1.18版本,如上所述):
dnf install -y kubelet-1.18* kubeadm-1.18* kubectl-1.18* --disableexcludes=kubernetes
- 第二個重要的細微差別:因為我們不使用守護進程 碼頭工人,但使用守護進程 CRI-O,在啟動和初始化之前 Kubernetes 創建必要的目錄後,您需要在 /var/lib/kubelet/config.yaml 配置文件中進行適當的設置:
mkdir /var/lib/kubelet cat <<EOF > /var/lib/kubelet/config.yaml apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd EOF
- 我們在安裝過程中遇到的第三個要點:儘管我們已經指出了所使用的驅動程序 團體,以及通過傳遞的參數進行配置 庫貝萊 過時的(文檔中直接指出),我們需要向文件添加參數,否則我們的集群將不會被初始化:
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
- 現在我們可以激活守護進程 庫貝萊:
sudo systemctl enable --now kubelet
定制 控制平面 或 工人 幾分鐘內的節點,您可以使用
這個腳本 .
- 添加所需的存儲庫:
- 是時候初始化我們的集群了。
- 要初始化集群,請運行以下命令:
kubeadm init --pod-network-cidr=10.244.0.0/16
請務必寫下加入集群的命令“kubeadm join ...”,該命令在輸出末尾提供,或者至少寫下指定的標記。
- 為 Pod 網絡安裝插件 (CNI)。 我建議使用 印花布。 可能更受歡迎 絨布 有兼容性問題 耐用品是的和 印花布 - 該項目唯一推薦並經過全面測試的 CNI 實現 Kubernetes:
kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml
- 要將工作節點連接到我們的集群,您需要根據說明1和2進行配置,或者使用
腳本 ,然後從我們在上一步中記錄的“kubeadm init ...”輸出中運行命令:kubeadm join $CONTROL_PLANE_ADDRESS:6443 --token $TOKEN --discovery-token-ca-cert-hash $TOKEN_HASH
- 讓我們檢查一下我們的集群是否已初始化並開始工作:
kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
準備好! 您已經可以在 K8s 集群上託管有效負載。
- 要初始化集群,請運行以下命令:
我們的未來是什麼
我希望上述說明有助於節省您的時間和精力。
行業中發生的流程的結果通常取決於相關領域的大多數最終用戶和其他軟件開發人員如何接受它們。 目前尚不完全清楚 OCI 計劃在幾年內將走向何方,但我們很樂意跟隨它。 您現在可以在評論中分享您的意見。
敬請關注!
本文的創建歸功於以下來源:
- 關於容器運行時的部分
Kubernetes 文檔 頁 互聯網上的 CRI-O 項目- 紅帽博客文章:
這個 ,此 和許多其他人
來源: www.habr.com