สวัสดี! ฉันชื่อเซอร์เกย์ ฉันเป็น DevOps ที่ Surf แผนก DevOps ที่ Surf มีเป้าหมายไม่เพียงเพื่อสร้างปฏิสัมพันธ์ระหว่างผู้เชี่ยวชาญและผสานรวมเวิร์กโฟลว์เท่านั้น แต่ยังมุ่งวิจัยและนำเทคโนโลยีที่เกี่ยวข้องไปใช้อย่างแข็งขันทั้งในโครงสร้างพื้นฐานของตนเองและในโครงสร้างพื้นฐานของลูกค้า
ด้านล่างนี้ฉันจะพูดถึงการเปลี่ยนแปลงเล็กน้อยในกลุ่มเทคโนโลยีสำหรับคอนเทนเนอร์ที่เราพบในขณะที่ศึกษาการกระจาย 8 CentOS และเกี่ยวกับสิ่งที่เป็น ซีอาร์ไอ-โอ และวิธีตั้งค่าสภาพแวดล้อมที่เรียกใช้งานได้อย่างรวดเร็วด้วย Kubernetes.
เหตุใด Docker จึงหายไปจากการกระจายมาตรฐานของ CentOS 8
หลังจากติดตั้งรีลีสหลักล่าสุดแล้ว RHEL 8 หรือ 8 CentOS ไม่ควรมองข้าม: การแจกแจงเหล่านี้และที่เก็บข้อมูลอย่างเป็นทางการไม่มีแอปพลิเคชัน นักเทียบท่าซึ่งแทนที่แพ็คเกจในเชิงอุดมการณ์และเชิงหน้าที่ พอดแมน, บิวดาห์ (มีอยู่ในการกระจายตามค่าเริ่มต้น) และ ซีอาร์ไอ-โอ. นี่เป็นเพราะการนำมาตรฐานที่พัฒนาโดยเร้ดแฮทไปปฏิบัติจริง ซึ่งเป็นส่วนหนึ่งของโครงการ Open Container Initiative (OCI)
เป้าหมายของ OCI ซึ่งเป็นส่วนหนึ่งของ The Linux Foundation คือการสร้างมาตรฐานอุตสาหกรรมแบบเปิดสำหรับรูปแบบคอนเทนเนอร์และสภาพแวดล้อมที่เรียกใช้งานได้ซึ่งจะแก้ปัญหาต่างๆ ได้พร้อมกัน ประการแรก พวกเขาไม่ได้ขัดแย้งกับปรัชญาของลินุกซ์ (เช่น ในส่วนของมันที่ว่าแต่ละโปรแกรมต้องดำเนินการอย่างใดอย่างหนึ่ง และ นักเทียบท่า เป็นการรวมแบบ all-in-one) ประการที่สอง เราสามารถกำจัดข้อบกพร่องที่มีอยู่ในซอฟต์แวร์ได้ทั้งหมด นักเทียบท่า. ประการที่สาม พวกเขาจะเข้ากันได้อย่างสมบูรณ์กับข้อกำหนดทางธุรกิจที่นำเสนอโดยแพลตฟอร์มเชิงพาณิชย์ชั้นนำสำหรับการปรับใช้ การจัดการ และการบำรุงรักษาแอปพลิเคชันคอนเทนเนอร์ (เช่น Red Hat OpenShift)
ข้อ จำกัด นักเทียบท่า และข้อดีของซอฟต์แวร์ใหม่ได้อธิบายไว้ในรายละเอียดแล้ว
สิ่งสำคัญคือต้องสังเกตว่าส่วนประกอบของสแต็กที่เสนอมีฟังก์ชันการทำงานใดบ้าง:
- พอดแมน - การโต้ตอบโดยตรงกับคอนเทนเนอร์และที่เก็บรูปภาพผ่านกระบวนการ runC
- บิวดาห์ - ประกอบและโหลดลงในรีจิสตรีของรูปภาพ
- ซีอาร์ไอ-โอ - สภาพแวดล้อมรันไทม์สำหรับระบบการจัดการคอนเทนเนอร์ (เช่น Kubernetes)
ฉันคิดว่าเพื่อให้เข้าใจรูปแบบทั่วไปของการโต้ตอบระหว่างส่วนประกอบของสแต็กขอแนะนำให้จัดทำแผนภาพการเชื่อมต่อที่นี่ Kubernetes c รันซี และไลบรารีระดับต่ำโดยใช้ ซีอาร์ไอ-โอ:
ซีอาร์ไอ-โอ и Kubernetes ทำตามรีลีสและรอบการสนับสนุนเดียวกัน (เมทริกซ์ความเข้ากันได้นั้นง่ายมาก: รีลีสหลัก Kubernetes и ซีอาร์ไอ-โอ ตรงกัน) และสิ่งนี้โดยคำนึงถึงการมุ่งเน้นไปที่การทดสอบงานของสแต็คนี้อย่างเต็มรูปแบบและครอบคลุมโดยนักพัฒนา ทำให้เรามีสิทธิ์ที่จะคาดหวังความเสถียรสูงสุดที่ทำได้ในการทำงานในทุกสถานการณ์การใช้งาน (ความเบาสัมพัทธ์ก็มีประโยชน์เช่นกัน) ซีอาร์ไอ-โอ เมื่อเทียบกับ นักเทียบท่า เนื่องจากข้อจำกัดของฟังก์ชันที่มีจุดประสงค์)
เมื่อทำการติดตั้ง Kubernetes วิธี "ถูก" (ตาม OCI แน่นอน) โดยใช้ ซีอาร์ไอ-โอ บน 8 CentOS เราประสบปัญหาเล็กน้อยซึ่งอย่างไรก็ตามเราเอาชนะได้สำเร็จ ฉันยินดีที่จะแบ่งปันคำแนะนำในการติดตั้งและการกำหนดค่ากับคุณ ซึ่งโดยรวมจะใช้เวลาสูงสุด 10 นาที
วิธีปรับใช้ Kubernetes บน CentOS 8 โดยใช้สภาพแวดล้อม CRI-O
ข้อกำหนดเบื้องต้น: มีอย่างน้อยหนึ่งโฮสต์ (2 คอร์, 4 GB RAM, พื้นที่เก็บข้อมูลอย่างน้อย 15 GB) พร้อมด้วย 8 CentOS (โปรไฟล์การติดตั้งที่แนะนำ "เซิร์ฟเวอร์") รวมถึงรายการใน DNS ในเครื่อง (ในกรณีที่รุนแรงคุณสามารถรับได้ด้วยรายการใน /etc/hosts) และอย่าลืม
เราดำเนินการทั้งหมดบนโฮสต์ในนามของผู้ใช้รูท โปรดใช้ความระมัดระวัง
- ในขั้นตอนแรก เราจะตั้งค่าระบบปฏิบัติการ ติดตั้งและกำหนดค่าการอ้างอิงเบื้องต้นสำหรับ 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
- กำหนดเวอร์ชันที่ต้องการ ซีอาร์ไอ-โอ (รุ่นใหญ่ ซีอาร์ไอ-โอดังที่ได้กล่าวไปแล้วว่าเหมือนกับเวอร์ชันที่ต้องการ 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
- ตอนนี้เราสามารถติดตั้ง ซีอาร์ไอ-โอ:
dnf -y install cri-o
ให้ความสนใจกับความแตกต่างเล็กน้อยแรกที่เราพบระหว่างกระบวนการติดตั้ง: คุณต้องแก้ไขการกำหนดค่า ซีอาร์ไอ-โอ ก่อนเริ่มบริการ เนื่องจากคอมโพเนนต์ conmon ที่ต้องการมีตำแหน่งที่แตกต่างจากที่ระบุ:
sed -i 's//usr/libexec/crio/conmon//usr/bin/conmon/' /etc/crio/crio.conf
ตอนนี้คุณสามารถเปิดใช้งานและเริ่มภูตได้แล้ว ซีอาร์ไอ-โอ:
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
- ความแตกต่างที่สำคัญประการที่สอง: เนื่องจากเราไม่ได้ใช้ภูต นักเทียบท่าแต่ใช้ภูต ซีอาร์ไอ-โอก่อนเปิดตัวและเริ่มต้น 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 เข้าร่วม ... " ซึ่งมีให้ที่ส่วนท้ายของเอาต์พุต หรืออย่างน้อยโทเค็นที่ระบุ
- ติดตั้งปลั๊กอิน (CNI) สำหรับเครือข่าย Pod ฉันแนะนำให้ใช้ ผ้าดิบ. อาจเป็นที่นิยมมากขึ้น สักหลาด มีปัญหาความเข้ากันได้กับ nftablesใช่และใช่ ผ้าดิบ - การใช้งาน 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
พร้อม! คุณสามารถโฮสต์เพย์โหลดบนคลัสเตอร์ K8 ของคุณได้แล้ว
- เมื่อต้องการเริ่มต้นคลัสเตอร์ ให้รันคำสั่ง:
สิ่งที่รอเราอยู่ข้างหน้า
ฉันหวังว่าคำแนะนำข้างต้นจะช่วยคุณประหยัดเวลาและความกังวลได้
ผลลัพธ์ของกระบวนการที่เกิดขึ้นในอุตสาหกรรมมักขึ้นอยู่กับว่ากระบวนการเหล่านี้ได้รับการยอมรับจากผู้ใช้ปลายทางและผู้พัฒนาซอฟต์แวร์อื่น ๆ ในช่องที่เกี่ยวข้องอย่างไร ยังไม่ชัดเจนว่าโครงการริเริ่ม OCI จะนำไปสู่ที่ใดในอีกไม่กี่ปีข้างหน้า แต่เรายินดีที่จะปฏิบัติตาม คุณสามารถแบ่งปันความคิดเห็นของคุณตอนนี้ในความคิดเห็น
คอยติดตาม!
บทความนี้สร้างขึ้นจากแหล่งที่มาต่อไปนี้:
- ส่วนเกี่ยวกับรันไทม์ของคอนเทนเนอร์
เอกสาร Kubernetes หน้าหนังสือ โครงการ CRI-O บนอินเทอร์เน็ต- บทความในบล็อก Red Hat:
อันนี้ ,นี้ และอื่น ๆ อีกมากมาย
ที่มา: will.com