Menggunakan kebijakan grup keamanan untuk Amazon EKS Pod - Amazon EKS

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menggunakan kebijakan grup keamanan untuk Amazon EKS Pod

Untuk menggunakan grup keamanan untuk Pods, Anda harus memiliki grup keamanan yang ada. Langkah-langkah berikut menunjukkan cara menggunakan kebijakan grup keamanan untuk Pod. Kecuali dinyatakan lain, selesaikan semua langkah dari terminal yang sama karena variabel digunakan dalam langkah-langkah berikut yang tidak bertahan di seluruh terminal.

Jika Anda memiliki Pod dengan EC2 contoh Amazon, Anda harus mengkonfigurasi plugin sebelum Anda menggunakan prosedur ini. Untuk informasi selengkapnya, lihat Konfigurasikan Amazon VPC CNI plugin for Kubernetes untuk grup keamanan untuk Amazon EKS Pods.

  1. Buat Kubernetes namespace untuk menyebarkan sumber daya ke. Anda dapat mengganti my-namespace dengan nama namespace yang ingin Anda gunakan.

    kubectl create namespace my-namespace
  2. Menerapkan Amazon EKS SecurityGroupPolicy ke cluster Anda.

    1. Salin konten berikut ke perangkat Anda. Anda dapat mengganti podSelector dengan serviceAccountSelector jika Anda lebih suka memilih Pods berdasarkan label akun layanan. Anda harus menentukan satu selektor atau yang lainnya. Sebuah kosong podSelector (contoh:podSelector: {}) memilih semua Pods di namespace. Anda bisa berubah my-role dengan nama peran Anda. serviceAccountSelector yang kosong memilih semua akun layanan di namespace. Anda dapat mengganti my-security-group-policy dengan nama untuk Anda SecurityGroupPolicy dan my-namespace dengan namespace yang ingin Anda buat di. SecurityGroupPolicy

      Anda harus mengganti my_pod_security_group_id dengan ID grup keamanan yang ada. Jika Anda tidak memiliki grup keamanan yang ada, maka Anda harus membuatnya. Untuk informasi selengkapnya, lihat Grup EC2 keamanan Amazon untuk instans Linux di Panduan EC2 Pengguna Amazon. Anda dapat menentukan 1-5 grup IDs keamanan. Jika Anda menentukan lebih dari satu ID, maka kombinasi semua aturan di semua grup keamanan efektif untuk yang dipilih Pods.

      cat >my-security-group-policy.yaml <<EOF apiVersion: vpcresources.k8s.aws/v1beta1 kind: SecurityGroupPolicy metadata: name: my-security-group-policy namespace: my-namespace spec: podSelector: matchLabels: role: my-role securityGroups: groupIds: - my_pod_security_group_id EOF
      penting

      Grup keamanan atau grup yang Anda tentukan untuk Pods harus memenuhi kriteria berikut:

      • Mereka harus ada. Jika mereka tidak ada, maka, ketika Anda menerapkan Pod yang cocok dengan pemilih, Anda Pod tetap terjebak dalam proses pembuatan. Jika Anda menggambarkan Pod, Anda akan melihat pesan kesalahan yang mirip dengan yang berikut:An error occurred (InvalidSecurityGroupID.NotFound) when calling the CreateNetworkInterface operation: The securityGroup ID 'sg-05b1d815d1EXAMPLE' does not exist.

      • Mereka harus mengizinkan komunikasi masuk dari grup keamanan yang diterapkan ke node Anda (untukkubelet) melalui port apa pun yang telah Anda konfigurasi probe.

      • Mereka harus mengizinkan komunikasi keluar TCP dan UDP port 53 ke grup keamanan yang ditugaskan ke Pods (atau node yang Pods jalankan) berjalan CoreDNS. Kelompok keamanan untuk Anda CoreDNS Pods harus mengizinkan lalu lintas masuk TCP dan UDP port 53 dari grup keamanan yang Anda tentukan.

      • Mereka harus memiliki aturan masuk dan keluar yang diperlukan untuk berkomunikasi dengan orang lain Pods bahwa mereka perlu berkomunikasi dengan.

      • Mereka harus memiliki aturan yang memungkinkan Pods untuk berkomunikasi dengan Kubernetes kontrol pesawat jika Anda menggunakan kelompok keamanan dengan Fargate. Cara termudah untuk melakukannya adalah dengan menentukan grup keamanan klaster sebagai salah satu grup keamanan.

      Kebijakan grup keamanan hanya berlaku untuk yang baru dijadwalkan Pods. Mereka tidak memengaruhi berlari Pods.

    2. Deploy kebijakan.

      kubectl apply -f my-security-group-policy.yaml
  3. Menerapkan aplikasi sampel dengan label yang cocok my-role nilai untuk podSelector yang Anda tentukan pada langkah sebelumnya.

    1. Salin konten berikut ke perangkat Anda. Ganti example values dengan milik Anda sendiri dan kemudian jalankan perintah yang dimodifikasi. Jika Anda mengganti my-role, pastikan itu sama dengan nilai yang Anda tentukan untuk pemilih pada langkah sebelumnya.

      cat >sample-application.yaml <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment namespace: my-namespace labels: app: my-app spec: replicas: 4 selector: matchLabels: app: my-app template: metadata: labels: app: my-app role: my-role spec: terminationGracePeriodSeconds: 120 containers: - name: nginx image: public.ecr.aws/nginx/nginx:1.23 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: my-app namespace: my-namespace labels: app: my-app spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 80 EOF
    2. Deploy aplikasi dengan perintah berikut. Saat Anda menggunakan aplikasi, Amazon VPC CNI plugin for Kubernetes cocok dengan role label dan grup keamanan yang Anda tentukan pada langkah sebelumnya diterapkan ke Pod.

      kubectl apply -f sample-application.yaml
  4. Lihat Pods dikerahkan dengan aplikasi sampel. Untuk sisa topik ini, terminal ini disebut sebagaiTerminalA.

    kubectl get pods -n my-namespace -o wide

    Contoh output adalah sebagai berikut.

    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES my-deployment-5df6f7687b-4fbjm 1/1 Running 0 7m51s 192.168.53.48 ip-192-168-33-28.region-code.compute.internal <none> <none> my-deployment-5df6f7687b-j9fl4 1/1 Running 0 7m51s 192.168.70.145 ip-192-168-92-33.region-code.compute.internal <none> <none> my-deployment-5df6f7687b-rjxcz 1/1 Running 0 7m51s 192.168.73.207 ip-192-168-92-33.region-code.compute.internal <none> <none> my-deployment-5df6f7687b-zmb42 1/1 Running 0 7m51s 192.168.63.27 ip-192-168-33-28.region-code.compute.internal <none> <none>
    catatan

    Coba tips ini jika ada Pods terjebak.

    • Jika ada Pods terjebak di Waiting negara bagian, lalu larikubectl describe pod my-deployment-xxxxxxxxxx-xxxxx -n my-namespace . Jika Anda melihatnyaInsufficient permissions: Unable to create Elastic Network Interface., konfirmasikan bahwa Anda menambahkan IAM kebijakan ke peran IAM klaster di langkah sebelumnya.

    • Jika ada Pods macet dalam Pending status, konfirmasikan bahwa jenis instance node Anda terdaftar di limits.go dan bahwa produk dari jumlah maksimum antarmuka jaringan cabang yang didukung oleh jenis instance dikalikan kali jumlah node dalam grup node Anda belum terpenuhi. Misalnya, sebuah instans m5.large mendukung sembilan antarmuka jaringan cabang. Jika grup simpul Anda memiliki lima simpul, maka maksimum 45 antarmuka jaringan cabang dapat dibuat untuk grup simpul. Yang ke-46 Pod yang Anda coba terapkan akan duduk dalam Pending keadaan sampai yang lain Pod yang memiliki grup keamanan terkait dihapus.

    Jika Anda menjalankan kubectl describe pod my-deployment-xxxxxxxxxx-xxxxx -n my-namespace dan melihat pesan yang serupa dengan pesan berikut, maka dapat diabaikan dengan aman. Pesan ini mungkin muncul ketika Amazon VPC CNI plugin for Kubernetes mencoba mengatur jaringan host dan gagal saat antarmuka jaringan sedang dibuat. Plugin mencatat peristiwa ini sampai antarmuka jaringan dibuat.

    Failed to create Pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "e24268322e55c8185721f52df6493684f6c2c3bf4fd59c9c121fd4cdc894579f" network for Pod "my-deployment-5df6f7687b-4fbjm": networkPlugin cni failed to set up Pod "my-deployment-5df6f7687b-4fbjm-c89wx_my-namespace" network: add cmd: failed to assign an IP address to container

    Anda tidak dapat melebihi jumlah maksimum Pods yang dapat dijalankan pada tipe instance. Untuk daftar jumlah maksimum Pods yang dapat Anda jalankan pada setiap jenis instance, eni-max-podslihat.txt aktif GitHub. Saat Anda menghapus Pod yang memiliki grup keamanan terkait, atau menghapus simpul yang Pod sedang berjalan, pengontrol VPC sumber daya menghapus antarmuka jaringan cabang. Jika Anda menghapus klaster dengan Pods memakai Pods untuk grup keamanan, maka pengontrol tidak menghapus antarmuka jaringan cabang, jadi Anda harus menghapusnya sendiri. Untuk informasi tentang cara menghapus antarmuka jaringan, lihat Menghapus antarmuka jaringan di Panduan EC2 Pengguna Amazon.

  5. Di terminal terpisah, tempelkan ke salah satu Pods. Untuk sisa topik ini, terminal ini disebut sebagaiTerminalB. Ganti 5df6f7687b-4fbjm dengan ID salah satu Pods kembali dalam output Anda dari langkah sebelumnya.

    kubectl exec -it -n my-namespace my-deployment-5df6f7687b-4fbjm -- /bin/bash
  6. Dari shell masukTerminalB, konfirmasikan bahwa aplikasi sampel berfungsi.

    curl my-app

    Contoh output adalah sebagai berikut.

    <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...]

    Anda menerima output karena semua Pods menjalankan aplikasi dikaitkan dengan grup keamanan yang Anda buat. Grup itu berisi aturan yang memungkinkan semua lalu lintas di antara semua Pods yang terkait dengan kelompok keamanan. DNSlalu lintas diizinkan keluar dari grup keamanan tersebut ke grup keamanan klaster, yang terkait dengan node Anda. Node menjalankan CoreDNS Pods, yang Anda Pods melakukan pencarian nama ke.

  7. DariTerminalA, hapus aturan grup keamanan yang memungkinkan DNS komunikasi ke grup keamanan klaster dari grup keamanan Anda. Jika Anda tidak menambahkan DNS aturan ke grup keamanan klaster pada langkah sebelumnya, maka ganti $my_cluster_security_group_id dengan ID grup keamanan tempat Anda membuat aturan.

    aws ec2 revoke-security-group-ingress --group-id $my_cluster_security_group_id --security-group-rule-ids $my_tcp_rule_id aws ec2 revoke-security-group-ingress --group-id $my_cluster_security_group_id --security-group-rule-ids $my_udp_rule_id
  8. DariTerminalB, coba akses aplikasi lagi.

    curl my-app

    Contoh output adalah sebagai berikut.

    curl: (6) Could not resolve host: my-app

    Upaya gagal karena Pod tidak lagi dapat mengakses CoreDNS Pods, yang memiliki grup keamanan cluster yang terkait dengannya. Grup keamanan klaster tidak lagi memiliki aturan grup keamanan yang memungkinkan DNS komunikasi dari grup keamanan yang terkait dengan Anda Pod.

    Jika Anda mencoba mengakses aplikasi menggunakan alamat IP yang dikembalikan untuk salah satu Pods pada langkah sebelumnya, Anda masih menerima respons karena semua port diizinkan antara Pods yang memiliki grup keamanan yang terkait dengannya dan pencarian nama tidak diperlukan.

  9. Setelah selesai bereksperimen, Anda dapat menghapus contoh kebijakan grup keamanan, aplikasi, dan grup keamanan yang Anda buat. Jalankan perintah berikut dariTerminalA.

    kubectl delete namespace my-namespace aws ec2 revoke-security-group-ingress --group-id $my_pod_security_group_id --security-group-rule-ids $my_inbound_self_rule_id wait sleep 45s aws ec2 delete-security-group --group-id $my_pod_security_group_id