{"id":6155,"date":"2018-12-11T10:51:59","date_gmt":"2018-12-11T18:51:59","guid":{"rendered":"http:\/\/www.couchbase.com\/blog\/?p=6155"},"modified":"2025-06-13T23:43:00","modified_gmt":"2025-06-14T06:43:00","slug":"autonomous-operator-testing-on-azure-aks","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/autonomous-operator-testing-on-azure-aks\/","title":{"rendered":"Como certificar o operador aut\u00f4nomo do Couchbase no Azure AKS"},"content":{"rendered":"<p><span style=\"font-weight: 400\">Our goal on the Couchbase Kubernetes testing team is to rigorously test the <a href=\"https:\/\/www.couchbase.com\/products\/cloud\/kubernetes\/\">Autonomous Operator<\/a> (AO) and certify the underlying Couchbase Server clusters that the AO manages. We test the AO for proper creation, management, and failure recovery of the managed CB cluster. Furthermore, we test that the CB cluster, services, and features themselves all work correctly. Previously, we have done all of our testings on custom Kubernetes and Openshift clusters on-prem, but now we are certifying the AO on multiple Kubernetes services in the cloud. The first such certification is for Azure Kubernetes Service (AKS). Running our tests with AKS posed new challenges in creating and configuring the test environment compared to custom on-prem environments. The solutions to these challenges are highlighted in this post.<\/span><\/p>\n<p><span style=\"font-weight: 400\">*<\/span><b>Note<\/b><span style=\"font-weight: 400\"> &#8211; Couchbase Autonomous Operator is still in developer preview on Azure AKS, and we\u2019re targeting GA in our upcoming 1.2 release targeted for Q1 2019.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Requirements for our Kubernetes Test Framework <\/span><\/h2>\n<p><span style=\"font-weight: 400\">Our test framework executes several different types of tests ranging from necessary cluster creation to multi-node failure recovery with persistent volumes. We also test XDCR across 3 different topologies defined by where the two CB clusters reside: single K8s cluster, two different K8s clusters, and one K8s to one non-K8s. To run the full test suite we must (1) set up two separate AKS cluster that allows for XDCR. (2) Our test framework must be able to interact with each AKS cluster over public internet (3) We also must be able to reach the CB clusters within the AKS clusters from the public internet. (4) At least one dynamic storage class must be present in AKS for our persistent volume tests. In the following section, the steps taken to meet these requirements will be elucidated.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-6156\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/12\/AKS-Test-Topology.png\" alt=\"\" width=\"897\" height=\"583\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/AKS-Test-Topology.png 897w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/AKS-Test-Topology-300x195.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/AKS-Test-Topology-768x499.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/AKS-Test-Topology-20x13.png 20w\" sizes=\"auto, (max-width: 897px) 100vw, 897px\" \/><\/p>\n<h2><span style=\"font-weight: 400\">Creating XDCR-Ready AKS Clusters<\/span><\/h2>\n<p><span style=\"font-weight: 400\">The main hurdle for XDCR to work between to CB clusters (in K8s or otherwise) is that a Layer 3 route must exist between the two CB clusters. CB nodes will use internal IP addresses provided by K8s API based on the network configuration of the AKS cluster. By default, two AKS clusters will use the same internal address ranges which will cause outgoing XDCR traffic to never reach its destination in the other AKS cluster. <\/span><b>The solution is to set up the two AKS clusters such that their internal networks can peer. Peering will allow the CB clusters in each AKS cluster to communicate correctly using their internal IP addresses.<\/b><span style=\"font-weight: 400\"> To set up network peering in AKS we need to determine the non-overlapping network prefixes to use for each AKS cluster. Then based on these prefixes, we need to determine a cluster subnet for the Kubernetes nodes, a service subnet for Kubernetes pods that don&#8217;t overlap with the cluster subnet, a DNS address in each service subnet, and a Docker overlay network. The following table shows the proper network configuration for each AKS cluster.<\/span><\/p>\n<table style=\"height: 449px\" width=\"910\">\n<tbody>\n<tr>\n<td><b>Cluster<\/b><\/td>\n<td><span style=\"font-weight: 400\">AKS-cluster-1<\/span><\/td>\n<td><span style=\"font-weight: 400\">AKS-cluster-2<\/span><\/td>\n<\/tr>\n<tr>\n<td><b>Prefix<\/b><\/td>\n<td><span style=\"font-weight: 400\">10.0.0.0\/12<\/span><\/td>\n<td><span style=\"font-weight: 400\">10.16.0.0\/12<\/span><\/td>\n<\/tr>\n<tr>\n<td><b>Cluster Subnet<\/b><\/td>\n<td><span style=\"font-weight: 400\">10.8.0.0\/16<\/span><\/td>\n<td><span style=\"font-weight: 400\">10.24.0.0\/16<\/span><\/td>\n<\/tr>\n<tr>\n<td><b>Service Subnet<\/b><\/td>\n<td><span style=\"font-weight: 400\">10.0.0.0\/16<\/span><\/td>\n<td><span style=\"font-weight: 400\">10.16.0.0\/16<\/span><\/td>\n<\/tr>\n<tr>\n<td><b>DNS Address<\/b><\/td>\n<td><span style=\"font-weight: 400\">10.0.0.10<\/span><\/td>\n<td><span style=\"font-weight: 400\">10.16.0.10<\/span><\/td>\n<\/tr>\n<tr>\n<td><b>Docker Bridge Address<\/b><\/td>\n<td><span style=\"font-weight: 400\">172.17.0.1\/16<\/span><\/td>\n<td><span style=\"font-weight: 400\">172.17.0.1\/16<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-weight: 400\">Now that the proper network configuration is determined we can create these two AKS clusters from the Azure Portal. Creating each cluster will mostly follow the instruction provided by Azure here, <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/aks\/kubernetes-walkthrough-portal\">https:\/\/docs.microsoft.com\/en-us\/azure\/aks\/kubernetes-walkthrough-portal<\/a> [1], with the only difference being in the network setup (step 3). These step will be for AKS-cluster-1 and will use the corresponding network values determined earlier. Steps for AKS-cluster-2 will be the same, using the AKS-cluster-2 network values. Once the networking step is reached, enable HTTP application routing and choose advanced network configuration.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-6160\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/12\/Screen-Shot-2018-10-24-at-3.21.50-PM-1024x758.png\" alt=\"\" width=\"900\" height=\"666\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.21.50-PM-1024x758.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.21.50-PM-300x222.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.21.50-PM-768x569.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.21.50-PM-1536x1138.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.21.50-PM-20x15.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.21.50-PM-1320x978.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.21.50-PM.png 1542w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p><span style=\"font-weight: 400\">Create a new virtual network using the prefix and cluster subnet determined earlier.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-6159\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/12\/Screen-Shot-2018-10-24-at-3.20.58-PM-1024x639.png\" alt=\"\" width=\"900\" height=\"562\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.20.58-PM-1024x639.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.20.58-PM-300x187.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.20.58-PM-768x479.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.20.58-PM-1536x958.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.20.58-PM-20x12.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.20.58-PM-1320x824.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.20.58-PM.png 1702w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p><span style=\"font-weight: 400\">Fill in the remaining fields in the networking tab with the service subnet, DNS address, and Docker overlay values.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-6160\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/12\/Screen-Shot-2018-10-24-at-3.21.50-PM-1024x758.png\" alt=\"\" width=\"900\" height=\"666\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.21.50-PM-1024x758.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.21.50-PM-300x222.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.21.50-PM-768x569.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.21.50-PM-1536x1138.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.21.50-PM-20x15.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.21.50-PM-1320x978.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.21.50-PM.png 1542w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><span style=\"font-weight: 400\">Proceed setting up the AKS cluster according to the documentation. While AKS-cluster-1 is deploying, setup AKS-cluster-2 using the same steps.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Now that we have two AKS clusters with proper network configuration, we can set up network peering. In the UI, navigate to the virtual network AKS-cluster-1-vnet created for AKS-cluster-1, select the Peerings tab and click Add to create a new peering.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-6161\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/12\/Screen-Shot-2018-10-24-at-3.57.13-PM-1024x582.png\" alt=\"\" width=\"900\" height=\"512\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.57.13-PM-1024x582.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.57.13-PM-300x170.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.57.13-PM-768x436.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.57.13-PM-1536x872.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.57.13-PM-20x11.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.57.13-PM-1320x750.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.57.13-PM.png 2048w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><span style=\"font-weight: 400\">Give the peering a name like AKS-cluster-1-AKS-cluster-2 and select AKS-cluster-2-vnet as the virtual network.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-6162\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/12\/Screen-Shot-2018-10-24-at-3.59.46-PM-1024x994.png\" alt=\"\" width=\"900\" height=\"874\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.59.46-PM-1024x994.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.59.46-PM-300x291.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.59.46-PM-768x745.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.59.46-PM-50x50.png 50w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.59.46-PM-20x20.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-3.59.46-PM.png 1156w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">Peering requires both networks to peer, so we must also set up peering from AKS-cluster-2-vnet to AKS-cluster-1-vnet in a similar manner. Once complete, the two AKS clusters can host CB clusters with XDCR.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Accessing AKS Kubernetes API Over Public Internet<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Since our test framework runs from outside AKS, we will need to set up external access to the Kubernetes API for each AKS cluster. This process is relatively straightforward. We need to modify the Network Security Group Inbound and Outbound rules for each AKS cluster. Navigate to the Network Security Group for AKS-cluster-1, select Inbound security rules and then Add to create a new rule. To make the setup simple, create this rule allowing any source IP\/port and destination IP\/port. Give this rule the priority number 102.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-6163\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/12\/Screen-Shot-2018-10-24-at-4.03.02-PM-1024x570.png\" alt=\"\" width=\"900\" height=\"501\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-4.03.02-PM-1024x570.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-4.03.02-PM-300x167.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-4.03.02-PM-768x427.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-4.03.02-PM-1536x855.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-4.03.02-PM-2048x1139.png 2048w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-4.03.02-PM-20x11.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-4.03.02-PM-1320x734.png 1320w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><br \/>\n<span style=\"font-weight: 400\">Now, do the same for outbound security rules. Then modify the inbound and outbound security rules for AKS-cluster-2 similarly.<\/span><\/p>\n<p><span style=\"font-weight: 400\">The next step is to pull down the kubeconfig file (credentials) for each AKS cluster. These files are used by the test framework to access and interact with the Kubernetes API. Make sure you have the Azure CLI installed locally, as outlined here: <a href=\"https:\/\/docs.microsoft.com\/en-us\/cli\/azure\/install-azure-cli?view=azure-cli-latest\">https:\/\/docs.microsoft.com\/en-us\/cli\/azure\/install-azure-cli?view=azure-cli-latest<\/a> [2]. You will also need to have kubectl installed locally, as outlined here: <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-kubectl\/\">https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-kubectl\/<\/a> [3]. Once both are installed and working, run the following commands to pull down the kubeconfig file for AKS-cluster-1 and AKS-cluster-2:<\/span><\/p>\n<pre class=\"\">az aks get-credentials --resource-group AKS-cluster-1 --name aks-cluster-1\r\naz aks get-credentials --resource-group AKS-cluster-2 --name aks-cluster-2<\/pre>\n<p><span style=\"font-weight: 400\">The cluster credentials will be stored in ~\/.kube\/config file. For our testing framework, we separate out each cluster\u2019s credentials into their own files: ~\/.kube\/config_aks_cluster_1 and ~\/.kube\/config_aks_cluster_2. <\/span><\/p>\n<h2><span style=\"font-weight: 400\">Accessing CB Pods in AKS<\/span><\/h2>\n<p><span style=\"font-weight: 400\">At this point, our test framework can interact with two AKS clusters\u2019 Kubernetes API. This allows the test framework to install the AO and create AO managed CB clusters for our tests. The test framework, however, needs to interact with CB pods via REST calls for most of our tests. Previously, the test framework would have the AO expose the CB REST API as a Kubernetes nodeport service. This service would create a port on the Kubernetes node, that would forward traffic to the CB pod REST API port inside the Kubernetes node. These services were accessible via the Kubernetes node\u2019s private IP address. This was not a problem since our on-prem Kubernetes cluster, and test framework lived in the same private network. With AKS, however, our test framework is not colocated with the AKS Kubernetes nodes and cannot access a node port service that uses the private IPs of these nodes. <\/span><b>The solution to this is simple: once the AO creates the CB cluster and nodeport service, have the test framework change the nodeport service Spec. Type field to LoadBalancer. This is accomplished in the following chunk of Go code:<\/b><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-6164\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/12\/Screen-Shot-2018-10-24-at-4.44.48-PM-1024x205.png\" alt=\"\" width=\"900\" height=\"180\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-4.44.48-PM-1024x205.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-4.44.48-PM-300x60.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-4.44.48-PM-768x153.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-4.44.48-PM-20x4.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-4.44.48-PM-1320x264.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/Screen-Shot-2018-10-24-at-4.44.48-PM.png 1462w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p><span style=\"font-weight: 400\">When the nodeport service Type is changed to LoadBalancer, AKS will assign a public IP to the service. Using this new public IP, the test framework can successfully make calls to the CB REST API, even from outside AKS. In the next major release, Autonomous Operator 1.2, the AO will have an option to expose either a nodeport service or a load balancer service and any changes to AO deployed services will cause the AO to reconcile the service back. Therefore, the solution we use in our test framework is only temporary, and in the future, we will move to create standalone load balancer services and using the AO created the load balancer.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Enabling Dynamic Persistent Volumes<\/span><\/h2>\n<p><span style=\"font-weight: 400\">The AO allows a CB cluster to bind to dynamically provisioned persistent volumes. This makes the CB cluster very resilient to data loss in the event one or more CB pod goes down. Our testing framework has many complex failure scenarios that involve CB pods storing data in persistent volumes. In some failure scenarios, the AO will restart the failed pod on a different Kubernetes node using the failed pods persistent volume. Therefore, we must use persistent volumes that can be moved from one Kubernetes node to another. On AKS two types of storage classes can be used for persistent volumes: AzureDisk and AzureFile. The default storage class that AKS provide is AzureDisk, but this storage class cannot create moveable persistent volumes. AzureFile is implemented in a way that allows moveable persistent volumes and will be the storage class solution we test with on AKS. Azure provides instruction to set up the AzureFile storage class here:<\/span><\/p>\n<p><a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/aks\/azure-files-dynamic-pv\"><span style=\"font-weight: 400\">https:\/\/docs.microsoft.com\/en-us\/azure\/aks\/azure-files-dynamic-pv<\/span><\/a><span style=\"font-weight: 400\"> [4].<\/span><\/p>\n<p><span style=\"font-weight: 400\">The setup involves first creating a storage account with:<\/span><\/p>\n<pre class=\"\">az aks show --resource-group AKS-cluster-1 --name AKS-cluster-1 --query nodeResourceGroup -o tsv\r\nMC_AKS-cluster-1_aks-cluster-1_westus\r\n\r\naz storage account create --resource-group MC_AKS-cluster-1_aks-cluster-1_westus --name mystorageaccount --sku Standard_LRS<\/pre>\n<p><span style=\"font-weight: 400\">Then, submit a storage class, cluster role, and cluster role binding spec to Kubernetes:<\/span><\/p>\n<pre>##azure-file-sc.yaml\r\nkind:StorageClass\r\napiVersion: storage.k8s.io\/v1\r\nmetadata:\r\n \u00a0name: azurefile\r\nprovisioner: kubernetes.io\/azure-file\r\nmountOptions:\r\n \u00a0- dir_mode=0777\r\n \u00a0- file_mode=0777\r\n \u00a0- uid=1000\r\n \u00a0- gid=1000\r\nparameters:\r\n \u00a0skuName: Standard_LRS\r\n \u00a0storageAccount: mystorageaccount<\/pre>\n<pre>kubectl apply -f azure-file-sc.yaml<\/pre>\n<pre>##azure-pvc-roles.yaml\r\n---\r\napiVersion: rbac.authorization.k8s.io\/v1\r\nkind: ClusterRole\r\nmetadata:\r\n \u00a0name: system:azure-cloud-provider\r\nrules:\r\n- apiGroups: ['']\r\n \u00a0resources: ['secrets']\r\n \u00a0verbs: \u00a0\u00a0\u00a0\u00a0['get','create']\r\n---\r\napiVersion: rbac.authorization.k8s.io\/v1\r\nkind: ClusterRoleBinding\r\nmetadata:\r\n \u00a0name: system:azure-cloud-provider\r\nroleRef:\r\n \u00a0kind: ClusterRole\r\n \u00a0apiGroup: rbac.authorization.k8s.io\r\n \u00a0name: system:azure-cloud-provider\r\nsubjects:\r\n- kind: ServiceAccount&lt;\r\n \u00a0name: persistent-volume-binder\r\n \u00a0namespace: kube-system<\/pre>\n<pre>kubectl apply -f azure-pvc-roles.yaml<\/pre>\n<p><span style=\"font-weight: 400\">Now we have our AzureFile storage class setup and ready use in AKS-cluster-1. We must do the same process for AKS-cluster-2.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Testing The Operator<\/span><\/h2>\n<p><span style=\"font-weight: 400\">At this point, we have everything we need to run the full suite of tests for the AO: 2 XDCR-ready Kubernetes cluster, accessible from public internet (Kubernetes API and CB REST API), with dynamic persistent volumes enabled. During the initial test, we noticed some odd failures. These were caused mostly by timeouts in our test framework, and we were able to pinpoint the cause: AKS is extremely slow compared to on-prem Kubernetes cluster. The time it takes to spin up a CB pod can take up to 5 times longer. To resolve this issue, we had to create variable timeouts depending on what type of Kubernetes cluster is being used. After that, the tests all ran fine, and no significant issues with the AO or CB cluster were found.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Conclusion<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Recently, the Couchbase testing team has been focusing on certifying the AO for use on primary cloud-provided Kubernetes services such as AKS, EKS, and GCP. The first cloud we focused on was AKS, and it brought several platform-specific challenges such as cloud-specific network configuration, accessibility, and storage class creation. However, we resolved these issues and now can run our automated test framework using AKS clusters. We will continue working on certifying other clouds in the coming months, but in the meantime, have some fun on AKS.<\/span><\/p>\n<p><span style=\"font-weight: 400\">References:<\/span><\/p>\n<p><span style=\"font-weight: 400\">[1] <\/span><a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/aks\/kubernetes-walkthrough-portal\"><span style=\"font-weight: 400\">https:\/\/docs.microsoft.com\/en-us\/azure\/aks\/kubernetes-walkthrough-portal<\/span><\/a><\/p>\n<p>[2] <a href=\"https:\/\/docs.microsoft.com\/en-us\/cli\/azure\/install-azure-cli?view=azure-cli-latest\"><span style=\"font-weight: 400\">https:\/\/docs.microsoft.com\/en-us\/cli\/azure\/install-azure-cli?view=azure-cli-latest<\/span><\/a><\/p>\n<p>[3] <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-kubectl\/\"><span style=\"font-weight: 400\">https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-kubectl\/<\/span><\/a><\/p>\n<p>[4] <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/aks\/azure-files-dynamic-pv\"><span style=\"font-weight: 400\">https:\/\/docs.microsoft.com\/en-us\/azure\/aks\/azure-files-dynamic-pv<\/span><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Our goal on the Couchbase Kubernetes testing team is to rigorously test the Autonomous Operator (AO) and certify the underlying Couchbase Server clusters that the AO manages. We test the AO for proper creation, management, and failure recovery of the [&hellip;]<\/p>\n","protected":false},"author":13828,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[9284,2225,2322],"tags":[1545,1673],"ppma_author":[9069],"class_list":["post-6155","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-autonomous-operator","category-cloud","category-kubernetes","tag-kubernetes","tag-microsoft-azure"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>How to Certify Couchbase Autonomous Operator On Azure AKS<\/title>\n<meta name=\"description\" content=\"How we built our test framework to certify the Couchbase Autonomous Operator on Azure ensuring proper creation, management, and recovery.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/autonomous-operator-testing-on-azure-aks\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Certify Couchbase Autonomous Operator On Azure AKS\" \/>\n<meta property=\"og:description\" content=\"How we built our test framework to certify the Couchbase Autonomous Operator on Azure ensuring proper creation, management, and recovery.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/autonomous-operator-testing-on-azure-aks\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-12-11T18:51:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:43:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/AKS-Test-Topology.png\" \/>\n\t<meta property=\"og:image:width\" content=\"897\" \/>\n\t<meta property=\"og:image:height\" content=\"583\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Korrigan Clark\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Korrigan Clark\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/autonomous-operator-testing-on-azure-aks\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/autonomous-operator-testing-on-azure-aks\\\/\"},\"author\":{\"name\":\"Korrigan Clark\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/7c204a2d8fcb7858db7ab30e0a02fee8\"},\"headline\":\"How to Certify Couchbase Autonomous Operator On Azure AKS\",\"datePublished\":\"2018-12-11T18:51:59+00:00\",\"dateModified\":\"2025-06-14T06:43:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/autonomous-operator-testing-on-azure-aks\\\/\"},\"wordCount\":1753,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/autonomous-operator-testing-on-azure-aks\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/11\\\/couchbase-nosql-dbaas.png\",\"keywords\":[\"kubernetes\",\"Microsoft Azure\"],\"articleSection\":[\"Couchbase Autonomous Operator\",\"Couchbase Capella\",\"Kubernetes\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/autonomous-operator-testing-on-azure-aks\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/autonomous-operator-testing-on-azure-aks\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/autonomous-operator-testing-on-azure-aks\\\/\",\"name\":\"How to Certify Couchbase Autonomous Operator On Azure AKS\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/autonomous-operator-testing-on-azure-aks\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/autonomous-operator-testing-on-azure-aks\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/11\\\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2018-12-11T18:51:59+00:00\",\"dateModified\":\"2025-06-14T06:43:00+00:00\",\"description\":\"How we built our test framework to certify the Couchbase Autonomous Operator on Azure ensuring proper creation, management, and recovery.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/autonomous-operator-testing-on-azure-aks\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/autonomous-operator-testing-on-azure-aks\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/autonomous-operator-testing-on-azure-aks\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/11\\\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/11\\\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/autonomous-operator-testing-on-azure-aks\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Certify Couchbase Autonomous Operator On Azure AKS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/04\\\/admin-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/04\\\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/7c204a2d8fcb7858db7ab30e0a02fee8\",\"name\":\"Korrigan Clark\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/17fb5623a0f44f54900424157335e2135c62a342f12a14cabe152a9d6034fd4d?s=96&d=mm&r=g0ebfb10631fa5355ed00af2eb7ca5911\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/17fb5623a0f44f54900424157335e2135c62a342f12a14cabe152a9d6034fd4d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/17fb5623a0f44f54900424157335e2135c62a342f12a14cabe152a9d6034fd4d?s=96&d=mm&r=g\",\"caption\":\"Korrigan Clark\"},\"description\":\"Korrigan Clark is a Software Engineer in Test at Couchbase.\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/author\\\/korrigan-clark\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Como certificar o operador aut\u00f4nomo do Couchbase no Azure AKS","description":"Como criamos nossa estrutura de teste para certificar o Operador Aut\u00f4nomo do Couchbase no Azure, garantindo a cria\u00e7\u00e3o, o gerenciamento e a recupera\u00e7\u00e3o adequados.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/autonomous-operator-testing-on-azure-aks\/","og_locale":"pt_BR","og_type":"article","og_title":"How to Certify Couchbase Autonomous Operator On Azure AKS","og_description":"How we built our test framework to certify the Couchbase Autonomous Operator on Azure ensuring proper creation, management, and recovery.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/autonomous-operator-testing-on-azure-aks\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-12-11T18:51:59+00:00","article_modified_time":"2025-06-14T06:43:00+00:00","og_image":[{"width":897,"height":583,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/12\/AKS-Test-Topology.png","type":"image\/png"}],"author":"Korrigan Clark","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Korrigan Clark","Est. reading time":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/autonomous-operator-testing-on-azure-aks\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/autonomous-operator-testing-on-azure-aks\/"},"author":{"name":"Korrigan Clark","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/7c204a2d8fcb7858db7ab30e0a02fee8"},"headline":"How to Certify Couchbase Autonomous Operator On Azure AKS","datePublished":"2018-12-11T18:51:59+00:00","dateModified":"2025-06-14T06:43:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/autonomous-operator-testing-on-azure-aks\/"},"wordCount":1753,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/autonomous-operator-testing-on-azure-aks\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["kubernetes","Microsoft Azure"],"articleSection":["Couchbase Autonomous Operator","Couchbase Capella","Kubernetes"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/autonomous-operator-testing-on-azure-aks\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/autonomous-operator-testing-on-azure-aks\/","url":"https:\/\/www.couchbase.com\/blog\/autonomous-operator-testing-on-azure-aks\/","name":"Como certificar o operador aut\u00f4nomo do Couchbase no Azure AKS","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/autonomous-operator-testing-on-azure-aks\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/autonomous-operator-testing-on-azure-aks\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2018-12-11T18:51:59+00:00","dateModified":"2025-06-14T06:43:00+00:00","description":"Como criamos nossa estrutura de teste para certificar o Operador Aut\u00f4nomo do Couchbase no Azure, garantindo a cria\u00e7\u00e3o, o gerenciamento e a recupera\u00e7\u00e3o adequados.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/autonomous-operator-testing-on-azure-aks\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/autonomous-operator-testing-on-azure-aks\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/autonomous-operator-testing-on-azure-aks\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/autonomous-operator-testing-on-azure-aks\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Certify Couchbase Autonomous Operator On Azure AKS"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/7c204a2d8fcb7858db7ab30e0a02fee8","name":"Korrigan Clark","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/secure.gravatar.com\/avatar\/17fb5623a0f44f54900424157335e2135c62a342f12a14cabe152a9d6034fd4d?s=96&d=mm&r=g0ebfb10631fa5355ed00af2eb7ca5911","url":"https:\/\/secure.gravatar.com\/avatar\/17fb5623a0f44f54900424157335e2135c62a342f12a14cabe152a9d6034fd4d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/17fb5623a0f44f54900424157335e2135c62a342f12a14cabe152a9d6034fd4d?s=96&d=mm&r=g","caption":"Korrigan Clark"},"description":"Korrigan Clark \u00e9 engenheiro de software de teste na Couchbase.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/korrigan-clark\/"}]}},"acf":[],"authors":[{"term_id":9069,"user_id":13828,"is_guest":0,"slug":"korrigan-clark","display_name":"Korrigan Clark","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/17fb5623a0f44f54900424157335e2135c62a342f12a14cabe152a9d6034fd4d?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/6155","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/13828"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=6155"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/6155\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=6155"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=6155"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=6155"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=6155"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}