This is the multi-page printable view of this section. Click here to print.
Khởi tạo cụm với kubeadm
1 - Cài đặt kubeadm
Trang này hướng dẫn cách cài đặt hộp công cụ
kubeadm
.
Để biết thông tin về cách tạo một cụm với Kubeadm sau khi bạn đã thực hiện quy trình cài đặt này,
xem trang Tạo một cụm với kubeadm.
Trang installation guide này dành cho Kubernetes v1.33. Nếu bạn muốn sử dụng phiên bản Kubernetes khác, vui lòng tham khảo các trang sau đây thay vì:
Trước khi bạn bắt đầu
- Một máy chủ Linux tương thích. Dự án Kubernetes cung cấp những hướng dẫn chung cho các bản phân phối Linux dựa trên Debian và Red Hat, và những bản phân phối không có trình quản lý gói.
- 2 GB RAM hoặc nhiều hơn cho mỗi máy (nếu ít hơn sẽ không đủ tài nguyên cho các ứng dụng của bạn).
- 2 CPU hoặc nhiều hơn cho các máy control plane.
- Kết nối toàn mạng giữa tất cả các máy trong cụm (mạng public hoặc private đều được).
- Mọi máy phải có hostname, địa chỉ MAC, và product_uuid duy nhất. Xem tại đây để biết thêm chi tiết.
- Một số cổng được mở trên máy của bạn. Xem tại đây để biết thêm chi tiết.
Lưu ý:
Việc cài đặtkubeadm
có thể được thực hiện thông qua các tệp nhị phân sử dụng liên kết động và giả sử hệ thống của bạn cung cấp glibc
.
Giả định này hợp lý trên nhiều bản phân phối Linux (bao gồm Debian, Ubuntu, Fedora, CentOS, v.v...)
nhưng không phải luôn đúng đối với các bản phân phối nhẹ và tùy biến bởi mặc định chúng không có sẵn glibc
, ví dụ Alpine Linux.
Kỳ vọng là bản phân phối hoặc bao gồm glibc
hoặc có một
lớp tương thích
cung cấp các đặc trưng mong muốn.Kiểm tra phiên bản OS
- Dự án kubeadm hỗ trợ LTS kernel. Xem Danh sách LTS kernel.
- Bạn có thể biết được phiên bản kernel bằng câu lệnh
uname -r
Để biết thêm thông tin, xem Các yêu cầu về Linux Kernel.
- Dự án kubeadm hỗ trợ các phiên bản kernel hiện tại. Xem danh sách kernel hiện tại Thông tin phát hành Windows Server.
- Bạn có thể biết được phiên bản kernel (hay gọi là phiên bản OS) bằng câu lệnh
systeminfo
Để biết thêm thông tin, xem Sự tương thích của các phiên bản Windows OS.
Một cụm Kubernetes được tạo bởi kubeadm phụ thuộc vào phần mềm mà chúng sử dụng các chức năng kernel. Phần mềm này bao gồm, nhưng không giới hạn ở container runtime, kubelet, và một plugin Container Network Interface.
Để giúp bạn tránh những lỗi không mong muốn khi sử dụng một phiên bản kernel không được hỗ trợ, kubeadm chạy kiểm tra pre-flight
SystemVerification
. Quá trình kiểm tra này sẽ lỗi nếu phiên bản kernel không được hỗ trợ.
Bạn có thể chọn bỏ qua kiểm tra, nếu bạn biết rằng kernel của bạn cung cấp các chức năng cần thiết, kể cả kubeadm không hỗ trợ phiên bản đó.
Xác nhận địa chỉ MAC và product_uuid là duy nhất cho từng node
- Bạn có thể biết được địa chỉ MAC của network interfaces bằng câu lệnh
ip link
hoặcifconfig -a
- product_uuid có thể kiểm tra bằng câu lệnh
sudo cat /sys/class/dmi/id/product_uuid
Rất có thể các thiết bị phần cứng sẽ có các địa chỉ duy nhất, mặc dù một vài máy ảo có thể có các giá trị giống hệt nhau. Kubernetes sử dụng những giá trị đó để định danh duy nhất cho các node trong cụm. Nếu các giá trị đó không là duy nhất cho từng node, quá trình cái đặt có thể thất bại.
Kiểm tra network adapter
Nếu bạn có nhiều hơn một network adapter, và các thành phần Kubernetes của bạn không thể truy cập trên route mặc định, chúng tôi khuyên bạn nên bổ sung (các) IP route để các địa chỉ cụm Kubernetes đi qua adpater thích hợp.
Kiểm tra các cổng cần thiết
Những cổng cần thiết cần phải được mở để các thành phần Kubernetes giao tiếp với nhau. Bạn có thể sử dụng công cụ như netcat để kiểm tra cổng có được mở hay không. Ví dụ:
nc 127.0.0.1 6443 -zv -w 2
Pod network plugin mà bạn sử dụng cũng có thể yêu cầu mở một số cổng nhất định. Vì điều này khác nhau đối với từng pod network plugin, vui lòng xem tài liệu của các plugin về (các) cổng cần thiết.
Cấu hình swap
Mặc định kubelet sẽ không thể khởi động nếu bộ nhớ swap được phát hiện trên một node. Điều này có nghĩa rằng swap nên hoặc là tắt đi hoặc là được chấp nhận bởi kubelet.
- Để chấp nhận swap, thêm
failSwapOn: false
vào cấu hình kubelet hoặc thông qua tham số dòng lệnh. Lưu ý: thậm chí nếufailSwapOn: false
được thêm, workload mặc định cũng không có quyền truy cập swap. Điều này có thể được thay đổi bằng cách đặtswapBehavior
, một lần nữa trong file cấu hình kubelet. Để sử dụng swap, đặt mộtswapBehavior
khác với giá trị mặc địnhNoSwap
. Xem Quản lý bộ nhớ swap để biết thêm chi tiết. - Để tắt swap,
sudo swapoff -a
có thể được sử dụng để tắt tạm thời. Để làm cho thay đổi này duy trì mỗi khi tái khởi động, đảm bảo rằng swap được tắt trong các file cấu hình như/etc/fstab
,systemd.swap
, phụ thuộc vào việc nó được cấu hình như thế nào trên hệ thống của bạn.
Cài đặt một container runtime
Để chạy các container trong các Pod, Kubernetes sử dụng một container runtime.
Mặc định, Kubernetes sử dụng Container Runtime Interface (CRI) để giao tiếp với container runtime mà bạn chọn.
Nếu bạn không chỉ định một runtime, kubeadm tự động phát hiện một container runtime đã cài đặt bằng cách quét qua một danh sách những endpoint đã biết.
Nếu có nhiều hoặc không có container runtime nào được phát hiện, kubeadm sẽ ném ra một lỗi và sẽ yêu cầu bạn chỉ định một thứ bạn muốn sử dụng.
Xem container runtimes để biết thêm thông tin.
Lưu ý:
Docker Engine không triển khai CRI, một thứ bắt buộc của container runtime để hoạt động với Kubernetes. Vì lí do đó, một dịch vụ bổ sung cri-dockerd phải được cài đặt. cri-dockerd là một dự án dựa trên sự hỗ trợ legacy built-in của Docker Engine mà đã bị loại bỏ khỏi kubelet trong phiên bản 1.24.Những bản bên dưới bao gồm những endpoint đã biết của những hệ điều hành được hỗ trợ:
Runtime | Đường dẫn tới Unix domain socket |
---|---|
containerd | unix:///var/run/containerd/containerd.sock |
CRI-O | unix:///var/run/crio/crio.sock |
Docker Engine (using cri-dockerd) | unix:///var/run/cri-dockerd.sock |
Runtime | Đường dẫn tới Windows named pipe |
---|---|
containerd | npipe:////./pipe/containerd-containerd |
Docker Engine (using cri-dockerd) | npipe:////./pipe/cri-dockerd |
Cài đặt kubeadm, kubelet và kubectl
Bạn sẽ cài đặt các package này trên toàn bộ máy chủ của bạn:
-
kubeadm
: lệnh khởi tạo cụm. -
kubelet
: thành phần chạy trên toàn bộ các máy trong cụm của bạn và làm những việc như khởi chạy pod và container. -
kubectl
: tiện ích dòng lệnh để giao tiếp với cụm.
kubeadm sẽ không cài đặt hoặc quản lý kubelet
và kubectl
cho bạn, vì vậy bạn sẽ
cần phải đảm bảo rằng phiên bản của chúng giống với Kubernetes control plane bạn muốn
kubeadm cài cho bạn. Nếu bạn không làm vậu, rủi ro về sự chênh lệch phiên bản có thể xảy ra và
dẫn tới những hành vi lỗi, không mong muốn. Tuy nhiên, chênh lệch một phiên bản minor giữa
kubelet và control plane được chấp nhận, nhưng phiên bản kubelet không bao giờ vượt quá phiên bản API
server. Ví dụ, kubelet đang chạy 1.7.0 có thể tương thích hoàn toàn với API server phiên bản 1.8.0,
nhưng không có chiều ngược lại.
Để biết cách cài đặt kubectl
, xem Cài đặt và thiết lập kubectl.
Cảnh báo:
Những hướng dẫn này loại trừ tất cả các package của Kubernetes khỏi mọi sự nâng cấp hệ thống. Bởi vì kubeadm và Kubernetes yêu cầu đặc biệt chú ý khi nâng cấp.Để biết thêm thông tin về chênh lệch phiên bản, xem:
- Chính sách về phiên bản và chênh lệch phiên bản của Kubernetes
- Chính sách sai lệch phiên bản cụ thể cho kubeadm
apt.kubernetes.io
và yum.kubernetes.io
) đã bị
lỗi thời và đóng băng từ ngày 13 tháng 9, 2023.
Sử dụng các kho lưu trữ mới được đặt tại pkgs.k8s.io
được khuyến nghị mạnh mẽ và yêu cầu để cài đặt các phiên bản Kubernetes phát hành sau ngày 13 tháng 9, 2023.
Các kho cũ đã lỗi thời, và nội dung của chúng, có thể bị xóa bất kỳ lúc nào trong tương lai và mà không có
thêm thông báo. Các kho lưu trữ mới cung cấp tải về cho các phiên bản Kubernetes bắt đầu từ v1.24.0.
Lưu ý:
Có một kho lưu trữ package chuyên dụng cho từng phiên bản minor của Kubernetes. Nếu bạn muốn cài đặt một phiên bản minor khác v1.33, vui lòng xem hướng dẫn cài đặt cho phiên bản minior bạn mong muốn.Hướng dẫn này dành cho Kubernetes v1.33.
-
Cập nhật
apt
package index và cài đặt các package cần thiết để sử dụng kho lưu trữapt
của Kubernetes:sudo apt-get update # apt-transport-https có thể là một package giả; nếu vậy, bạn có thể bỏ qua package này sudo apt-get install -y apt-transport-https ca-certificates curl gpg
-
Tải xuống khóa ký công khai cho các kho lưu trữ package của Kubernetes. Toàn bộ các kho lưu trữ sử dụng chung khóa ký do vậy bạn có thể không cần quan tâm tới phiên bản trong URL:
# Nếu thư mục `/etc/apt/keyrings` không tồn tại, nó nên được tạo trước lệnh curl, đọc chú thích bên dưới. # sudo mkdir -p -m 755 /etc/apt/keyrings curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.33/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
Lưu ý:
Trong những bản phát hành cũ hơn Debian 12 và Ubuntu 22.04, thư mục/etc/apt/keyrings
mặc định không
tồn tại, và nó nên được tạo trước lệnh curl.-
Thêm kho lưu trữ
apt
Kubernetes thích hợp. Vui lòng chú ý rằng kho lưu trữ này chỉ chứa những package cho Kubernetes 1.33; đối với các phiên bản Kubernetes minor khác, bạn cần phải thay đổi phiên bản Kubernetes minor trong URL để trùng với phiên bản minor bạn mong muốn (bạn cũng nên kiểm tra lại rằng bạn đang đọc tài liệu cho phiên bản Kubernetes mà bạn dự định cài đặt).# Điều này sẽ ghi đè bất kỳ những cấu hình nào đang có trong /etc/apt/sources.list.d/kubernetes.list echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.33/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
-
Cập nhật
apt
package index, cài đặt kubelet, kubeadm và kubectl, và ghim lại phiên bản của chúng:sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl
-
(Tùy chọn) Bật dịch vụ kubelet trước khi chạy kubeadm:
sudo systemctl enable --now kubelet
-
Đặt SELinux thành chế độ
permissive
:Những hướng dẫn này dành cho Kubernetes 1.33.
# Đặt SELinux trong chế độ permissive (vô hiệu hóa nó một cách hiệu quả) sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
Chú ý:
- Đặt SELinux trong chế độ permissive bằng cách chạy
setenforce 0
vàsed ...
vô hiệu hóa nó một cách hiệu quả. Điều này là bắt buộc để cho phép các container truy cập vào hệ thống file của máy chủ; ví dụ, một vài network plugin của cụm yêu cầu điều này. Bạn phải làm điều này cho đến khi sự hỗ trợ SELinux được cải thiện trong kubelet. - Bạn có thể để SELinux bật nếu bạn biết cách cấu hình nó nhưng điều đó có thể yêu cầu các thiết lập không được hỗ trợ bởi kubeadm.
-
Thêm kho lưu trữ
yum
của Kubernetes. Tham sốexclude
trong định nghĩa kho lưu trữ đảm bảo rằng các package liên quan tới Kubernetes không được nâng cấp bởi việc chạyyum update
vì có một quy trình đặc biệt cần tuân theo để nâng cấp Kubernetes. Vui lòng chú ý rằng kho lưu trữ này chỉ có các package cho Kubernetes 1.33; đối với những phiên bản Kubernetes minor khác, bạn cần phải thay đổi phiên bản Kubernetes minor trong URL để trùng với phiên bản minor bạn mong muốn (bạn cũng nên kiểm tra lại rằng bạn đang đọc tài liệu cho phiên bản Kubernetes mà bạn dự định cài đặt).# Điều này sẽ ghi đè bất kỳ những cấu hình nào đang có trong /etc/yum.repos.d/kubernetes.repo cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/ enabled=1 gpgcheck=1 gpgkey=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/repodata/repomd.xml.key exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni EOF
-
Cài đặt kubelet, kubeadm và kubectl:
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
-
(Tùy chọn) Bật dịch vụ kubelet trước khi chạy kubeadm:
sudo systemctl enable --now kubelet
Cài đặt CNI plugin (yêu cầu đối với hầu hết pod network):
CNI_PLUGINS_VERSION="v1.3.0"
ARCH="amd64"
DEST="/opt/cni/bin"
sudo mkdir -p "$DEST"
curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_PLUGINS_VERSION}/cni-plugins-linux-${ARCH}-${CNI_PLUGINS_VERSION}.tgz" | sudo tar -C "$DEST" -xz
Tạo thư mục để tải xuống file lệnh:
Lưu ý:
BiếnDOWNLOAD_DIR
phải được đặt tới một thư mục có thể ghi.
Nếu bạn đang chạy Flatcar Container Linux, đặt DOWNLOAD_DIR="/opt/bin"
.DOWNLOAD_DIR="/usr/local/bin"
sudo mkdir -p "$DOWNLOAD_DIR"
Tùy chọn cài đặt crictl (yêu cầu khi tương tác với Container Runtime Interface (CRI), không bắt buộc cho kubeadm):
CRICTL_VERSION="v1.31.0"
ARCH="amd64"
curl -L "https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-${ARCH}.tar.gz" | sudo tar -C $DOWNLOAD_DIR -xz
Cài đặt kubeadm
, kubelet
và thêm systemd service cho kubelet
:
RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)"
ARCH="amd64"
cd $DOWNLOAD_DIR
sudo curl -L --remote-name-all https://dl.k8s.io/release/${RELEASE}/bin/linux/${ARCH}/{kubeadm,kubelet}
sudo chmod +x {kubeadm,kubelet}
RELEASE_VERSION="v0.16.2"
curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/krel/templates/latest/kubelet/kubelet.service" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /usr/lib/systemd/system/kubelet.service
sudo mkdir -p /usr/lib/systemd/system/kubelet.service.d
curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/krel/templates/latest/kubeadm/10-kubeadm.conf" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
Lưu ý:
Vui lòng tham khảo ghi chú trong phần Trước khi bạn bắt đầu cho các bản phân phối Linux mà mặc định không cóglibc
.Cài đặt kubectl
bằng cách làm theo các hướng dẫn trên trang Cài đặt các công cụ.
Một cách tùy chọn, bật dịch vụ kubelet trước khi chạy kubeadm:
sudo systemctl enable --now kubelet
Lưu ý:
Bản phân phối Linux Flatcar Container gắn thư mục/usr
thành một hệ thống file chỉ đọc.
Xem hướng dẫn Khắc phục sự cố Kubeadm
để biết cách thiết lập một thư mục có thể ghi.Bây giờ kubelet khởi động sau mỗi vài giây, vì nó đợi trong vòng lặp crashloop chờ kubeadm bảo nó phải làm gì.
Cấu hình cgroup driver
Cả container runtime và kubelet có một thuộc tính gọi là "cgroup driver", cái mà quan trọng cho việc quản lý các cgroup trên các máy Linux.
Cảnh báo:
Hợp nhất các cgroup driver của container runtime và kubelet là bắt buộc hoặc nếu không thì tiến trình kubelet sẽ lỗi.
Xem Cấu hình cgroup driver để biết thêm chi tiết.
Khắc phục sự cố
Nếu bạn đang gặp các khó khăn với kubeadm, vui lòng tham khảo tài liệu khắc phục sự cố của chúng tôi.
Tiếp theo là gì
2 - Thiết lập một cụm etcd có tính Sẵn sàng cao (High Availability) với kubeadm
Mặc định, kubeadm chạy một instance etcd cục bộ trên từng node control plane. Bạn cũng có thể thiết lập cụm etcd bên ngoài và cung cấp các etcd instance trên các máy chủ riêng biệt. Những sự khác biệt giữa hai cách tiếp cận này được trình bày trong trang Các tùy chọn cho kiến trúc có tính Sẵn sàng cao.
Tác vụ này hướng dẫn quy trình tạo một cụm etcd bên ngoài có tính sẵn sàng cao gồm ba member mà kubeadm có thể sử dụng trong quá trình tạo cụm.
Trước khi bạn bắt đầu
- Ba máy chủ có thể giao tiếp với nhau qua cổng TCP 2379 và 2380. Tài liệu này giả định các cổng mặc định này. Tuy nhiên, chúng có thể được cấu hình thông qua tệp cấu hình kubeadm.
- Mỗi máy chủ phải có systemd và đã cài đặt một shell tương thích với bash.
- Mỗi máy chủ phải đã cài đặt một container runtime, kubelet, và kubeadm.
- Mỗi máy chủ phải có quyền truy cập vào Kubernetes container image registry (
registry.k8s.io
) hoặc list/pull image etcd cần thiết bằng lệnhkubeadm config images list/pull
. Hướng dẫn này sẽ cài đặt các etcd instance dạng static pods được quản lý bởi kubelet. - Một số công cụ để sao chép các file giữa các máy chủ. Ví dụ
ssh
vàscp
có thể đáp ứng yêu cầu này.
Thiết lập cụm
Cách tiếp cận thông thường là tạo ra toàn bộ chứng chỉ trên một node và chỉ phân bổ những file quan trọng tới các node khác.
Lưu ý:
kubeadm chứa tất cả các công cụ mã hóa cần thiết để tạo ra các chứng chỉ được đề cập bên dưới; không cần các công cụ mã hóa nào khác cho ví dụ này.Lưu ý:
Ví dụ bên dưới sử dụng dịa chỉ IPv4 nhưng bạn cũng có thể cấu hình kubeadm, kubelet và etcd sử dụng địa chỉ IPv6. Dual-stack được hỗ trợ bởi một vài tùy chọn của Kubernetes, nhưng không được etcd hỗ trợ. Xem thêm chi tiết về Kubernetes hỗ trợ dual-stack tại Hỗ trợ Dual-stack với kubeadm.-
Cấu hình kubelet để trở thành trình quản lý dịch vụ cho etcd.
Vì etcd sẽ được tạo ra trước tiên, bạn phải ghi đè độ ưu tiên dịch vụ bằng cách tạo ra một unit file mới có độ ưu tiên cao hơn kubelet unit file mà kubeadm cung cấp.Lưu ý:
Bạn phải thực hiện điều này trên toàn bộ các máy chủ chạy etcd.cat << EOF > /etc/systemd/system/kubelet.service.d/kubelet.conf # Thay thế "systemd" bằng giá trị cgroup driver của container runtime của bạn. Giá trị mặc định trong kubelet là "cgroupfs". # Thay thế giá trị của "containerRuntimeEndpoint" bằng một container runtime khác nếu cần. # apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration authentication: anonymous: enabled: false webhook: enabled: false authorization: mode: AlwaysAllow cgroupDriver: systemd address: 127.0.0.1 containerRuntimeEndpoint: unix:///var/run/containerd/containerd.sock staticPodPath: /etc/kubernetes/manifests EOF cat << EOF > /etc/systemd/system/kubelet.service.d/20-etcd-service-manager.conf [Service] ExecStart= ExecStart=/usr/bin/kubelet --config=/etc/systemd/system/kubelet.service.d/kubelet.conf Restart=always EOF systemctl daemon-reload systemctl restart kubelet
Kiểm tra trạng thái kubelet để chắc chắn rằng nó đang chạy.
systemctl status kubelet
-
Tạo các file cấu hình cho kubeadm.
Tạo một file cấu hình kubeadm cho từng máy chủ mà có etcd member chạy trên đó sử dụng tập lệnh dưới đây.
# Thay đổi HOST0, HOST1 và HOST2 với các IP của các máy của bạn export HOST0=10.0.0.6 export HOST1=10.0.0.7 export HOST2=10.0.0.8 # Thay đổi NAME0, NAME1 và NAME2 bằng hostnames của các máy của bạn export NAME0="infra0" export NAME1="infra1" export NAME2="infra2" # Tạo các thư mục tạm thời để lưu các file sẽ xuất hỉện trên các máy khác mkdir -p /tmp/${HOST0}/ /tmp/${HOST1}/ /tmp/${HOST2}/ HOSTS=(${HOST0} ${HOST1} ${HOST2}) NAMES=(${NAME0} ${NAME1} ${NAME2}) for i in "${!HOSTS[@]}"; do HOST=${HOSTS[$i]} NAME=${NAMES[$i]} cat << EOF > /tmp/${HOST}/kubeadmcfg.yaml --- apiVersion: "kubeadm.k8s.io/v1beta4" kind: InitConfiguration nodeRegistration: name: ${NAME} localAPIEndpoint: advertiseAddress: ${HOST} --- apiVersion: "kubeadm.k8s.io/v1beta4" kind: ClusterConfiguration etcd: local: serverCertSANs: - "${HOST}" peerCertSANs: - "${HOST}" extraArgs: - name: initial-cluster value: ${NAMES[0]}=https://${HOSTS[0]}:2380,${NAMES[1]}=https://${HOSTS[1]}:2380,${NAMES[2]}=https://${HOSTS[2]}:2380 - name: initial-cluster-state value: new - name: name value: ${NAME} - name: listen-peer-urls value: https://${HOST}:2380 - name: listen-client-urls value: https://${HOST}:2379 - name: advertise-client-urls value: https://${HOST}:2379 - name: initial-advertise-peer-urls value: https://${HOST}:2380 EOF done
-
Tạo cơ quan cấp chứng chỉ (CA).
Nếu bạn đã có một CA, việc tiếp theo chỉ cần sao chép các file
crt
vàkey
của CA tới/etc/kubernetes/pki/etcd/ca.crt
và/etc/kubernetes/pki/etcd/ca.key
. Sau khi các file đó được sao chép, tiến hành các bước tiếp theo, "Tạo các chứng chỉ cho từng member member".Nếu bạn chưa có CA nào, hãy chạy câu lệnh này trên
$HOST0
(nơi bạn tạo các file cấu hình cho kubeadm).kubeadm init phase certs etcd-ca
Nó sẽ tạo ra hai file:
/etc/kubernetes/pki/etcd/ca.crt
/etc/kubernetes/pki/etcd/ca.key
-
Tạo các chứng chỉ cho từng member member.
kubeadm init phase certs etcd-server --config=/tmp/${HOST2}/kubeadmcfg.yaml kubeadm init phase certs etcd-peer --config=/tmp/${HOST2}/kubeadmcfg.yaml kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST2}/kubeadmcfg.yaml kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST2}/kubeadmcfg.yaml cp -R /etc/kubernetes/pki /tmp/${HOST2}/ # Dọn dẹp các chứng chỉ không sử dụng find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete kubeadm init phase certs etcd-server --config=/tmp/${HOST1}/kubeadmcfg.yaml kubeadm init phase certs etcd-peer --config=/tmp/${HOST1}/kubeadmcfg.yaml kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST1}/kubeadmcfg.yaml kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST1}/kubeadmcfg.yaml cp -R /etc/kubernetes/pki /tmp/${HOST1}/ find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete kubeadm init phase certs etcd-server --config=/tmp/${HOST0}/kubeadmcfg.yaml kubeadm init phase certs etcd-peer --config=/tmp/${HOST0}/kubeadmcfg.yaml kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST0}/kubeadmcfg.yaml kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST0}/kubeadmcfg.yaml # Không cần phải di chuyển các chứng chỉ vì chúng dành cho HOST0 # Dọn dẹp các chứng chỉ không nên sao chép khỏi máy chủ này find /tmp/${HOST2} -name ca.key -type f -delete find /tmp/${HOST1} -name ca.key -type f -delete
-
Sao chép các chứng chỉ và các cấu hình kubeadm.
Các chứng chỉ này đã được tạo ra và bây giờ chúng cần được đưa tới từng máy chủ tương ứng.
USER=ubuntu HOST=${HOST1} scp -r /tmp/${HOST}/* ${USER}@${HOST}: ssh ${USER}@${HOST} USER@HOST $ sudo -Es root@HOST $ chown -R root:root pki root@HOST $ mv pki /etc/kubernetes/
-
Đảm bảo đã có đủ toàn bộ các file cần thiết.
Danh sách đầy đủ các file cần thiết trên
$HOST0
gồm:/tmp/${HOST0} └── kubeadmcfg.yaml --- /etc/kubernetes/pki ├── apiserver-etcd-client.crt ├── apiserver-etcd-client.keyt └── etcd ├── ca.crt ├── ca.key ├── healthcheck-client.crt ├── healthcheck-client.key ├── peer.crt ├── peer.key ├── server.crt └── server.key
Trên
$HOST1
:$HOME └── kubeadmcfg.yaml --- /etc/kubernetes/pki ├── apiserver-etcd-client.crt ├── apiserver-etcd-client.key └── etcd ├── ca.crt ├── healthcheck-client.crt ├── healthcheck-client.key ├── peer.crt ├── peer.key ├── server.crt └── server.key
Trên
$HOST2
:$HOME └── kubeadmcfg.yaml --- /etc/kubernetes/pki ├── apiserver-etcd-client.crt ├── apiserver-etcd-client.key └── etcd ├── ca.crt ├── healthcheck-client.crt ├── healthcheck-client.key ├── peer.crt ├── peer.key ├── server.crt └── server.key
-
Tạo các manifest cho static pod.
Bây giờ các chứng chỉ và cấu hình đã có, đã đến lúc tạo các manifest. Trên mỗi máy chủ, hãy chạy lệnh
kubeadm
để tạo static manifest cho etcd.root@HOST0 $ kubeadm init phase etcd local --config=/tmp/${HOST0}/kubeadmcfg.yaml root@HOST1 $ kubeadm init phase etcd local --config=$HOME/kubeadmcfg.yaml root@HOST2 $ kubeadm init phase etcd local --config=$HOME/kubeadmcfg.yaml
-
Tùy chọn: Kiểm tra sức khỏe cụm.
Nếu
etcdctl
không có sẵn, bạn có thể chạy công cụ này trong một container image. Bạn sẽ thực hiện điều đó trực tiếp với container runtime của mình bằng cách sử dụng một công cụ nhưcrictl run
và không thông qua Kubernetes.ETCDCTL_API=3 etcdctl \ --cert /etc/kubernetes/pki/etcd/peer.crt \ --key /etc/kubernetes/pki/etcd/peer.key \ --cacert /etc/kubernetes/pki/etcd/ca.crt \ --endpoints https://${HOST0}:2379 endpoint health ... https://[HOST0 IP]:2379 is healthy: successfully committed proposal: took = 16.283339ms https://[HOST1 IP]:2379 is healthy: successfully committed proposal: took = 19.44402ms https://[HOST2 IP]:2379 is healthy: successfully committed proposal: took = 35.926451ms
- Đặt
${HOST0}
bằng địa chỉ IP của máy chủ bạn đang kiểm tra.
- Đặt
Tiếp theo là gì
Một khi bạn đã có một cụm etcd với 3 member đang chạy, bạn có thể tiếp tục thiết lập một control plane có tính sẵn sàng cao bằng phương pháp etcd bên ngoài với kubeadm.