Bantu tingkatkan halaman ini
Ingin berkontribusi pada panduan pengguna ini? Gulir ke bagian bawah halaman ini dan pilih Edit halaman ini GitHub. Kontribusi Anda akan membantu membuat panduan pengguna kami lebih baik untuk semua orang.
Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Migrasikan aplikasi ke grup node baru
Topik ini menjelaskan bagaimana Anda dapat membuat grup node baru, dengan anggun memigrasikan aplikasi yang ada ke grup baru, dan menghapus grup node lama dari cluster Anda. Anda dapat bermigrasi ke grup simpul baru menggunakan eksctl
atau AWS Management Console.
- eksctl
-
Untuk memigrasi aplikasi Anda ke grup simpul baru dengan
eksctl
Untuk informasi selengkapnya tentang penggunaan eksctl untuk migrasi, lihat Nodegroup tidak dikelola
dalam dokumentasi. eksctl
Prosedur ini membutuhkan
eksctl
versi0.189.0
atau yang lebih baru. Anda dapat memeriksa versi Anda dengan perintah berikut:eksctl version
Untuk petunjuk tentang cara menginstal atau meningkatkan
eksctl
, lihat Instalasidalam eksctl
dokumentasi.catatan
Prosedur ini hanya bekerja untuk grup klaster dan simpul yang dibuat dengan
eksctl
.-
Ambil nama grup node yang ada, ganti
dengan nama cluster Anda.my-cluster
eksctl get nodegroups --cluster=
my-cluster
Contoh output adalah sebagai berikut.
CLUSTER NODEGROUP CREATED MIN SIZE MAX SIZE DESIRED CAPACITY INSTANCE TYPE IMAGE ID default standard-nodes 2019-05-01T22:26:58Z 1 4 3 t3.medium ami-05a71d034119ffc12
-
Luncurkan grup node baru
eksctl
dengan perintah berikut. Dalam perintah, ganti setiap
dengan nilai-nilai Anda sendiri. Nomor versi tidak boleh lebih lambat dari Kubernetes versi untuk pesawat kontrol Anda. Selain itu, tidak boleh lebih dari dua versi minor lebih awal dari Kubernetes versi untuk pesawat kontrol Anda. Kami menyarankan Anda menggunakan versi yang sama dengan pesawat kontrol Anda.nilai contoh
Kami merekomendasikan memblokir Pod akses ke IMDS jika kondisi berikut benar:
Anda berencana untuk menetapkan IAM peran ke semua akun Kubernetes layanan Anda sehingga Pods hanya memiliki izin minimum yang mereka butuhkan.
Tidak ada Pods di klaster yang memerlukan akses ke layanan metadata EC2 instans Amazon (IMDS) karena alasan lain, seperti mengambil arus. Wilayah AWS
Untuk informasi selengkapnya, lihat Membatasi akses ke profil instance yang ditetapkan ke node pekerja
. Untuk memblokir Pod akses keIMDS, tambahkan
--disable-pod-imds
opsi ke perintah berikut.catatan
Untuk lebih banyak flag yang tersedia dan deskripsinya, lihat https://eksctl.io/
. eksctl create nodegroup \ --cluster
my-cluster
\ --version1.30
\ --namestandard-nodes-new
\ --node-typet3.medium
\ --nodes3
\ --nodes-min1
\ --nodes-max4
\ --managed=false -
Setelah perintah sebelumnya selesai, verifikasi bahwa semua simpul Anda telah mencapai status
Ready
dengan perintah berikut:kubectl get nodes
-
Hapus grup node asli dengan perintah berikut. Dalam perintah, ganti setiap
dengan nama grup cluster dan node Anda:example value
eksctl delete nodegroup --cluster
my-cluster
--namestandard-nodes-old
-
- AWS Management Console and AWS CLI
-
Untuk memigrasikan aplikasi Anda ke grup node baru dengan dan AWS Management ConsoleAWS CLI
-
Luncurkan grup node baru dengan mengikuti langkah-langkah yang diuraikan dalamBuat node Amazon Linux yang dikelola sendiri.
-
Setelah tumpukan Anda selesai dibuat, pilih tumpukan di konsol dan pilih Outputs.
-
Rekam NodeInstanceRoleuntuk grup node yang telah dibuat. Anda memerlukan ini untuk menambahkan EKS node Amazon baru ke cluster Anda.
catatan
Jika Anda melampirkan IAM kebijakan tambahan apa pun ke IAM peran grup node lama Anda, lampirkan kebijakan yang sama tersebut ke IAM peran grup node baru Anda untuk mempertahankan fungsionalitas tersebut pada grup baru. Ini berlaku untuk Anda jika Anda menambahkan izin untuk Kubernetes Cluster Autoscaler
, misalnya. -
Perbarui grup keamanan untuk kedua grup simpul sehingga mereka dapat berkomunikasi satu sama lain. Untuk informasi selengkapnya, lihat Lihat persyaratan grup EKS keamanan Amazon untuk klaster.
-
Rekam grup keamanan IDs untuk kedua grup node. Ini ditampilkan sebagai NodeSecurityGroupnilai dalam output AWS CloudFormation stack.
Anda dapat menggunakan AWS CLI perintah berikut untuk mendapatkan grup keamanan IDs dari nama tumpukan. Dalam perintah ini,
oldNodes
adalah nama AWS CloudFormation tumpukan untuk tumpukan node lama Anda, dannewNodes
merupakan nama tumpukan tempat Anda bermigrasi. Ganti setiap
dengan nilai-nilai Anda sendiri.example value
oldNodes="
old_node_CFN_stack_name
" newNodes="new_node_CFN_stack_name
" oldSecGroup=$(aws cloudformation describe-stack-resources --stack-name $oldNodes \ --query 'StackResources[?ResourceType==`AWS::EC2::SecurityGroup`].PhysicalResourceId' \ --output text) newSecGroup=$(aws cloudformation describe-stack-resources --stack-name $newNodes \ --query 'StackResources[?ResourceType==`AWS::EC2::SecurityGroup`].PhysicalResourceId' \ --output text) -
Tambahkan aturan masuk ke setiap grup keamanan simpul sehingga mereka menerima lalu lintas dari satu sama lain.
AWS CLI Perintah berikut menambahkan aturan masuk ke setiap grup keamanan yang memungkinkan semua lalu lintas pada semua protokol dari grup keamanan lainnya. Konfigurasi ini memungkinkan Pods di setiap grup node untuk berkomunikasi satu sama lain saat Anda memigrasikan beban kerja Anda ke grup baru.
aws ec2 authorize-security-group-ingress --group-id $oldSecGroup \ --source-group $newSecGroup --protocol -1 aws ec2 authorize-security-group-ingress --group-id $newSecGroup \ --source-group $oldSecGroup --protocol -1
-
-
Edit
aws-auth
configmap untuk memetakan peran instance node baru di. RBACkubectl edit configmap -n kube-system aws-auth
Tambahkan entri
mapRoles
baru untuk grup simpul baru. Jika cluster Anda berada di AWS GovCloud (AS-Timur) atau AWS GovCloud (AS-Barat) Wilayah AWS, maka gantiarn:aws:
dengan.arn:aws-us-gov:
apiVersion: v1 data: mapRoles: | - rolearn:
ARN of instance role (not instance profile)
username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes> - rolearn:arn:aws:iam::111122223333:role/nodes-1-16-NodeInstanceRole-U11V27W93CX5
username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodesGanti
cuplikan dengan NodeInstanceRolenilai yang Anda rekam pada langkah sebelumnya. Kemudian, simpan dan tutup file untuk menerapkan configmap yang diperbarui.ARN of instance role (not instance profile)
-
Perhatikan status simpul Anda dan tunggu simpul baru Anda bergabung dengan klaster dan mencapai status
Ready
tersebut.kubectl get nodes --watch
-
(Opsional) Jika Anda menggunakan Kubernetes Cluster Autoscaler
, skala penerapan ke nol (0) replika untuk menghindari tindakan penskalaan yang bertentangan. kubectl scale deployments/cluster-autoscaler --replicas=0 -n kube-system
-
Gunakan perintah berikut untuk mencemari setiap node yang ingin Anda hapus.
NoSchedule
Ini agar yang baru Pods tidak dijadwalkan atau dijadwal ulang pada node yang Anda ganti. Untuk informasi selengkapnya, lihat Taints and Tolerationsdalam dokumentasi. Kubernetes kubectl taint nodes
node_name
key=value:NoScheduleJika Anda memutakhirkan node ke Kubernetes versi baru, Anda dapat mengidentifikasi dan mencemari semua node dari Kubernetes versi tertentu (dalam hal ini,
1.28
) dengan cuplikan kode berikut. Nomor versi tidak boleh lebih lambat dari Kubernetes versi pesawat kontrol Anda. Ini juga tidak boleh lebih dari dua versi minor lebih awal dari Kubernetes versi pesawat kontrol Anda. Kami menyarankan Anda menggunakan versi yang sama dengan pesawat kontrol Anda.K8S_VERSION=
1.28
nodes=$(kubectl get nodes -o jsonpath="{.items[?(@.status.nodeInfo.kubeletVersion==\"v$K8S_VERSION\")].metadata.name}") for node in ${nodes[@]} do echo "Tainting $node" kubectl taint nodes $node key=value:NoSchedule done -
Tentukan DNS penyedia klaster Anda.
kubectl get deployments -l k8s-app=kube-dns -n kube-system
Contoh output adalah sebagai berikut. Cluster ini digunakan CoreDNS untuk DNS resolusi, tetapi cluster Anda dapat kembali
kube-dns
sebagai gantinya):NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE coredns 1 1 1 1
31m
-
Jika deployment Anda saat ini berjalan kurang dari dua replika, skalakan deployment menjadi dua replika. Ganti
dengancoredns
jika output perintah Anda sebelumnya mengembalikannya.kubedns
kubectl scale deployments/
coredns
--replicas=2 -n kube-system -
Keluarkan setiap simpul yang Anda ingin hapus dari klaster Anda dengan perintah berikut:
kubectl drain
node_name
--ignore-daemonsets --delete-local-dataJika Anda memutakhirkan node ke Kubernetes versi baru, identifikasi dan tiriskan semua node dari Kubernetes versi tertentu (dalam hal ini,
) dengan cuplikan kode berikut.1.28
K8S_VERSION=
1.28
nodes=$(kubectl get nodes -o jsonpath="{.items[?(@.status.nodeInfo.kubeletVersion==\"v$K8S_VERSION\")].metadata.name}") for node in ${nodes[@]} do echo "Draining $node" kubectl drain $node --ignore-daemonsets --delete-local-data done -
Setelah node lama Anda selesai menguras, cabut aturan masuk grup keamanan yang Anda otorisasi sebelumnya. Kemudian, hapus AWS CloudFormation tumpukan untuk mengakhiri instance.
catatan
Jika Anda melampirkan IAM kebijakan tambahan apa pun ke IAM peran grup node lama Anda, seperti menambahkan izin untuk Penskalaan Otomatis Kubernetes Cluster
), lepaskan kebijakan tambahan tersebut dari peran tersebut sebelum Anda dapat menghapus tumpukan. AWS CloudFormation -
Cabut aturan masuk yang Anda buat untuk grup keamanan node Anda sebelumnya. Dalam perintah ini,
oldNodes
adalah nama AWS CloudFormation tumpukan untuk tumpukan node lama Anda, dannewNodes
merupakan nama tumpukan tempat Anda bermigrasi.oldNodes="
old_node_CFN_stack_name
" newNodes="new_node_CFN_stack_name
" oldSecGroup=$(aws cloudformation describe-stack-resources --stack-name $oldNodes \ --query 'StackResources[?ResourceType==`AWS::EC2::SecurityGroup`].PhysicalResourceId' \ --output text) newSecGroup=$(aws cloudformation describe-stack-resources --stack-name $newNodes \ --query 'StackResources[?ResourceType==`AWS::EC2::SecurityGroup`].PhysicalResourceId' \ --output text) aws ec2 revoke-security-group-ingress --group-id $oldSecGroup \ --source-group $newSecGroup --protocol -1 aws ec2 revoke-security-group-ingress --group-id $newSecGroup \ --source-group $oldSecGroup --protocol -1 Buka AWS CloudFormation konsol di https://console.aws.amazon.com/cloudformation
. -
Pilih tumpukan simpul lama Anda.
-
Pilih Hapus.
-
Di kotak dialog Hapus tumpukan konfirmasi, pilih Hapus tumpukan.
-
-
Edit
aws-auth
configmap untuk menghapus peran instance node lama dari. RBACkubectl edit configmap -n kube-system aws-auth
Hapus
mapRoles
entri untuk grup simpul lama. Jika cluster Anda berada di AWS GovCloud (AS-Timur) atau AWS GovCloud (AS-Barat) Wilayah AWS, maka gantiarn:aws:
dengan.arn:aws-us-gov:
apiVersion: v1 data: mapRoles: | - rolearn:
arn:aws:iam::111122223333:role/nodes-1-16-NodeInstanceRole-W70725MZQFF8
username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes - rolearn:arn:aws:iam::111122223333:role/nodes-1-15-NodeInstanceRole-U11V27W93CX5
username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes>Simpan dan tutup file untuk menerapkan configmap yang diperbarui.
-
(Opsional) Jika Anda menggunakan Kubernetes Cluster Autoscaler
, skala penerapan kembali ke satu replika. catatan
Anda juga harus menandai grup Auto Scaling baru Anda dengan tepat (misalnya,
k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/
) dan memperbarui perintah untuk penerapan Cluster Autoscaler Anda untuk menunjuk ke grup Auto Scaling yang baru ditandai. Untuk informasi selengkapnya, lihat Cluster Autoscalermy-cluster
di. AWS kubectl scale deployments/cluster-autoscaler --replicas=1 -n kube-system
-
(Opsional) Verifikasi bahwa Anda menggunakan versi terbaru dari VPCCNIplugin Amazon untuk Kubernetes
. Anda mungkin perlu memperbarui CNI versi untuk menggunakan jenis instans terbaru yang didukung. Untuk informasi selengkapnya, lihat Tetapkan IPs ke Pods dengan Amazon VPC CNI. -
Jika klaster Anda menggunakan
kube-dns
DNS resolusi (lihat langkah sebelumnya), skalakankube-dns
penerapan ke satu replika.kubectl scale deployments/kube-dns --replicas=1 -n kube-system
-