Mengotomatiskan pengelolaan sertifikat TLS untuk gateway ingress Cloud Service Mesh menggunakan Certificate Authority Service
Tutorial ini menunjukkan kepada operator platform cara menggunakan penerbit Certificate Authority Service (CA Service) untuk alat cert-manager guna mengotomatiskan pengelolaan sertifikat TLS untuk gateway masuk Cloud Service Mesh. Sertifikat ini memungkinkan gateway ingress menghentikan HTTPS dan traffic TLS serta mTLS lainnya yang berasal dari klien di Virtual Private Cloud (VPC) Anda, tetapi di luar service mesh. Tutorial ini mengasumsikan Anda telah memiliki pengetahuan dasar tentang Kubernetes dan sertifikat TLS.
Pengantar
Cloud Service Mesh menyediakan sertifikat TLS untuk setiap workload di service mesh. Sertifikat ini memungkinkan komunikasi yang dienkripsi dan TLS yang diautentikasi bersama (mTLS) antar-beban kerja di service mesh. Salah satu CA yang didukung menerbitkan dan menandatangani sertifikat.
Namun, Cloud Service Mesh tidak otomatis menyediakan sertifikat ke gateway ingress untuk traffic yang memasuki service mesh. Solusi umum adalah menggunakan alat cert-manager open source untuk mengotomatiskan pengelolaan sertifikat gateway ingress.
Alat cert-manager meminta sertifikat dari penerbit, yang merepresentasikan otoritas sertifikat (CA). CA Service adalah layanan Google Cloud yang memungkinkan Anda membuat CA pribadi Anda sendiri. Alat cert-manager dapat meminta sertifikat dari CA Service dengan menggunakan penerbit eksternal untuk CA Service open source.
CA pribadi dapat menerbitkan sertifikat TLS yang mengautentikasi dan mengenkripsi traffic di dalam jaringan internal. Gateway ingress Cloud Service Mesh sering kali disiapkan untuk mengizinkan traffic masuk dari klien yang berada di dalam VPC Anda, tetapi di luar service mesh. Untuk traffic jaringan internal, Anda dapat menggunakan CA pribadi di Layanan CA untuk menerbitkan sertifikat bagi gateway masuk.
Tutorial ini menunjukkan cara menyiapkan alat cert-manager dan penerbit CA Service untuk mengotomatiskan penyediaan dan perpanjangan sertifikat TLS untuk gateway ingress. Alat cert-manager menyediakan sertifikat sebagai resource Secret Kubernetes berjenis TLS. Saat memperpanjang sertifikat, alat cert-manager akan memperbarui resource Secret dengan sertifikat baru. Gateway masuk menjalankan Envoy Proxy, dan mendukung layanan penemuan secret (SDS) Envoy. SDS memungkinkan gateway ingress mulai menggunakan sertifikat baru tanpa memerlukan administrator untuk memulai ulang atau memuat ulang proses.
Proxy sidecar yang merupakan bagian dari mesh dapat memperoleh sertifikat TLS dari CA Service atau otoritas sertifikat Cloud Service Mesh. Dalam tutorial ini, Anda menggunakan Layanan CA untuk sertifikat proxy sidecar dan gateway ingress. Dengan begitu, Anda dapat menggunakan satu CA root untuk semua sertifikat TLS.
Diagram berikut menunjukkan resource yang Anda siapkan dalam tutorial ini.
Anda menyediakan Load Balancer Jaringan passthrough internal untuk gateway ingress. Load Balancer Jaringan passthrough internal bukan proxy, sehingga tidak menghentikan koneksi TCP atau melakukan handshake TLS. Sebagai gantinya, layanan ini merutekan koneksi ke pod deployment istio-ingressgateway.
hello-example-com-credential Secret berisi sertifikat dan kunci
pribadi. Gateway hello mengonfigurasi pod deployment istio-ingressgateway
untuk menggunakan sertifikat dan kunci pribadi ini guna melakukan TLS handshake untuk
permintaan dengan nama host hello.example.com.
Pod deployment google-cas-issuer di namespace cert-manager meminta sertifikat dari CA yang Anda buat di CA Service. Anda membuat binding kebijakan Identity and Access Management yang memungkinkan pod ca-service-isser meniru identitas akun layanan Google menggunakan Workload Identity Federation untuk GKE. Anda
memberikan izin akun layanan Google ini untuk meminta sertifikat dari CA Anda
di CA Service dengan membuat binding kebijakan IAM
di kumpulan CA Anda.
Tujuan
- Mengonfigurasi Layanan CA
- Membuat cluster GKE
- Menginstal bidang kontrol Cloud Service Mesh
- Menginstal gateway traffic masuk
- Instal alat cert-manager
- Menginstal pengontrol penerbit Layanan CA
- Membuat penerbit sertifikat
- Men-deploy aplikasi sampel
- Verifikasi solusi
- (Opsional) Tambahkan sertifikat CA ke penyimpanan tepercaya
Biaya
Tutorial ini menggunakan komponen Google Cloudyang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna Google Cloud baru mungkin memenuhi syarat untuk mendapatkan uji coba gratis.
Setelah menyelesaikan tutorial ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk informasi selengkapnya, lihat Pembersihan.
Sebelum memulai
Di konsol Google Cloud , buka halaman pemilih project, lalu pilih atau buat project.
Pastikan penagihan diaktifkan untuk Google Cloud project Anda.
Di konsol Google Cloud , buka Cloud Shell.
Di bagian bawah konsol Google Cloud , sesi Cloud Shell akan terbuka dan menampilkan perintah command line. Anda menggunakan Cloud Shell untuk menjalankan semua perintah dalam tutorial ini.
Tetapkan project konsol Google Cloud yang ingin Anda gunakan untuk tutorial ini:
gcloud config set core/project PROJECT_IDGanti PROJECT_ID dengan project ID project Cloud Anda.
Di dialog Authorize Cloud Shell, klik Authorize. Dengan mengklik Beri Otorisasi, Anda mengizinkan perintah
gcloudyang Anda jalankan di Cloud Shell untuk menggunakan kredensial pengguna Anda guna melakukan autentikasi ke Google API.Aktifkan Resource Manager, GKE, GKE Fleet, certificate authority Cloud Service Mesh, dan CA Service API:
gcloud services enable \ cloudresourcemanager.googleapis.com \ container.googleapis.com \ gkehub.googleapis.com \ meshca.googleapis.com \ privateca.googleapis.com
Mengonfigurasi CA Service
Di bagian ini, Anda akan membuat CA root dan dua CA subordinat di CA Service. Satu CA bawahan menerbitkan sertifikat ke gateway ingress, dan CA bawahan lainnya menerbitkan sertifikat ke proxy sidecar di mesh.
Untuk mempermudah, Anda akan menggunakan project yang sama untuk cluster GKE dan CA root dan subordinat dalam tutorial ini. Di lingkungan Anda sendiri, Anda dapat menggunakan project yang berbeda untuk cluster GKE dan CA.
Di Cloud Shell, buat kumpulan CA yang akan digunakan untuk CA root:
gcloud privateca pools create ROOT_CA_POOL \ --location CA_LOCATION \ --tier enterprise- ROOT_CA_POOL adalah nama kumpulan CA. Contoh,
root-ca-pool-tutorial. - CA_LOCATION adalah lokasi kumpulan CA. Contoh,
us-central1.
Anda dapat mencantumkan lokasi Layanan CA yang tersedia menggunakan perintah ini:
gcloud privateca locations list- ROOT_CA_POOL adalah nama kumpulan CA. Contoh,
Buat dan aktifkan CA root:
gcloud privateca roots create ROOT_CA \ --auto-enable \ --key-algorithm ec-p384-sha384 \ --location CA_LOCATION \ --pool ROOT_CA_POOL \ --subject "CN=Example Root CA, O=Example Organization" \ --use-preset-profile root_unconstrained- ROOT_CA adalah nama yang ingin Anda gunakan untuk CA
root. Contoh,
root-ca-tutorial.
- ROOT_CA adalah nama yang ingin Anda gunakan untuk CA
root. Contoh,
Buat kumpulan CA yang akan digunakan untuk CA subordinat yang menerbitkan sertifikat ke gateway ingress:
gcloud privateca pools create SUBORDINATE_CA_POOL_GATEWAYS \ --location CA_LOCATION \ --tier devops- SUBORDINATE_CA_POOL_GATEWAYS adalah nama kumpulan CA. Contoh,
subordinate-ca-mtls-pool-gateways-tutorial.
- SUBORDINATE_CA_POOL_GATEWAYS adalah nama kumpulan CA. Contoh,
Buat dan aktifkan CA subordinat yang menerbitkan sertifikat ke gateway ingress:
gcloud privateca subordinates create SUBORDINATE_CA_GATEWAYS \ --auto-enable \ --issuer-location CA_LOCATION \ --issuer-pool ROOT_CA_POOL \ --key-algorithm ec-p256-sha256 \ --location CA_LOCATION \ --pool SUBORDINATE_CA_POOL_GATEWAYS \ --subject "CN=Example Gateway mTLS CA, O=Example Organization" \ --use-preset-profile subordinate_mtls_pathlen_0- SUBORDINATE_CA_GATEWAYS adalah nama yang ingin Anda
gunakan untuk CA subordinat. Contoh,
subordinate-ca-mtls-gateways-tutorial. - Flag
--use-preset-profilemengonfigurasi CA subordinat untuk menggunakan profil sertifikat Subordinate mTLS. Profil ini memungkinkan CA bawahan menerbitkan sertifikat TLS klien dan server untuk mTLS.
Jika Anda ingin gateway masuk menggunakan TLS sederhana, bukan mTLS, CA bawahan Anda hanya perlu menerbitkan sertifikat TLS server. Dalam hal ini, Anda dapat menggunakan profil sertifikat TLS server subordinat (
subordinate_server_tls_pathlen_0).- SUBORDINATE_CA_GATEWAYS adalah nama yang ingin Anda
gunakan untuk CA subordinat. Contoh,
Buat kebijakan penerbitan sertifikat:
cat << EOF > policy.yaml baselineValues: keyUsage: baseKeyUsage: digitalSignature: true keyEncipherment: true extendedKeyUsage: serverAuth: true clientAuth: true caOptions: isCa: false identityConstraints: allowSubjectPassthrough: false allowSubjectAltNamesPassthrough: true celExpression: expression: subject_alt_names.all(san, san.type == URI && san.value.startsWith("spiffe://PROJECT_ID.svc.id.goog/ns/") ) EOFKebijakan penerbitan ini membatasi CA untuk hanya menerbitkan sertifikat bagi workload di mesh.
Buat kumpulan CA untuk digunakan oleh CA subordinat yang menerbitkan sertifikat ke proxy sidecar di mesh. Terapkan kebijakan penerbitan ke kumpulan CA:
gcloud privateca pools create SUBORDINATE_CA_POOL_SIDECARS \ --issuance-policy policy.yaml \ --location CA_LOCATION \ --tier devops- SUBORDINATE_CA_POOL_SIDECARS adalah nama kumpulan CA. Contoh,
subordinate-ca-mtls-pool-sidecars-tutorial.
- SUBORDINATE_CA_POOL_SIDECARS adalah nama kumpulan CA. Contoh,
Buat dan aktifkan CA subordinat yang menerbitkan sertifikat ke proxy sidecar di mesh:
gcloud privateca subordinates create SUBORDINATE_CA_SIDECARS \ --auto-enable \ --issuer-location CA_LOCATION \ --issuer-pool ROOT_CA_POOL \ --key-algorithm ec-p256-sha256 \ --location CA_LOCATION \ --pool SUBORDINATE_CA_POOL_SIDECARS \ --subject "CN=Example Sidecar mTLS CA, O=Example Organization" \ --use-preset-profile subordinate_mtls_pathlen_0- SUBORDINATE_CA_GATEWAYS adalah nama yang ingin Anda
gunakan untuk CA subordinat. Contoh,
subordinate-ca-mtls-sidecars-tutorial.
- SUBORDINATE_CA_GATEWAYS adalah nama yang ingin Anda
gunakan untuk CA subordinat. Contoh,
Membuat cluster Google Kubernetes Engine
Di Cloud Shell, buat cluster GKE:
gcloud container clusters create CLUSTER_NAME \ --enable-ip-alias \ --num-nodes 4 \ --release-channel regular \ --scopes cloud-platform \ --workload-pool PROJECT_ID.svc.id.goog \ --zone ZONEGanti CLUSTER_NAME dengan nama yang ingin Anda gunakan untuk cluster. Contoh,
asm-ingress-cert-manager-ca-service.Ganti ZONE dengan zona yang ingin Anda gunakan untuk cluster. Contoh,
us-central1-f.Perhatikan hal-hal berikut tentang perintah ini:
- Flag
--release-channelmemilih saluran rilis GKE untuk cluster. - Cloud Service Mesh dan penerbit CA Service untuk alat cert-manager mengharuskan Anda menyetel cakupan
cloud-platformpada node cluster. - Argumen
--workload-poolmengaktifkan Workload Identity Federation untuk GKE, yang memungkinkan akun layanan Kubernetes penerbit CA Service untuk meniru identitas akun layanan Google. Peniruan identitas ini berarti pod penerbit Layanan CA dapat mengakses API Layanan CA tanpa mendownload file kunci untuk akun layanan Google.
- Flag
Memberikan izin administrator cluster ke akun pengguna Anda:
kubectl create clusterrolebinding cluster-admin-binding \ --clusterrole cluster-admin \ --user $(gcloud config get-value core/account)Anda memerlukan izin yang diberikan oleh
cluster-adminClusterRole Kubernetes untuk membuat aturan role-based access control (RBAC) untuk Cloud Service Mesh, dan untuk menginstal alat cert-manager.
Menginstal bidang kontrol Anthos Service Mesh
Dalam tutorial ini, Anda akan menginstal Cloud Service Mesh terkelola untuk cluster GKE di Google Cloud, dengan semua resource dalam satu project. Di lingkungan Anda sendiri, Anda dapat menerapkan solusi yang dijelaskan dalam dokumen ini menggunakan Managed Cloud Service Mesh atau bidang kontrol dalam cluster.
Cloud Service Mesh menyediakan berbagai opsi penginstalan untuk berbagai skenario. Setelah menyelesaikan tutorial ini, sebaiknya tinjau panduan penginstalan untuk memilih opsi yang paling sesuai dengan lingkungan Anda.
Di Cloud Shell, download alat penginstal
asmcli:curl --location --output asmcli https://storage.googleapis.com/csm-artifacts/asm/asmcli_1.29 chmod +x asmcliAnda menggunakan
asmcliuntuk menginstal bidang kontrol Cloud Service Mesh.Instal bidang kontrol Cloud Service Mesh:
./asmcli install \ --ca gcp_cas \ --ca_pool projects/PROJECT_ID/locations/CA_LOCATION/caPools/SUBORDINATE_CA_POOL_SIDECARS \ --cluster_location ZONE \ --cluster_name CLUSTER_NAME \ --enable_all \ --enable_registration \ --fleet_id PROJECT_ID \ --managed \ --output_dir asm-files \ --project_id PROJECT_ID \ --verboseFlag
--ca gcp_casdan--ca_poolmengonfigurasi bidang kontrol Cloud Service Mesh untuk menggunakan kumpulan CA sidecar di CA Service guna menerbitkan sertifikat ke proxy sidecar di mesh.Flag
--enable_registrationmendaftarkan cluster GKE ke fleet dalam project yang ditentukan oleh flag--fleet_id. Dalam tutorial ini, cluster GKE dan fleet menggunakan project yang sama.Flag
--managedmenyiapkan bidang kontrol Cloud Service Mesh terkelola.Flag
--output_dirmenentukan direktori yang digunakanasmcliuntuk mendownload file dan konfigurasi yang diperlukan untuk menginstal Cloud Service Mesh. Anda akan menggunakan file ini nanti dalam tutorial.
Penginstalan memerlukan waktu beberapa menit. Setelah penginstalan selesai, Anda akan melihat output berikut:
asmcli: Successfully installed ASM.
Menginstal gateway traffic masuk
Di Cloud Shell, buat namespace Kubernetes untuk gateway ingress:
kubectl create namespace GATEWAY_NAMESPACE- GATEWAY_NAMESPACE adalah nama
namespace yang ingin Anda gunakan untuk gateway ingress. Contoh,
istio-ingress.
- GATEWAY_NAMESPACE adalah nama
namespace yang ingin Anda gunakan untuk gateway ingress. Contoh,
Cadangkan alamat IP internal statis untuk digunakan bagi Load Balancer Jaringan passthrough internal gateway ingress:
LOAD_BALANCER_IP=$(gcloud compute addresses create \ asm-ingress-gateway-ilb \ --region REGION \ --subnet default \ --format 'value(address)')- Ganti REGION dengan region yang berisi
zona atau zona yang digunakan oleh node cluster GKE Anda. Misalnya,
jika cluster Anda menggunakan zona
us-central1-f, ganti REGION denganus-central1.
Perintah ini mencadangkan alamat IP dari subnet default di region yang Anda tentukan.
- Ganti REGION dengan region yang berisi
zona atau zona yang digunakan oleh node cluster GKE Anda. Misalnya,
jika cluster Anda menggunakan zona
Buat manifes operator untuk gateway ingress:
cat << EOF > ingressgateway-operator.yaml apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: name: ingressgateway-operator annotations: config.kubernetes.io/local-config: "true" spec: profile: empty revision: asm-managed components: ingressGateways: - name: istio-ingressgateway namespace: GATEWAY_NAMESPACE enabled: true k8s: overlays: - apiVersion: apps/v1 kind: Deployment name: istio-ingressgateway patches: - path: spec.template.metadata.annotations value: inject.istio.io/templates: gateway - path: spec.template.metadata.labels.sidecar\.istio\.io/inject value: "true" - path: spec.template.spec.containers[name:istio-proxy] value: name: istio-proxy image: auto service: loadBalancerIP: $LOAD_BALANCER_IP serviceAnnotations: networking.gke.io/load-balancer-type: Internal networking.gke.io/internal-load-balancer-allow-global-access: "true" EOFPerhatikan hal-hal berikut tentang manifes operator:
Kolom
revisionmenentukan saluran rilis Cloud Service Mesh terkelola yang akan digunakan untuk bidang data. Ubah nilai kolom ini jika Anda menggunakan saluran rilis Cepat atau Stabil untuk bidang kontrol.annotation,label, danimageyang ditentukan di bagianoverlaysmengaktifkan injeksi otomatis konfigurasi proxy untuk deployment gateway traffic masuk.Kolom
loadBalancerIPmenentukan alamat IP yang akan digunakan untuk load balancer. Jika Anda menghapus kolom ini dari manifes, load balancer akan menggunakan alamat IP sementara.Anotasi layanan
networking.gke.io/load-balancer-type: Internaldi gateway masuk berarti GKE menyediakan Load Balancer Jaringan passthrough internal di depan pod gateway masuk. Jika Anda menghapus anotasi ini, GKE akan menyediakan Load Balancer Jaringan passthrough eksternal.Anotasi layanan opsional
networking.gke.io/internal-load-balancer-allow-global-access: "true"memungkinkan klien dari region mana pun di VPC Anda mengakses Load Balancer Jaringan passthrough internal. Jika Anda menghapus anotasi ini, Load Balancer Jaringan passthrough internal hanya menerima traffic dari klien di region yang sama di VPC Anda.
Buat manifes penginstalan gateway ingress menggunakan manifes operator dan alat
istioctlyang didownload skripasmclisaat Anda menginstal bidang kontrol:./asm-files/istioctl manifest generate \ --filename ingressgateway-operator.yaml \ --output ingressgatewayInstal gateway traffic masuk:
kubectl apply --recursive --filename ingressgateway/
Instal alat cert-manager
Di Cloud Shell, download dan terapkan manifes penginstalan alat cert-manager:
CERT_MANAGER_VERSION=v1.5.4 curl --location --output cert-manager.yaml "https://github.com/jetstack/cert-manager/releases/download/${CERT_MANAGER_VERSION}/cert-manager.yaml" kubectl apply --filename cert-manager.yamlMenginstal alat cert-manager memerlukan waktu sekitar satu menit hingga selesai.
Menginstal pengontrol penerbit CA Service
Pengontrol penerbit CA Service memungkinkan alat cert-manager meminta sertifikat menggunakan CA Service. Pengontrol menggunakan mekanisme ekstensi penerbit eksternal alat cert-manager.
Di Cloud Shell, buat akun layanan Google:
gcloud iam service-accounts create CAS_ISSUER_GSA \ --display-name "CA Service issuer for cert-manager"- CAS_ISSUER_GSA adalah nama akun layanan Google. Contoh,
cert-manager-ca-service-issuer.
Pengontrol penerbit Certificate Authority Service menggunakan akun layanan Google ini untuk mengautentikasi ke Certificate Authority Service API.
- CAS_ISSUER_GSA adalah nama akun layanan Google. Contoh,
Buat binding kebijakan Identity and Access Management yang memungkinkan akun layanan Google pengontrol penerbit Certificate Authority Service meminta sertifikat dari kumpulan CA yang berisi CA bawahan Anda:
gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_GATEWAYS \ --location CA_LOCATION \ --member "serviceAccount:CAS_ISSUER_GSA@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/privateca.certificateRequesterDownload manifes penginstalan pengontrol penerbit Certificate Authority Service:
CAS_ISSUER_VERSION=v0.5.3 curl --location --output ca-service-issuer.yaml "https://github.com/jetstack/google-cas-issuer/releases/download/${CAS_ISSUER_VERSION}/google-cas-issuer-${CAS_ISSUER_VERSION}.yaml"Buat binding kebijakan IAM untuk mengizinkan akun layanan Kubernetes
ksa-google-cas-issuerdi namespacecert-managermeniru identitas akun layanan Google (GSA) menggunakan Federasi Workload Identity untuk GKE:gcloud iam service-accounts add-iam-policy-binding \ CAS_ISSUER_GSA@PROJECT_ID.iam.gserviceaccount.com \ --member "serviceAccount:PROJECT_ID.svc.id.goog[cert-manager/ksa-google-cas-issuer]" \ --role roles/iam.workloadIdentityUserPod pengontrol penerbit CA Service menggunakan akun layanan Kubernetes
ksa-google-cas-issuer.Instal pengontrol penerbit Layanan CA di cluster GKE Anda:
kubectl apply --filename ca-service-issuer.yamlTambahkan anotasi Workload Identity Federation for GKE
iam.gke.io/gcp-service-accountke akun layanan Kubernetes yang digunakan oleh pod pengontrol penerbit CA Service:kubectl annotate serviceaccount ksa-google-cas-issuer --namespace cert-manager \ "iam.gke.io/gcp-service-account=CAS_ISSUER_GSA@PROJECT_ID.iam.gserviceaccount.com"Anotasi ini memberi tahu GKE bahwa akun layanan Kubernetes dapat meniru identitas akun layanan Google untuk mengakses Google API.
Membuat penerbit sertifikat
Di Cloud Shell, buat dan terapkan manifes GoogleCASIssuer:
cat << EOF > gateway-cas-issuer.yaml apiVersion: cas-issuer.jetstack.io/v1beta1 kind: GoogleCASIssuer metadata: name: gateway-cas-issuer namespace: GATEWAY_NAMESPACE spec: caPoolId: SUBORDINATE_CA_POOL_GATEWAYS location: CA_LOCATION project: PROJECT_ID EOF kubectl apply --filename gateway-cas-issuer.yamlPenerbit memungkinkan alat cert-manager menyediakan sertifikat dari kumpulan CA bawahan di namespace gateway ingress Anda
Men-deploy aplikasi contoh
Di bagian ini, Anda akan memverifikasi bahwa alat cert-manager dapat menggunakan penerbit Layanan CA untuk mendapatkan sertifikat dari Layanan CA. Untuk memverifikasi, Anda men-deploy aplikasi contoh dengan konfigurasi perutean permintaan dan sertifikat untuk gateway ingress.
Di Cloud Shell, buat namespace untuk resource aplikasi contoh:
cat << EOF > sample-app-namespace.yaml apiVersion: v1 kind: Namespace metadata: name: APP_NAMESPACE annotations: mesh.cloud.google.com/proxy: '{"managed":"true"}' labels: istio.io/rev: asm-managed EOF kubectl apply --filename sample-app-namespace.yaml- APP_NAMESPACE adalah nama namespace untuk
aplikasi contoh. Contoh,
sample-app.
Anotasi
mesh.cloud.google.com/proxymengaktifkan bidang data terkelola untuk namespace.Label
istio.io/rev: asm-managedmemilih Saluran rilis reguler untuk managed data plane di namespace aplikasi contoh. Ubah nilai label ini jika Anda menggunakan saluran rilis Cepat atau Stabil.- APP_NAMESPACE adalah nama namespace untuk
aplikasi contoh. Contoh,
Buat resource Deployment untuk aplikasi contoh:
cat << EOF > deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: hello namespace: APP_NAMESPACE labels: app: hello spec: replicas: 1 selector: matchLabels: app: hello template: metadata: labels: app: hello spec: containers: - image: gcr.io/google-samples/hello-app:1.0 name: hello-app ports: - containerPort: 8080 EOF kubectl apply --filename deployment.yamlBuat resource Service untuk aplikasi contoh:
cat << EOF > service.yaml apiVersion: v1 kind: Service metadata: name: SERVICE_NAME namespace: APP_NAMESPACE spec: ports: - name: http-hello port: 8080 selector: app: hello type: ClusterIP EOF kubectl apply --filename service.yaml- SERVICE_NAME adalah nama layanan. Contoh,
hello.
- SERVICE_NAME adalah nama layanan. Contoh,
Buat resource Sertifikat untuk nama domain
hello.example.commenggunakan penerbit sertifikat:cat << EOF > certificate.yaml apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: hello-example-com-certificate namespace: GATEWAY_NAMESPACE spec: secretName: hello-example-com-credential commonName: hello.example.com dnsNames: - hello.example.com duration: 24h renewBefore: 8h issuerRef: group: cas-issuer.jetstack.io kind: GoogleCASIssuer name: gateway-cas-issuer EOF kubectl apply --filename certificate.yamlNamespace Sertifikat harus cocok dengan namespace gateway ingress. Biasanya, hanya administrator platform yang dapat mengubah resource di namespace ini, karena perubahan dapat memengaruhi seluruh mesh layanan. Alat cert-manager membuat resource Secret untuk sertifikat TLS di namespace yang sama. Artinya, administrator aplikasi tidak perlu memiliki akses ke namespace gateway ingress.
Anda dapat menambahkan nama host tambahan dalam daftar
dnsNamesdi Sertifikat. Nama host ini disertakan dalam sertifikat sebagai Nama Alternatif Subjek (SAN).Buat resource Gateway untuk aplikasi contoh:
cat << EOF > gateway.yaml apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: GATEWAY_NAME namespace: GATEWAY_NAMESPACE spec: selector: istio: ingressgateway servers: - hosts: - APP_NAMESPACE/hello.example.com port: name: https-hello number: 443 protocol: HTTPS tls: credentialName: hello-example-com-credential mode: MUTUAL EOF kubectl apply --filename gateway.yaml- GATEWAY_NAME adalah nama gateway. Contoh,
hello. - Kolom
credentialNamedi Gateway cocok dengan kolomsecretNamedi Sertifikat. Alat cert-manager membuat Secret Kubernetes dengan sertifikat TLS dari Layanan CA. Sertifikat ini memungkinkan gateway ingress menghentikan traffic TLS yang ditujukan kehello.example.com.
Manifes Gateway menentukan TLS MUTUAL (mTLS). Jika Anda ingin mengonfigurasi gateway untuk TLS reguler, tetapkan mode TLS Gateway ke
SIMPLE.- GATEWAY_NAME adalah nama gateway. Contoh,
Buat resource VirtualService untuk aplikasi contoh:
cat << EOF > virtual-service.yaml apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: hello namespace: APP_NAMESPACE spec: hosts: - hello.example.com gateways: - GATEWAY_NAMESPACE/GATEWAY_NAME http: - route: - destination: host: SERVICE_NAME port: number: 8080 EOF kubectl apply --filename virtual-service.yamlGateway dan VirtualService menggunakan namespace yang berbeda. Pola umum ini membatasi perubahan pada perutean berbasis host di Gateway untuk administrator platform yang memiliki izin untuk mengubah resource di namespace gateway ingress.
Administrator aplikasi dengan izin untuk mengedit VirtualService di namespace aplikasi contoh dapat mengubah perutean berdasarkan kolom permintaan lain, seperti jalur URL, tanpa berkoordinasi dengan administrator platform.
Jika Anda ingin mempelajari opsi konfigurasi lainnya, baca dokumentasi API untuk resource Certificate, Gateway, dan VirtualService.
Anda dapat menerapkan kebijakan autentikasi dan otorisasi ke traffic yang memasuki service mesh melalui gateway ingress. Untuk melakukannya, baca dokumentasi untuk API Istio PeerAuthentication dan AuthorizationPolicy.
Memverifikasi solusi
Di bagian ini, Anda akan memverifikasi bahwa Anda dapat mengirim permintaan HTTPS menggunakan mTLS ke aplikasi contoh dari luar mesh layanan. Untuk memverifikasi, Anda membuat instance VM Compute Engine, meminta sertifikat TLS klien dari CA Service, dan menggunakan sertifikat ini untuk mengautentikasi permintaan ke aplikasi contoh.
Anda memerlukan akses SSH ke instance VM. Jaringan default mencakup aturan firewall yang mengizinkan akses SSH. Jika Anda tidak memiliki akses SSH, ikuti dokumentasi aturan firewall untuk membuat aturan firewall yang mengizinkan koneksi TCP masuk di port 22.
Di Cloud Shell, buat akun layanan Google:
gcloud iam service-accounts create CLIENT_VM_GSA \ --display-name "CA Service tutorial VM instance service account"- CLIENT_VM_GSA adalah nama akun layanan Google. Contoh,
cas-tutorial-client.
Anda menetapkan akun layanan Google ini ke instance VM Compute Engine.
- CLIENT_VM_GSA adalah nama akun layanan Google. Contoh,
Berikan peran CA Service Certificate Requester di kumpulan CA subordinat gateway ke akun layanan Google:
gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_GATEWAYS \ --location CA_LOCATION \ --member "serviceAccount:CLIENT_VM_GSA@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/privateca.certificateRequesterPeran ini memberikan izin untuk meminta sertifikat dari kumpulan CA.
Buat instance VM Compute Engine di VPC yang sama dengan cluster GKE:
gcloud compute instances create cas-tutorial-client \ --scopes cloud-platform \ --service-account CLIENT_VM_GSA@PROJECT_ID.iam.gserviceaccount.com \ --zone ZONEInstance VM memerlukan cakupan
cloud-platformuntuk mengakses CA Service API.Simpan alamat IP Load Balancer Jaringan passthrough internal gateway ingress ke file:
kubectl get services istio-ingressgateway \ --namespace GATEWAY_NAMESPACE \ --output jsonpath='{.status.loadBalancer.ingress[0].ip}' > ilb-ip.txtSimpan sertifikat kunci publik CA root Anda ke dalam file:
gcloud privateca roots describe ROOT_CA \ --location CA_LOCATION \ --pool ROOT_CA_POOL \ --format 'value(pemCaCertificates)' > root-ca-cert.pemSalin sertifikat CA root dan file yang berisi alamat IP Load Balancer Jaringan passthrough internal gateway ingress ke instance VM:
gcloud compute scp root-ca-cert.pem ilb-ip.txt cas-tutorial-client:~ \ --zone ZONEHubungkan ke instance VM menggunakan SSH:
gcloud compute ssh cas-tutorial-client --zone ZONEJalankan perintah lainnya di bagian ini dari sesi SSH.
Instal paket
ca-certificatesdancoreutils, serta alat command linecurl,openssl, danjq:sudo apt-get update --yes sudo apt-get install --yes ca-certificates coreutils curl jq opensslBuat pasangan kunci untuk sertifikat TLS klien:
openssl genrsa -out private-key.pem 2048 openssl rsa -in private-key.pem -pubout -out public-key.pemBuat kueri server metadata untuk mendapatkan alamat email identitas akun layanan Google yang terpasang ke instance VM:
GSA_EMAIL=$(curl --silent --header "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/email)Buat file JSON yang Anda gunakan sebagai isi permintaan saat meminta sertifikat TLS klien dari Certificate Authority Service API:
cat << EOF > request.json { "config": { "publicKey": { "format": "PEM", "key": "$(base64 --wrap 0 public-key.pem)" }, "subjectConfig": { "subject": { "commonName": "$(hostname --short)", "organization": "Example Organization" }, "subjectAltName": { "dnsNames": [ "$(hostname --fqdn)" ], "emailAddresses": [ "$GSA_EMAIL" ] } }, "x509Config": { "caOptions": { "isCa": false }, "keyUsage": { "baseKeyUsage": { "digitalSignature": true, "keyEncipherment": true }, "extendedKeyUsage": { "clientAuth": true } } } }, "lifetime": "86400s" } EOFUntuk mempelajari lebih lanjut kolom di bagian config, lihat jenis
CertificateConfigdalam dokumentasi CA Service API.Minta token akses OAuth 2.0 dari server metadata:
TOKEN=$(curl --silent --header "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token | jq --raw-output ".access_token")Token akses ini memberikan izin yang diberikan ke akun layanan Google yang terlampir ke instance VM.
Minta sertifikat TLS klien dari CA Service API dan simpan isi respons dalam file:
curl --silent --request POST \ --header "Authorization: Bearer $TOKEN" \ --header "Content-Type: application/json" \ --data @request.json \ --output response.json \ "https://privateca.googleapis.com/v1/projects/PROJECT_ID/locations/CA_LOCATION/caPools/SUBORDINATE_CA_POOL_GATEWAYS/certificates"Perintah ini menggunakan token akses untuk mengautentikasi permintaan API.
Simpan sertifikat klien dan rantai sertifikat ke file:
jq --raw-output --join-output ".pemCertificate , .pemCertificateChain[]" response.json > client-cert-chain.pemGunakan
curluntuk mengirim permintaan HTTPS dari instance VM ke aplikasi contoh:curl --cert client-cert-chain.pem --key private-key.pem \ --cacert root-ca-cert.pem \ --resolve hello.example.com:443:$(cat ilb-ip.txt) \ --silent https://hello.example.com | head -n1Outputnya akan terlihat seperti ini:
Hello, world!
Respons ini menunjukkan bahwa
curlberhasil mengirim permintaan HTTPS menggunakan mTLS. Aplikasi contoh merespons dengan pesan yang Anda lihat di output terminal.Perintah
curltersebut melakukan hal berikut:Flag
--certdan--keymenginstruksikancurluntuk menggunakan sertifikat TLS klien dan kunci pribadi untuk mengautentikasi permintaan. File sertifikat klien berisi rantai lengkap sertifikat, dari sertifikat klien hingga CA root.Flag
--cacertmenginstruksikancurluntuk memverifikasi bahwa CA root yang Anda buat dalam tutorial ini, atau salah satu CA bawahannya, mengeluarkan sertifikat server.Jika Anda menghilangkan tanda ini,
curlakan mencoba memverifikasi sertifikat server menggunakan paket CA default sistem operasi Anda, seperti paketca-certificatesdi Debian. Verifikasi gagal karena paket CA default tidak menyertakan CA root yang Anda buat dalam tutorial ini.Flag
--resolvemenginstruksikancurluntuk menggunakan alamat IP Load Balancer Jaringan passthrough internal sebagai tujuan permintaan ke hosthello.example.comdi port 443.Jika Anda menghilangkan tanda ini,
curlakan mencoba menggunakan DNS untuk me-resolve nama hosthello.example.com. Resolusi DNS gagal karena tidak ada entri DNS untuk nama host ini.Di lingkungan Anda sendiri, sebaiknya buat data A DNS yang mengarah ke alamat IP Network Load Balancer passthrough internal (
$LOAD_BALANCER_IP). Buat data ini menggunakan Cloud DNS, dengan mengikuti dokumentasi tentang mengelola data.Flag
--silentmenekan pelaporan progres download respons dalam output terminal.Perintah ini menyalurkan output curl ke
head -n1. Hasilnya adalah output di terminal hanya menyertakan baris pertama isi respons.
Keluar dari sesi SSH:
exit
Di bagian ini, Anda meminta sertifikat TLS klien langsung dari CA Service API. Dalam situasi saat klien adalah gateway keluar mesh layanan lain di cluster Kubernetes terpisah, Anda dapat menggunakan alat cert-manager dan penerbit Certificate Authority Service dengan root CA yang sama untuk menyediakan sertifikat klien ke gateway keluar.
Dalam situasi lain, Anda dapat menggunakan alat seperti Hashicorp Vault, Terraform, atau
gcloud untuk meminta sertifikat TLS klien bagi beban kerja di luar mesh
layanan. Untuk mengetahui informasi selengkapnya, lihat dokumentasi Layanan CA untuk
solusi contoh, dan dokumentasi
gcloud untuk Layanan CA.
(Opsional) Tambahkan sertifikat CA ke penyimpanan tepercaya
Bagian opsional ini menunjukkan cara menambahkan sertifikat CA ke penyimpanan sertifikat CA tepercaya untuk distribusi Linux Debian. Petunjuk ini juga berlaku untuk distribusi yang berasal dari Debian, seperti Ubuntu.
Dengan menambahkan sertifikat CA ke penyimpanan ini, Anda tidak perlu menentukan lokasi sertifikat CA tepercaya saat mengirim permintaan HTTPS menggunakan curl, Python, Go, dan Ruby.
Hubungkan ke instance VM menggunakan SSH:
gcloud compute ssh cas-tutorial-client --zone ZONEJalankan perintah lainnya di bagian ini dari sesi SSH.
Salin sertifikat CA root ke direktori
/usr/local/share/ca-certificates, dan pastikan file memiliki ekstensi.crt:sudo cp root-ca-cert.pem /usr/local/share/ca-certificates/cas-rootca.crtTetapkan izin file sehingga semua pengguna dapat membaca file sertifikat CA root:
sudo chmod 644 /usr/local/share/ca-certificates/cas-rootca.crtJalankan skrip
update-ca-certificates:sudo update-ca-certificatesSkrip ini menambahkan sertifikat ke set sertifikat tepercaya di direktori
/etc/ssl/certs, dan ke file/etc/ssl/certs/ca-certificates.crt.Outputnya adalah sebagai berikut:
Updating certificates in /etc/ssl/certs... 1 added, 0 removed; done. Running hooks in /etc/ca-certificates/update.d... done.
Gunakan
curluntuk mengirim permintaan HTTPS dari instance VM ke aplikasi contoh:curl --cert client-cert-chain.pem --key private-key.pem \ --resolve hello.example.com:443:$(cat ilb-ip.txt) \ --silent https://hello.example.com | head -n1Outputnya akan terlihat seperti ini:
Hello, world!
Respons ini menunjukkan bahwa
curlberhasil mengirim permintaan HTTPS menggunakan mTLS, dan memvalidasi sertifikat TLS server dari gateway ingress menggunakan penyimpanan sertifikat CA default.Keluar dari sesi SSH:
exit
Memecahkan masalah
Jika pengontrol penerbit Layanan CA tidak membuat secret sertifikat TLS, lihat log pengontrol penerbit Layanan CA:
kubectl logs deployment/google-cas-issuer --namespace cert-manager
Jika Anda mengalami masalah saat menginstal Cloud Service Mesh, jalankan alat asmcli untuk memvalidasi project Cloud dan cluster GKE Anda.
Jika Anda mengalami masalah lain dengan tutorial ini, sebaiknya tinjau dokumen berikut:
- Pertanyaan umum (FAQ) terkait Layanan CA
- Pemecahan masalah Cloud Service Mesh langkah demi langkah
- Menyelesaikan masalah Cloud Service Mesh terkelola
- Masalah umum operasi Istio
- Pemecahan masalah GKE
- Memecahkan masalah cluster Kubernetes
Pembersihan
Agar akun Google Cloud Anda tidak terus dikenai biaya untuk resource yang digunakan dalam tutorial ini, Anda dapat menghapus project atau menghapus setiap resource.
Menghapus project
Di Cloud Shell, hapus project:
gcloud projects delete PROJECT_ID
Menghapus resource
Jika Anda ingin menyimpan Google Cloud project yang digunakan dalam tutorial ini, hapus setiap resource:
Di Cloud Shell, batalkan pendaftaran cluster GKE dari GKE Fleet:
gcloud container hub memberships unregister CLUSTER_NAME \ --gke-cluster ZONE/CLUSTER_NAMEHapus cluster GKE:
gcloud container clusters delete CLUSTER_NAME \ --zone ZONE --async --quietHapus binding kebijakan IAM di kumpulan CA bawahan:
gcloud privateca pools remove-iam-policy-binding SUBORDINATE_CA_POOL_GATEWAYS \ --location CA_LOCATION \ --member "serviceAccount:CAS_ISSUER_GSA@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/privateca.certificateRequester gcloud privateca pools remove-iam-policy-binding SUBORDINATE_CA_POOL_GATEWAYS \ --location CA_LOCATION \ --member "serviceAccount:CLIENT_VM_GSA@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/privateca.certificateRequesterNonaktifkan dan jadwalkan penghapusan CA subordinat dan CA root:
gcloud privateca subordinates disable SUBORDINATE_CA_GATEWAYS \ --location CA_LOCATION \ --pool SUBORDINATE_CA_POOL_GATEWAYS \ --quiet gcloud privateca subordinates delete SUBORDINATE_CA_GATEWAYS \ --location CA_LOCATION \ --pool SUBORDINATE_CA_POOL_GATEWAYS \ --ignore-active-certificates \ --quiet gcloud privateca subordinates disable SUBORDINATE_CA_SIDECARS \ --location CA_LOCATION \ --pool SUBORDINATE_CA_POOL_SIDECARS \ --quiet gcloud privateca subordinates delete SUBORDINATE_CA_SIDECARS \ --location CA_LOCATION \ --pool SUBORDINATE_CA_POOL_SIDECARS \ --ignore-active-certificates \ --quiet gcloud privateca roots disable ROOT_CA \ --location CA_LOCATION \ --pool ROOT_CA_POOL \ --quiet gcloud privateca roots delete ROOT_CA \ --location CA_LOCATION \ --pool ROOT_CA_POOL \ --ignore-active-certificates \ --quietHapus binding kebijakan IAM untuk akun layanan Google penerbit CA Service:
gcloud iam service-accounts remove-iam-policy-binding \ CAS_ISSUER_GSA@PROJECT_ID.iam.gserviceaccount.com \ --member "serviceAccount:PROJECT_ID.svc.id.goog[cert-manager/ksa-google-cas-issuer]" \ --role roles/iam.workloadIdentityUserHapus akun layanan Google:
gcloud iam service-accounts delete --quiet \ CAS_ISSUER_GSA@PROJECT_ID.iam.gserviceaccount.com gcloud iam service-accounts delete --quiet \ CLIENT_VM_GSA@PROJECT_ID.iam.gserviceaccount.comHapus alamat IP load balancer yang dicadangkan:
gcloud compute addresses delete asm-ingress-gateway-ilb \ --region REGION --quietHapus instance VM Compute Engine:
gcloud compute instances delete cas-tutorial-client \ --zone ZONE --quiet
Langkah berikutnya
- Pelajari panduan cara kerja Certificate Authority Service lainnya.
- Pelajari lebih lanjut Cloud Service Mesh, rangkaian alat berbasis Istio yang membantu Anda memantau dan mengelola mesh layanan yang andal di infrastruktur lokal dan di Google Cloud.
- Pelajari panduan cara kerja Cloud Service Mesh.