|
| 1 | +--- |
| 2 | +reviewers: |
| 3 | +- sig-cluster-lifecycle |
| 4 | +title: Thiết lập một cụm etcd có tính Sẵn sàng cao (High Availability) với kubeadm |
| 5 | +content_type: task |
| 6 | +weight: 70 |
| 7 | +--- |
| 8 | + |
| 9 | +<!-- overview --> |
| 10 | + |
| 11 | + |
| 12 | +Mặc định, kubeadm chạy một instance etcd cục bộ trên từng node control plane. |
| 13 | +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 |
| 14 | +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 |
| 15 | +trong trang |
| 16 | +[Các tùy chọn cho kiến trúc có tính Sẵn sàng cao](/docs/setup/production-environment/tools/kubeadm/ha-topology). |
| 17 | + |
| 18 | +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 |
| 19 | +ba member mà kubeadm có thể sử dụng trong quá trình tạo cụm. |
| 20 | + |
| 21 | +## {{% heading "prerequisites" %}} |
| 22 | + |
| 23 | +- Ba máy chủ có thể giao tiếp với nhau qua cổng TCP 2379 và 2380. |
| 24 | + 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 |
| 25 | + thông qua tệp cấu hình kubeadm. |
| 26 | +- Mỗi máy chủ phải có systemd và đã cài đặt một shell tương thích với bash. |
| 27 | +- Mỗi máy chủ phải |
| 28 | + [đã cài đặt một container runtime, kubelet, và kubeadm](/docs/setup/production-environment/tools/kubeadm/install-kubeadm/). |
| 29 | +- Mỗi máy chủ phải có quyền truy cập vào Kubernetes container image registry (`registry.k8s.io`) |
| 30 | + hoặc list/pull image etcd cần thiết bằng lệnh `kubeadm config images list/pull`. Hướng dẫn này |
| 31 | + sẽ cài đặt các etcd instance dạng |
| 32 | + [static pods](/docs/tasks/configure-pod-container/static-pod/) được quản lý bởi kubelet. |
| 33 | +- Một số công cụ để sao chép các file giữa các máy chủ. Ví dụ `ssh` và `scp` |
| 34 | + có thể đáp ứng yêu cầu này. |
| 35 | + |
| 36 | +<!-- steps --> |
| 37 | + |
| 38 | +## Thiết lập cụm |
| 39 | + |
| 40 | +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ổ |
| 41 | +những file _quan trọng_ tới các node khác. |
| 42 | + |
| 43 | +{{< note >}} |
| 44 | +kubeadm chứa tất cả các công cụ mã hóa cần thiết để tạo ra |
| 45 | +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. |
| 46 | +{{< /note >}} |
| 47 | + |
| 48 | +{{< note >}} |
| 49 | +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 |
| 50 | +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 |
| 51 | +không được etcd hỗ trợ. Xem thêm chi tiết về Kubernetes hỗ trợ dual-stack tại |
| 52 | +[Hỗ trợ Dual-stack với kubeadm](/docs/setup/production-environment/tools/kubeadm/dual-stack-support/). |
| 53 | +{{< /note >}} |
| 54 | + |
| 55 | +1. Cấu hình kubelet để trở thành trình quản lý dịch vụ cho etcd. |
| 56 | + |
| 57 | + {{< note >}}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.{{< /note >}} |
| 58 | + 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 |
| 59 | + unit file mới có độ ưu tiên cao hơn kubelet unit file mà kubeadm cung cấp. |
| 60 | + |
| 61 | + ```sh |
| 62 | + cat << EOF > /etc/systemd/system/kubelet.service.d/kubelet.conf |
| 63 | + # 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". |
| 64 | + # Thay thế giá trị của "containerRuntimeEndpoint" bằng một container runtime khác nếu cần. |
| 65 | + # |
| 66 | + apiVersion: kubelet.config.k8s.io/v1beta1 |
| 67 | + kind: KubeletConfiguration |
| 68 | + authentication: |
| 69 | + anonymous: |
| 70 | + enabled: false |
| 71 | + webhook: |
| 72 | + enabled: false |
| 73 | + authorization: |
| 74 | + mode: AlwaysAllow |
| 75 | + cgroupDriver: systemd |
| 76 | + address: 127.0.0.1 |
| 77 | + containerRuntimeEndpoint: unix:///var/run/containerd/containerd.sock |
| 78 | + staticPodPath: /etc/kubernetes/manifests |
| 79 | + EOF |
| 80 | +
|
| 81 | + cat << EOF > /etc/systemd/system/kubelet.service.d/20-etcd-service-manager.conf |
| 82 | + [Service] |
| 83 | + ExecStart= |
| 84 | + ExecStart=/usr/bin/kubelet --config=/etc/systemd/system/kubelet.service.d/kubelet.conf |
| 85 | + Restart=always |
| 86 | + EOF |
| 87 | +
|
| 88 | + systemctl daemon-reload |
| 89 | + systemctl restart kubelet |
| 90 | + ``` |
| 91 | +
|
| 92 | + Kiểm tra trạng thái kubelet để chắc chắn rằng nó đang chạy. |
| 93 | +
|
| 94 | + ```sh |
| 95 | + systemctl status kubelet |
| 96 | + ``` |
| 97 | +
|
| 98 | +1. Tạo các file cấu hình cho kubeadm. |
| 99 | +
|
| 100 | + Tạo một file cấu hình kubeadm cho từng máy chủ mà có etcd member chạy trên đó |
| 101 | + sử dụng tập lệnh dưới đây. |
| 102 | +
|
| 103 | + ```sh |
| 104 | + # Thay đổi HOST0, HOST1 và HOST2 với các IP của các máy của bạn |
| 105 | + export HOST0=10.0.0.6 |
| 106 | + export HOST1=10.0.0.7 |
| 107 | + export HOST2=10.0.0.8 |
| 108 | +
|
| 109 | + # Thay đổi NAME0, NAME1 và NAME2 bằng hostnames của các máy của bạn |
| 110 | + export NAME0="infra0" |
| 111 | + export NAME1="infra1" |
| 112 | + export NAME2="infra2" |
| 113 | +
|
| 114 | + # 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 |
| 115 | + mkdir -p /tmp/${HOST0}/ /tmp/${HOST1}/ /tmp/${HOST2}/ |
| 116 | +
|
| 117 | + HOSTS=(${HOST0} ${HOST1} ${HOST2}) |
| 118 | + NAMES=(${NAME0} ${NAME1} ${NAME2}) |
| 119 | +
|
| 120 | + for i in "${!HOSTS[@]}"; do |
| 121 | + HOST=${HOSTS[$i]} |
| 122 | + NAME=${NAMES[$i]} |
| 123 | + cat << EOF > /tmp/${HOST}/kubeadmcfg.yaml |
| 124 | + --- |
| 125 | + apiVersion: "kubeadm.k8s.io/v1beta4" |
| 126 | + kind: InitConfiguration |
| 127 | + nodeRegistration: |
| 128 | + name: ${NAME} |
| 129 | + localAPIEndpoint: |
| 130 | + advertiseAddress: ${HOST} |
| 131 | + --- |
| 132 | + apiVersion: "kubeadm.k8s.io/v1beta4" |
| 133 | + kind: ClusterConfiguration |
| 134 | + etcd: |
| 135 | + local: |
| 136 | + serverCertSANs: |
| 137 | + - "${HOST}" |
| 138 | + peerCertSANs: |
| 139 | + - "${HOST}" |
| 140 | + extraArgs: |
| 141 | + - name: initial-cluster |
| 142 | + value: ${NAMES[0]}=https://${HOSTS[0]}:2380,${NAMES[1]}=https://${HOSTS[1]}:2380,${NAMES[2]}=https://${HOSTS[2]}:2380 |
| 143 | + - name: initial-cluster-state |
| 144 | + value: new |
| 145 | + - name: name |
| 146 | + value: ${NAME} |
| 147 | + - name: listen-peer-urls |
| 148 | + value: https://${HOST}:2380 |
| 149 | + - name: listen-client-urls |
| 150 | + value: https://${HOST}:2379 |
| 151 | + - name: advertise-client-urls |
| 152 | + value: https://${HOST}:2379 |
| 153 | + - name: initial-advertise-peer-urls |
| 154 | + value: https://${HOST}:2380 |
| 155 | + EOF |
| 156 | + done |
| 157 | + ``` |
| 158 | +
|
| 159 | +1. Tạo cơ quan cấp chứng chỉ (CA). |
| 160 | +
|
| 161 | + Nếu bạn đã có một CA, việc tiếp theo chỉ cần sao chép các file `crt` và |
| 162 | + `key` của CA tới `/etc/kubernetes/pki/etcd/ca.crt` và |
| 163 | + `/etc/kubernetes/pki/etcd/ca.key`. Sau khi các file đó được sao chép, |
| 164 | + tiến hành các bước tiếp theo, "Tạo các chứng chỉ cho từng member member". |
| 165 | +
|
| 166 | + 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 |
| 167 | + tạo các file cấu hình cho kubeadm). |
| 168 | +
|
| 169 | + ``` |
| 170 | + kubeadm init phase certs etcd-ca |
| 171 | + ``` |
| 172 | +
|
| 173 | + Nó sẽ tạo ra hai file: |
| 174 | +
|
| 175 | + - `/etc/kubernetes/pki/etcd/ca.crt` |
| 176 | + - `/etc/kubernetes/pki/etcd/ca.key` |
| 177 | +
|
| 178 | +1. Tạo các chứng chỉ cho từng member member. |
| 179 | +
|
| 180 | + ```sh |
| 181 | + kubeadm init phase certs etcd-server --config=/tmp/${HOST2}/kubeadmcfg.yaml |
| 182 | + kubeadm init phase certs etcd-peer --config=/tmp/${HOST2}/kubeadmcfg.yaml |
| 183 | + kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST2}/kubeadmcfg.yaml |
| 184 | + kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST2}/kubeadmcfg.yaml |
| 185 | + cp -R /etc/kubernetes/pki /tmp/${HOST2}/ |
| 186 | + # Dọn dẹp các chứng chỉ không sử dụng |
| 187 | + find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete |
| 188 | +
|
| 189 | + kubeadm init phase certs etcd-server --config=/tmp/${HOST1}/kubeadmcfg.yaml |
| 190 | + kubeadm init phase certs etcd-peer --config=/tmp/${HOST1}/kubeadmcfg.yaml |
| 191 | + kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST1}/kubeadmcfg.yaml |
| 192 | + kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST1}/kubeadmcfg.yaml |
| 193 | + cp -R /etc/kubernetes/pki /tmp/${HOST1}/ |
| 194 | + find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete |
| 195 | +
|
| 196 | + kubeadm init phase certs etcd-server --config=/tmp/${HOST0}/kubeadmcfg.yaml |
| 197 | + kubeadm init phase certs etcd-peer --config=/tmp/${HOST0}/kubeadmcfg.yaml |
| 198 | + kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST0}/kubeadmcfg.yaml |
| 199 | + kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST0}/kubeadmcfg.yaml |
| 200 | + # Không cần phải di chuyển các chứng chỉ vì chúng dành cho HOST0 |
| 201 | +
|
| 202 | + # Dọn dẹp các chứng chỉ không nên sao chép khỏi máy chủ này |
| 203 | + find /tmp/${HOST2} -name ca.key -type f -delete |
| 204 | + find /tmp/${HOST1} -name ca.key -type f -delete |
| 205 | + ``` |
| 206 | +
|
| 207 | +1. Sao chép các chứng chỉ và các cấu hình kubeadm. |
| 208 | +
|
| 209 | + 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ủ |
| 210 | + tương ứng. |
| 211 | +
|
| 212 | + ```sh |
| 213 | + USER=ubuntu |
| 214 | + HOST=${HOST1} |
| 215 | + scp -r /tmp/${HOST}/* ${USER}@${HOST}: |
| 216 | + ssh ${USER}@${HOST} |
| 217 | + USER@HOST $ sudo -Es |
| 218 | + root@HOST $ chown -R root:root pki |
| 219 | + root@HOST $ mv pki /etc/kubernetes/ |
| 220 | + ``` |
| 221 | +
|
| 222 | +1. Đảm bảo đã có đủ toàn bộ các file cần thiết. |
| 223 | +
|
| 224 | + Danh sách đầy đủ các file cần thiết trên `$HOST0` gồm: |
| 225 | +
|
| 226 | + ``` |
| 227 | + /tmp/${HOST0} |
| 228 | + └── kubeadmcfg.yaml |
| 229 | + --- |
| 230 | + /etc/kubernetes/pki |
| 231 | + ├── apiserver-etcd-client.crt |
| 232 | + ├── apiserver-etcd-client.keyt |
| 233 | + └── etcd |
| 234 | + ├── ca.crt |
| 235 | + ├── ca.key |
| 236 | + ├── healthcheck-client.crt |
| 237 | + ├── healthcheck-client.key |
| 238 | + ├── peer.crt |
| 239 | + ├── peer.key |
| 240 | + ├── server.crt |
| 241 | + └── server.key |
| 242 | + ``` |
| 243 | +
|
| 244 | + Trên `$HOST1`: |
| 245 | +
|
| 246 | + ``` |
| 247 | + $HOME |
| 248 | + └── kubeadmcfg.yaml |
| 249 | + --- |
| 250 | + /etc/kubernetes/pki |
| 251 | + ├── apiserver-etcd-client.crt |
| 252 | + ├── apiserver-etcd-client.key |
| 253 | + └── etcd |
| 254 | + ├── ca.crt |
| 255 | + ├── healthcheck-client.crt |
| 256 | + ├── healthcheck-client.key |
| 257 | + ├── peer.crt |
| 258 | + ├── peer.key |
| 259 | + ├── server.crt |
| 260 | + └── server.key |
| 261 | + ``` |
| 262 | +
|
| 263 | + Trên `$HOST2`: |
| 264 | +
|
| 265 | + ``` |
| 266 | + $HOME |
| 267 | + └── kubeadmcfg.yaml |
| 268 | + --- |
| 269 | + /etc/kubernetes/pki |
| 270 | + ├── apiserver-etcd-client.crt |
| 271 | + ├── apiserver-etcd-client.key |
| 272 | + └── etcd |
| 273 | + ├── ca.crt |
| 274 | + ├── healthcheck-client.crt |
| 275 | + ├── healthcheck-client.key |
| 276 | + ├── peer.crt |
| 277 | + ├── peer.key |
| 278 | + ├── server.crt |
| 279 | + └── server.key |
| 280 | + ``` |
| 281 | +
|
| 282 | +1. Tạo các manifest cho static pod. |
| 283 | +
|
| 284 | + Bây giờ các chứng chỉ và cấu hình đã có, đã đến lúc tạo các manifest. |
| 285 | + Trên mỗi máy chủ, hãy chạy lệnh `kubeadm` để tạo static manifest |
| 286 | + cho etcd. |
| 287 | +
|
| 288 | + ```sh |
| 289 | + root@HOST0 $ kubeadm init phase etcd local --config=/tmp/${HOST0}/kubeadmcfg.yaml |
| 290 | + root@HOST1 $ kubeadm init phase etcd local --config=$HOME/kubeadmcfg.yaml |
| 291 | + root@HOST2 $ kubeadm init phase etcd local --config=$HOME/kubeadmcfg.yaml |
| 292 | + ``` |
| 293 | +
|
| 294 | +1. Tùy chọn: Kiểm tra sức khỏe cụm. |
| 295 | +
|
| 296 | + Nếu `etcdctl` không có sẵn, bạn có thể chạy công cụ này trong một container image. |
| 297 | + 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 |
| 298 | + một công cụ như `crictl run` và không thông qua Kubernetes. |
| 299 | +
|
| 300 | + ```sh |
| 301 | + ETCDCTL_API=3 etcdctl \ |
| 302 | + --cert /etc/kubernetes/pki/etcd/peer.crt \ |
| 303 | + --key /etc/kubernetes/pki/etcd/peer.key \ |
| 304 | + --cacert /etc/kubernetes/pki/etcd/ca.crt \ |
| 305 | + --endpoints https://${HOST0}:2379 endpoint health |
| 306 | + ... |
| 307 | + https://[HOST0 IP]:2379 is healthy: successfully committed proposal: took = 16.283339ms |
| 308 | + https://[HOST1 IP]:2379 is healthy: successfully committed proposal: took = 19.44402ms |
| 309 | + https://[HOST2 IP]:2379 is healthy: successfully committed proposal: took = 35.926451ms |
| 310 | + ``` |
| 311 | +
|
| 312 | + - Đặt `${HOST0}` bằng địa chỉ IP của máy chủ bạn đang kiểm tra. |
| 313 | +
|
| 314 | +
|
| 315 | +## {{% heading "whatsnext" %}} |
| 316 | +
|
| 317 | +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 |
| 318 | +một control plane có tính sẵn sàng cao bằng |
| 319 | +[phương pháp etcd bên ngoài với kubeadm](/docs/setup/production-environment/tools/kubeadm/high-availability/). |
0 commit comments