{"id":12198,"date":"2019-01-17T13:00:55","date_gmt":"2019-01-17T12:00:55","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/"},"modified":"2023-07-13T16:35:08","modified_gmt":"2023-07-13T14:35:08","slug":"deploying-sql-server-2019-availability-groups-with-helm-charts","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/","title":{"rendered":"Deploying SQL Server 2019 AGs on K8s with helm charts"},"content":{"rendered":"<p>This write-up follows <a href=\"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-on-k8s-with-helm-charts\/\" target=\"_blank\" rel=\"noopener noreferrer\">my first article<\/a> about helm chart with SQL Server. This time, I would like to cover the availability groups topic and how to deploy them with helm charts.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-30628 size-full\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-151-0-banner-e1547730004421.jpg\" alt=\"blog 151 - 0 - banner\" width=\"300\" height=\"268\" \/><\/p>\n<p>In fact, to go through this feature for AGs was motivated to its usage in our Azure DevOps CI pipeline in order to deploy a configurable one on an AKS cluster with SQL Server 2019.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-30622\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/151-1-DevOpsAzureHelm-e1547728709507.jpg\" alt=\"151 - 1 - DevOpsAzureHelm\" width=\"900\" height=\"413\" \/><\/p>\n<p>If you look carefully at the release pipeline, <a href=\"https:\/\/www.windocks.com\/\">Windocks<\/a> is also another product we are using for our integration testing with SQL Server containers and I will probably explain more on this topic in a future blog post. But this time I would like to share some experiences with the construction of the AG helm chart.<\/p>\n<p>First of all let\u2019s precise I used the content provided by Microsoft on <a href=\"https:\/\/github.com\/Microsoft\/sql-server-samples\/tree\/master\/samples\/features\/high%20availability\/Kubernetes\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub<\/a> to deploy availability groups on K8s. This is a new functionality of SQL Server 2019 and we run actually with CTP 2.1 version. Chances are things will likely change over the time and I may bet Microsoft will release their own helm chart in the future. Anyway, for me it was an interesting opportunity to deep dive in helm charts feature.<\/p>\n<p>First step I ran into was the parametrization (one big interest of Helm) of the existing template with input values including AG\u2019s name, image container repository and tag used for deployment and different service settings like service type, service port and target service port.<\/p>\n<p>Here one of my <strong><em>values.yaml<\/em> <\/strong>file:<\/p>\n<pre class=\"brush: xml; gutter: true; first-line: 1\"># General parameters\nagname: ag1\nacceptEula: true\n# Container parameters\nagentsContainerImage:\n  repository: mcr.microsoft.com\/mssql\/ha\n  tag: 2019-CTP2.1-ubuntu\n  pullPolicy: IfNotPresent\nsqlServerContainer:\n  repository: mcr.microsoft.com\/mssql\/server\n  tag: 2019-CTP2.1-ubuntu\n  pullPolicy: IfNotPresent\n# Service parameters\nsqlservice:\n  type: LoadBalancer\n  port: 1433\nagservice:\n  type: LoadBalancer\n  port: 1433<\/pre>\n<p>As a reminder, services on K8s are a way to expose pods to the outside world. I also introduced some additional labels for the purpose of querying the system. This is basically the same labels used in the <a href=\"https:\/\/github.com\/helm\/charts\/tree\/master\/stable\/mssql-linux\" target=\"_blank\" rel=\"noopener noreferrer\">stable template on GitHub<\/a>.<\/p>\n<pre class=\"brush: xml; gutter: true; first-line: 1\">labels:\n    \u2026\n    app: {{ template \"dbi_mssql_ag.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}<\/pre>\n<p>Here a sample of my <em><strong>ag-sqlserver-deployment.yaml<\/strong> <\/em>file with parametrization stuff:<\/p>\n<pre class=\"brush: xml; gutter: true; first-line: 1\">apiVersion: mssql.microsoft.com\/v1\nkind: SqlServer\nmetadata:\n  labels:\n    name: mssql1\n    type: sqlservr\n    app: {{ template \"dbi_mssql_ag.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n  name: mssql1\n  namespace: {{ .Release.Namespace }}\nspec:\n  acceptEula: true\n  agentsContainerImage: {{ .Values.agentsContainerImage.repository }}:{{ .Values.agentsContainerImage.tag }}\n  availabilityGroups: [{{ .Values.agname }}]\n  instanceRootVolumeClaimTemplate:\n    accessModes: [ReadWriteOnce]\n    resources:\n      requests: {storage: 5Gi}\n    storageClass: default\n  saPassword:\n    secretKeyRef: {key: sapassword, name: sql-secrets}\n  masterKeyPassword:\n    secretKeyRef: {key: masterkeypassword, name: sql-secrets} \n  sqlServerContainer: {image: '{{ .Values.sqlServerContainer.repository }}:{{ .Values.sqlServerContainer.tag }}'}<\/pre>\n<p>In addition, for a sake of clarity, I also took the opportunity to break the YAML files provided by Microsoft into different pieces including AG operator, AG RBAC configuration (security), AG instances and resources and AG services files. But you may wonder (like me) how to control the ordering of object\u2019s creation? Well, it is worth noting that Helm collects all of the resources in a given Chart and it&#8217;s dependencies, groups them by resource type, and then installs them in a <a href=\"https:\/\/github.com\/helm\/helm\/blob\/release-2.10\/pkg\/tiller\/kind_sorter.go#L29\">pre-defined order<\/a>.<\/p>\n<p>Let\u2019 say I also removed the existing namespace\u2019s creation from the existing YAML file because currently helm charts are not able to create one if it doesn\u2019t exist. From a security perspective my concern was to keep the release deployment under control through helm charts so I preferred to precise the namespace directly in the <em>\u2013namespace<\/em> parameter as well as creating the sql-secrets object which contains both sa and master key passwords manually according to the <a href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/linux\/sql-server-linux-kubernetes-deploy?view=sqlallproducts-allversions\">Microsoft documentation<\/a>. In this way, you may segregate the permissions tiller has on a specific namespace and in my case, tiller has access to the ci namespace only.<\/p>\n<p>Here comes likely the most interesting part. During the first deployment attempt, I had to face was the dependency that exists between the AG operator, SQL Server and AG resources as stated <a href=\"https:\/\/cloudblogs.microsoft.com\/sqlserver\/2018\/12\/10\/availability-groups-on-kubernetes-in-sql-server-2019-preview\/\">here<\/a>:<\/p>\n<blockquote><p><strong><em>The operator implements and registers the custom resource definition for SQL Server and the Availability Group resources.<\/em><\/strong><\/p><\/blockquote>\n<p>The custom resource definition (CRD) is one of the first components with the deployment of the AG operator. You may retrieve an API service v1.mssql.microsoft.com as show below:<\/p>\n<pre class=\"brush: shell; gutter: true; first-line: 1\">$ kubectl describe apiservice v1.mssql.microsoft.com\nName:         v1.mssql.microsoft.com\nNamespace:\nLabels:       kube-aggregator.kubernetes.io\/automanaged=true\nAnnotations:  &lt;none&gt;\nAPI Version:  apiregistration.k8s.io\/v1\nKind:         APIService\nMetadata:\n  Creation Timestamp:  2019-01-17T01:45:19Z\n  Resource Version:    283588\n  Self Link:           \/apis\/apiregistration.k8s.io\/v1\/apiservices\/v1.mssql.microsoft.com\n  UID:                 8b90159d-19f9-11e9-96ba-ee2da997daf5\nSpec:\n  Group:                   mssql.microsoft.com\n  Group Priority Minimum:  1000\n  Service:                 &lt;nil&gt;\n  Version:                 v1\n  Version Priority:        100\nStatus:\n  Conditions:\n    Last Transition Time:  2019-01-17T01:45:19Z\n    Message:               Local APIServices are always available\n    Reason:                Local\n    Status:                True\n    Type:                  Available\nEvents:                    &lt;none&gt;<\/pre>\n<p>Then the API is referenced in the YAML file that contains the definition of SQL Server resource objects through the following elements:<\/p>\n<pre class=\"brush: xml; gutter: true; first-line: 1\">apiVersion: mssql.microsoft.com\/v1\nkind: SqlServer<\/pre>\n<p>As you probably guessed, if this API is missing on your K8s cluster at the moment of installing the AG resources you\u2019ll probably face the following error message:<\/p>\n<p><strong><em>Error: [unable to recognize &#8220;&#8221;: no matches for kind &#8220;SqlServer&#8221; in version &#8220;mssql.microsoft.com\/v1&#8221;, unable to recognize &#8220;&#8221;: no matches for kind &#8220;SqlServer&#8221; in version &#8220;mssql.microsoft.com\/v1&#8221;, unable to recognize &#8220;&#8221;: no matches for kind &#8220;SqlServer&#8221; in version &#8220;mssql.microsoft.com\/v1&#8221;]<\/em><\/strong><\/p>\n<p>At this stage, referring to the <a href=\"https:\/\/docs.helm.sh\/chart_best_practices\/\">Helm documentation<\/a>, I decided to split my initial release deployment into 2 separate helm charts. Between the 2 suggested methods in the documentation I much prefer this one because updating \/ removing releases is little bit easier but at the cost of introducing an additional chart in the game. With the CRD hook method, the CRD is not attached to a specific chart deployment, so if we need to change something in the CRD, it doesn&#8217;t get updated in the cluster unless we tear down the chart and install it again. This also means that we can&#8217;t add a CRD to a chart that has already been deployed. Finally, I took a look at the <a href=\"https:\/\/github.com\/helm\/helm\/blob\/master\/docs\/charts.md\">charts dependency<\/a> feature but it doesn\u2019t fix my issue at all because chart validation seems to come before the completion of the custom API. This is at least what I noticed with the current version of my helm version (v2.12.1). Probably one area to investigate for Microsoft \u2026<\/p>\n<p>So let&#8217;s continue &#8230;\u00a0 Here the structure of my two helm charts (respectively for my AG resources and my AG operator).<\/p>\n<pre class=\"brush: shell; gutter: true; first-line: 1\">$ tree \/f\n\n\u2500\u2500\u2500dbi_mssql_ag\n\u2502   \u2502   .helmignore\n\u2502   \u2502   Chart.yaml\n\u2502   \u2502   values.yaml\n\u2502   \u2502\n\u2502   \u251c\u2500\u2500\u2500charts\n\u2502   \u2514\u2500\u2500\u2500templates\n\u2502       \u2502   ag-services.yaml\n\u2502       \u2502   ag-sqlserver-deployment.yaml\n\u2502       \u2502   NOTES.txt\n\u2502       \u2502   _helpers.tpl\n\u2502       \u2502\n\u2502       \u2514\u2500\u2500\u2500tests\n\u2514\u2500\u2500\u2500dbi_mssql_operator\n    \u2502   .helmignore\n    \u2502   Chart.yaml\n    \u2502   values.yaml\n    \u2502\n    \u251c\u2500\u2500\u2500charts\n    \u2514\u2500\u2500\u2500templates\n        \u2502   ag-operator-deployment.yaml\n        \u2502   ag-security.yaml\n        \u2502   NOTES.txt\n        \u2502   _helpers.tpl\n        \u2502\n        \u2514\u2500\u2500\u2500tests<\/pre>\n<p>The deployment consists in deploying the two charts in the correct order:<\/p>\n<pre class=\"brush: shell; gutter: true; first-line: 1\">$ helm install --name ag-2019-o --namespace ci .\\dbi_mssql_operator\\\n\u2026\n$ helm install --name ag-2019 --namespace ci .\\dbi_mssql_ag\\\n\u2026\n$ helm ls\nNAME            REVISION        UPDATED                         STATUS          CHART           APP VERSION     NAMESPACE\nag-2019         1               Wed Jan 16 23:48:33 2019        DEPLOYED        dbi-mssql-ag-1  2019.0.0        ci\nag-2019-o       1               Wed Jan 16 23:28:17 2019        DEPLOYED        dbi-mssql-ag-1  2019.0.0        ci\n\u2026\n$ kubectl get all -n ci\nNAME                                 READY     STATUS      RESTARTS   AGE\npod\/mssql-initialize-mssql1-hb9xs    0\/1       Completed   0          2m\npod\/mssql-initialize-mssql2-47n99    0\/1       Completed   0          2m\npod\/mssql-initialize-mssql3-67lzn    0\/1       Completed   0          2m\npod\/mssql-operator-7bc948fdc-45qw5   1\/1       Running     0          22m\npod\/mssql1-0                         2\/2       Running     0          2m\npod\/mssql2-0                         2\/2       Running     0          2m\npod\/mssql3-0                         2\/2       Running     0          2m\n\nNAME                  TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)             AGE\nservice\/ag1           ClusterIP      None           &lt;none&gt;          1433\/TCP,5022\/TCP   2m\nservice\/ag1-primary   LoadBalancer   10.0.62.75     xx.xx.xxx.xx   1433:32377\/TCP      2m\nservice\/mssql1        LoadBalancer   10.0.45.155    xx.xx.xxx.xxx   1433:31756\/TCP      2m\nservice\/mssql2        LoadBalancer   10.0.104.145   xx.xx.xxx.xxx       1433:31285\/TCP      2m\nservice\/mssql3        LoadBalancer   10.0.51.142    xx.xx.xxx.xxx       1433:31002\/TCP      2m\n\nNAME                             DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE\ndeployment.apps\/mssql-operator   1         1         1            1           22m\n\nNAME                                       DESIRED   CURRENT   READY     AGE\nreplicaset.apps\/mssql-operator-7bc948fdc   1         1         1         22m\n\nNAME                      DESIRED   CURRENT   AGE\nstatefulset.apps\/mssql1   1         1         2m\nstatefulset.apps\/mssql2   1         1         2m\nstatefulset.apps\/mssql3   1         1         2m\n\nNAME                                DESIRED   SUCCESSFUL   AGE\njob.batch\/mssql-initialize-mssql1   1         1            2m\njob.batch\/mssql-initialize-mssql2   1         1            2m\njob.batch\/mssql-initialize-mssql3   1         1            2m<\/pre>\n<p>After that, my AG is deployed and ready!<\/p>\n<p>Let me know if you want to try it and feel free to comment!. Apologize I don\u2019t use a GitHub repository so far but things may be changing this year \ud83d\ude42<\/p>\n<p>Bear in mind \u00a0SQL Server 2019 is still in CTP version at the moment of this write-up. Things may change more or less until the first GA &#8230;<\/p>\n<p>Happy AG deployment on K8s!<\/p>\n<p><span style=\"float: none; background-color: #ffffff; color: #333333; cursor: text; font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none;\">By David Barbarin<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This write-up follows my first article about helm chart with SQL Server. This time, I would like to cover the availability groups topic and how to deploy them with helm charts. In fact, to go through this feature for AGs was motivated to its usage in our Azure DevOps CI pipeline in order to deploy [&hellip;]<\/p>\n","protected":false},"author":26,"featured_media":12200,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229,1320,1504,1522,99],"tags":[297,1523,1365,1482],"type_dbi":[],"class_list":["post-12198","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-database-administration-monitoring","category-devops","category-docker","category-kubernetes","category-sql-server","tag-availability-groups","tag-helm","tag-k8s","tag-sqlserver-2019"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Deploying SQL Server 2019 AGs on K8s with helm charts<\/title>\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.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Deploying SQL Server 2019 AGs on K8s with helm charts\" \/>\n<meta property=\"og:description\" content=\"This write-up follows my first article about helm chart with SQL Server. This time, I would like to cover the availability groups topic and how to deploy them with helm charts. In fact, to go through this feature for AGs was motivated to its usage in our Azure DevOps CI pipeline in order to deploy [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-01-17T12:00:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-13T14:35:08+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/151-1-DevOpsAzureHelm-e1547728709507.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"900\" \/>\n\t<meta property=\"og:image:height\" content=\"413\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Microsoft Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Microsoft Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/\"},\"author\":{\"name\":\"Microsoft Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4\"},\"headline\":\"Deploying SQL Server 2019 AGs on K8s with helm charts\",\"datePublished\":\"2019-01-17T12:00:55+00:00\",\"dateModified\":\"2023-07-13T14:35:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/\"},\"wordCount\":955,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/151-1-DevOpsAzureHelm-e1547728709507.jpg\",\"keywords\":[\"Availability groups\",\"helm\",\"k8s\",\"sqlserver 2019\"],\"articleSection\":[\"Database Administration &amp; Monitoring\",\"DevOps\",\"Docker\",\"Kubernetes\",\"SQL Server\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/\",\"name\":\"Deploying SQL Server 2019 AGs on K8s with helm charts\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/151-1-DevOpsAzureHelm-e1547728709507.jpg\",\"datePublished\":\"2019-01-17T12:00:55+00:00\",\"dateModified\":\"2023-07-13T14:35:08+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/#primaryimage\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/151-1-DevOpsAzureHelm-e1547728709507.jpg\",\"contentUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/151-1-DevOpsAzureHelm-e1547728709507.jpg\",\"width\":900,\"height\":413},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Deploying SQL Server 2019 AGs on K8s with helm charts\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4\",\"name\":\"Microsoft Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"caption\":\"Microsoft Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/microsoft-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Deploying SQL Server 2019 AGs on K8s with helm charts","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.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/","og_locale":"en_US","og_type":"article","og_title":"Deploying SQL Server 2019 AGs on K8s with helm charts","og_description":"This write-up follows my first article about helm chart with SQL Server. This time, I would like to cover the availability groups topic and how to deploy them with helm charts. In fact, to go through this feature for AGs was motivated to its usage in our Azure DevOps CI pipeline in order to deploy [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/","og_site_name":"dbi Blog","article_published_time":"2019-01-17T12:00:55+00:00","article_modified_time":"2023-07-13T14:35:08+00:00","og_image":[{"width":900,"height":413,"url":"http:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/151-1-DevOpsAzureHelm-e1547728709507.jpg","type":"image\/jpeg"}],"author":"Microsoft Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Microsoft Team","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/"},"author":{"name":"Microsoft Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4"},"headline":"Deploying SQL Server 2019 AGs on K8s with helm charts","datePublished":"2019-01-17T12:00:55+00:00","dateModified":"2023-07-13T14:35:08+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/"},"wordCount":955,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/151-1-DevOpsAzureHelm-e1547728709507.jpg","keywords":["Availability groups","helm","k8s","sqlserver 2019"],"articleSection":["Database Administration &amp; Monitoring","DevOps","Docker","Kubernetes","SQL Server"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/","url":"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/","name":"Deploying SQL Server 2019 AGs on K8s with helm charts","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/151-1-DevOpsAzureHelm-e1547728709507.jpg","datePublished":"2019-01-17T12:00:55+00:00","dateModified":"2023-07-13T14:35:08+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/151-1-DevOpsAzureHelm-e1547728709507.jpg","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/151-1-DevOpsAzureHelm-e1547728709507.jpg","width":900,"height":413},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/deploying-sql-server-2019-availability-groups-with-helm-charts\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Deploying SQL Server 2019 AGs on K8s with helm charts"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4","name":"Microsoft Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","caption":"Microsoft Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/microsoft-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/12198","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/26"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=12198"}],"version-history":[{"count":1,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/12198\/revisions"}],"predecessor-version":[{"id":26695,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/12198\/revisions\/26695"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media\/12200"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=12198"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=12198"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=12198"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=12198"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}