{"id":3740,"date":"2021-04-17T12:56:21","date_gmt":"2021-04-17T10:56:21","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=3740"},"modified":"2021-04-17T13:46:11","modified_gmt":"2021-04-17T11:46:11","slug":"performing-sql-migration-operations-by-using-kubernetes-job","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/performing-sql-migration-operations-by-using-kubernetes-job\/","title":{"rendered":"Kubernetes Job Kullanarak SQL Migration \u0130\u015flemlerini Ger\u00e7ekle\u015ftirmek"},"content":{"rendered":"<p>Teknolojinin s\u00fcrekli geli\u015fti\u011fi ve de\u011fi\u015fti\u011fi gibi, i\u00e7erisinde \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131z uygulaman\u0131n database schema&#8217;s\u0131 da her yeni implemente etti\u011fimiz \u00f6zellik ile de\u011fi\u015febilmekte. Dolay\u0131s\u0131yla domain model&#8217;lerinde ger\u00e7ekle\u015ftirilecek olan de\u011fi\u015fikliklerin, database schema&#8217;s\u0131 \u00fczerinde de uygulanabilmesi i\u00e7in bir migration stratejisi izlememiz gerekmektedir.<\/p>\n<p>Bu makale kapsam\u0131nda ise uygulamalar\u0131m\u0131z\u0131 kubernetes ortam\u0131na deploy ederken, migration i\u015flemlerini <strong>kubernetes jobs<\/strong> kullanarak nas\u0131l ger\u00e7ekle\u015ftirebilece\u011fimizi g\u00f6stermeye \u00e7al\u0131\u015faca\u011f\u0131m.<\/p>\n<h2>Gereksinimler<\/h2>\n<ul>\n<li>Docker<\/li>\n<li>Kubernetes<\/li>\n<li>Helm3<\/li>\n<li>MSSQL<\/li>\n<li>dotnet-ef tool<\/li>\n<\/ul>\n<p>Ben geli\u015ftirme ortam\u0131 olarak Docker Desktop&#8217;un Kubernetes \u00f6zelli\u011fini kullanaca\u011f\u0131m.<\/p>\n<h2>\u00d6rnek Projeye G\u00f6z Atal\u0131m<\/h2>\n<p>\u00d6ncelikle migration i\u015flemleri i\u00e7in <strong>.NET 5<\/strong> ve <strong>EF Core<\/strong> kullanarak haz\u0131rlad\u0131\u011f\u0131m <a href=\"https:\/\/github.com\/GokGokalp\/k8s-sql-migrations-job\" target=\"_blank\" rel=\"noopener\"><em><strong>buradaki<\/strong><\/em><\/a>\u00a0 \u00f6rnek projeyi inceleyelim.<\/p>\n<p>Migration i\u015flemlerini ana uygulamadan ayr\u0131 bir \u015fekilde ger\u00e7ekle\u015ftirebilmek i\u00e7in, &#8220;<em>Todo.DbMigration<\/em>&#8221; ad\u0131nda bir console application olu\u015fturdum. \u0130\u00e7erisinde ise basit olarak &#8220;<em>IDesignTimeDbContextFactory<\/em>&#8221; interface&#8217;ini, &#8220;<em>Todo.Data<\/em>&#8221; library&#8217;sindeki &#8220;<em>TodoDbContext<\/em>&#8221; i kullanarak implemente ettim.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csharp&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;lineWrapping&quot;:false,&quot;styleActiveLine&quot;:false,&quot;readOnly&quot;:true,&quot;align&quot;:&quot;&quot;}\">using System.IO;\r\nusing Microsoft.EntityFrameworkCore;\r\nusing Microsoft.EntityFrameworkCore.Design;\r\nusing Microsoft.Extensions.Configuration;\r\nusing Todo.Data;\r\n\r\nnamespace Todo.DbMigration\r\n{\r\n    public class TodoDbContextFactory : IDesignTimeDbContextFactory&lt;TodoDbContext&gt;\r\n    {\r\n        public TodoDbContext CreateDbContext(string[] args)\r\n        {\r\n            var configuration = new ConfigurationBuilder()\r\n                .SetBasePath(Directory.GetCurrentDirectory())\r\n                .AddJsonFile(\"appsettings.json\")\r\n                .AddEnvironmentVariables()\r\n                .Build();\r\n\r\n            var dbContextOptionsBuilder = new DbContextOptionsBuilder&lt;TodoDbContext&gt;();\r\n \r\n            var connectionString = configuration\r\n                        .GetConnectionString(\"SqlConnectionString\");\r\n        \r\n            dbContextOptionsBuilder.UseSqlServer(connectionString, x =&gt; x.MigrationsAssembly(\"Todo.DbMigration\"));\r\n        \r\n            return new TodoDbContext(dbContextOptionsBuilder.Options);\r\n        }\r\n    }\r\n}<\/pre>\n<\/div>\n<p>&#8220;<em>Todo.Data<\/em>&#8221; library&#8217;sindeki db context ise a\u015fa\u011f\u0131daki gibidir.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csharp&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;lineWrapping&quot;:false,&quot;styleActiveLine&quot;:false,&quot;readOnly&quot;:true,&quot;align&quot;:&quot;&quot;}\">using Microsoft.EntityFrameworkCore;\r\nusing Todo.Data.Models;\r\n\r\nnamespace Todo.Data\r\n{\r\n    public class TodoDbContext : DbContext\r\n    {\r\n        public TodoDbContext(DbContextOptions&lt;TodoDbContext&gt; options)\r\n            : base(options)\r\n        {\r\n\r\n        }\r\n\r\n        public DbSet&lt;TodoEntity&gt; Todos { get; set; }\r\n\r\n        protected override void OnModelCreating(ModelBuilder modelBuilder)\r\n        {\r\n            modelBuilder.Entity&lt;TodoEntity&gt;()\r\n                .HasKey(x =&gt; x.Id);\r\n            modelBuilder.Entity&lt;TodoEntity&gt;()\r\n                .Property(p =&gt; p.Name)\r\n                .HasMaxLength(150)\r\n                .IsRequired();\r\n        }\r\n    }\r\n}<\/pre>\n<\/div>\n<p>Initial migration&#8217;\u0131 olu\u015fturabilmek i\u00e7in ise, projenin root klas\u00f6r\u00fcnde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131rd\u0131m.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">dotnet ef migrations add InitialCreate --project .\/Todo.Migration<\/pre>\n<\/div>\n<p><a href=\"\/wp-content\/uploads\/2021\/03\/create-initial-migration.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3748 lazyload\" data-src=\"\/wp-content\/uploads\/2021\/03\/create-initial-migration.jpg\" alt=\"\" width=\"1010\" height=\"108\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/03\/create-initial-migration.jpg 1010w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/03\/create-initial-migration-300x32.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/03\/create-initial-migration-768x82.jpg 768w\" data-sizes=\"(max-width: 1010px) 100vw, 1010px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1010px; --smush-placeholder-aspect-ratio: 1010\/108;\" \/><\/a><\/p>\n<h2>Kubernetes Jobs<\/h2>\n<p>Kubernetes jobs, bize sonlu i\u015flemlerimizi \u00e7al\u0131\u015ft\u0131rabilece\u011fimiz bir yap\u0131 sunmaktad\u0131r. T\u0131pk\u0131 bir controller&#8217;\u0131n fail olmu\u015f bir pod&#8217;u &#8220;reschedule&#8221; veya &#8220;restrart&#8221; etti\u011fi gibi, kubernetes jobs da sonlu olan i\u015flemlerimizin ba\u015far\u0131yla \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamaktad\u0131r.<\/p>\n<p>Kubernetes jobs ile olu\u015fturulan bir pod e\u011fer fail olmad\u0131 ve ba\u015far\u0131yla exit oldu ise, ilgili job ba\u015far\u0131yla tamamlanm\u0131\u015f olarak kabul edilmektedir. Bu i\u015flemi ise deploy etti\u011fimiz bir job&#8217;\u0131n &#8220;completion&#8221; durumunu sorgulayarak ger\u00e7ekle\u015ftirebiliriz.<\/p>\n<p>Ayr\u0131ca bir job silindi\u011finde ise olu\u015fturmu\u015f oldu\u011fu pod&#8217;lar da otomatik olarak silinmektedir. Fakat job tamamland\u0131\u011f\u0131nda otomatik olarak silinmemektedir. Silinme i\u015flemi ise job&#8217;\u0131n completion durumu sorgulanarak, manuel olarak ger\u00e7ekle\u015ftirilmelidir. Bu i\u015fleme ise birazdan de\u011finece\u011fiz.<\/p>\n<p>Toparlamak gerekirse kubernetes jobs, \u00f6zellikle batch veya migration gibi senaryolar i\u00e7in harika bir uyum sa\u011flamaktad\u0131r.<\/p>\n<h3>Job Helm Chart Template&#8217;i Olu\u015ftural\u0131m<\/h3>\n<p>Ben deployment i\u015flemleri i\u00e7in productivity&#8217;i artt\u0131rd\u0131\u011f\u0131, tekrar kullan\u0131labilirli\u011fi sa\u011flad\u0131\u011f\u0131 ve bir standardizasyon kazand\u0131rd\u0131\u011f\u0131 i\u00e7in helm&#8217;i kullanmay\u0131 tercih ediyorum. Bu y\u00fczden job deployment i\u015flemi i\u00e7in de bir helm chart kullanaca\u011f\u0131z.<\/p>\n<p>Bunun i\u00e7in \u00f6ncelikle bir job helm chart template&#8217;i olu\u015fturmam\u0131z gerekmektedir.<\/p>\n<p>\u015eimdi projenin root klas\u00f6r\u00fcnde bulunan &#8220;<em>helm-charts<\/em>&#8221; path&#8217;ine giderek, a\u015fa\u011f\u0131daki komut ile bir initial helm chart template&#8217;i olu\u015ftural\u0131m.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">helm create migration-job<\/pre>\n<\/div>\n<p>Ard\u0131ndan chart i\u00e7erisindeki &#8220;<em>templates<\/em>&#8221; klas\u00f6r\u00fc i\u00e7erisinde bulunan &#8220;<em>_helpers.tpl<\/em>&#8221; dosyas\u0131 hari\u00e7 geriye kalan t\u00fcm dosyalar\u0131 silelim.<\/p>\n<p>\u015eimdi &#8220;<em>templates<\/em>&#8221; klas\u00f6r\u00fc alt\u0131nda &#8220;<em>job.yaml<\/em>&#8221; dosyas\u0131n\u0131 a\u015fa\u011f\u0131daki gibi tan\u0131mlayal\u0131m.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">apiVersion: batch\/v1\r\nkind: Job\r\nmetadata:\r\n  name: {{ include \"migration-job.fullname\" . }}\r\nspec:\r\n  backoffLimit: 0\r\n  template:\r\n    spec:\r\n      containers:\r\n      - name: {{ .Chart.Name }}\r\n        image: \"{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}\"\r\n      restartPolicy: Never\r\n      {{- with .Values.nodeSelector }}\r\n      nodeSelector:\r\n        {{- toYaml . | nindent 8 }}\r\n      {{- end }}<\/pre>\n<\/div>\n<p>Bu spec&#8217;deki dikkate almam\u0131z gereken k\u0131s\u0131m <strong>restrartPolicy <\/strong>ve <strong>backoffLimit<\/strong> dir. Ben herhangi bir ba\u015far\u0131 veya hata durumlar\u0131nda migration gibi i\u015flemler i\u00e7in pod&#8217;un\/container&#8217;\u0131n tekrar ba\u015flat\u0131lmas\u0131n\u0131 istemedi\u011fimden dolay\u0131 bu policy&#8217;leri &#8220;0&#8221; ve &#8220;Never&#8221; olarak ayarl\u0131yorum. (Elbette baz\u0131 istisnai durumlar kar\u015f\u0131s\u0131nda bunun da garantisi yok) Aksi taktirde &#8220;backoffLimit&#8221; default olarak &#8220;6&#8221; oldu\u011fu i\u00e7in, job, hata veren pod&#8217;u tekrar ve tekrar ba\u015flatmay\u0131 deneyecektir.<\/p>\n<p>Ayr\u0131ca bu configuration ile, o anki olu\u015fan hatan\u0131n neyden dolay\u0131 kaynakland\u0131\u011f\u0131n\u0131 bulabilmemiz de kolayla\u015facakt\u0131r.<\/p>\n<p>Value dosyas\u0131n\u0131 ise a\u015fa\u011f\u0131daki gibi g\u00fcncelleyelim.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">image:\r\n  repository: mytodoapp-migration\r\n  tag: \"v1\"\r\n\r\nnodeSelector:\r\n  beta.kubernetes.io\/os: linux<\/pre>\n<\/div>\n<p>B\u00f6ylece helm chart template&#8217;i haz\u0131r durumda. \u015eimdi tek yapmam\u0131z gereken, \u00f6rnek projeyi &#8220;<em>mytodoapp-migration:v1<\/em>&#8221; tag&#8217;i ile containerize bir hale getirmek.<\/p>\n<h2>Containerize Edelim<\/h2>\n<p>&#8220;<em>Todo.DbMigration<\/em>&#8221; projesi i\u00e7erisinde a\u015fa\u011f\u0131daki gibi bir <strong>Dockerfile<\/strong> bulunmaktad\u0131r.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block\">\n<pre class=\"CodeMirror\" data-setting=\"{\">FROM mcr.microsoft.com\/dotnet\/runtime:5.0 AS base\r\nWORKDIR \/app\r\n\r\nFROM mcr.microsoft.com\/dotnet\/sdk:5.0 AS build\r\nWORKDIR \/src\r\nCOPY [\"Todo.DbMigration\/Todo.DbMigration.csproj\", \"Todo.DbMigration\/\"]\r\nRUN dotnet restore \"Todo.DbMigration\/Todo.DbMigration.csproj\"\r\nCOPY . .\r\nWORKDIR \"\/src\/Todo.DbMigration\"\r\nRUN dotnet build \"Todo.DbMigration.csproj\" -c Release -o \/app\/build\r\n\r\nFROM build AS publish\r\nRUN dotnet publish \"Todo.DbMigration.csproj\" -c Release -o \/app\/publish\r\n\r\nFROM base AS final\r\nWORKDIR \/app\r\nCOPY --from=publish \/app\/publish .\r\nENTRYPOINT [\"dotnet\", \"Todo.DbMigration.dll\"]<\/pre>\n<\/div>\n<p>\u015eimdi projenin root klas\u00f6r\u00fcnde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131rarak migration uygulamas\u0131n\u0131 containerize bir hale getirelim.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">docker build -f .\/Todo.DbMigration\/Dockerfile . -t mytodoapp-migration:v1<\/pre>\n<\/div>\n<p><a href=\"\/wp-content\/uploads\/2021\/03\/containerize-migration.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3750 lazyload\" data-src=\"\/wp-content\/uploads\/2021\/03\/containerize-migration.jpg\" alt=\"\" width=\"1365\" height=\"491\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/03\/containerize-migration.jpg 1365w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/03\/containerize-migration-300x108.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/03\/containerize-migration-1024x368.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/03\/containerize-migration-768x276.jpg 768w\" data-sizes=\"(max-width: 1365px) 100vw, 1365px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1365px; --smush-placeholder-aspect-ratio: 1365\/491;\" \/><\/a><\/p>\n<h2><\/h2>\n<h2>Deploy Edelim<\/h2>\n<p>\u00d6rnek uygulamay\u0131 containerize bir hale getirdi\u011fimize g\u00f6re, deployment i\u015flemini ger\u00e7ekle\u015ftirebiliriz.<\/p>\n<p>Bunun i\u00e7in projenin root klas\u00f6r\u00fcnde bulunan &#8220;<em>helm-charts<\/em>&#8221; path&#8217;ine giderek, a\u015fa\u011f\u0131daki helm komutunu \u00e7al\u0131\u015ft\u0131ral\u0131m.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">helm upgrade --install --values .\/migration-job\/values.yaml mytodo-migration .\/migration-job<\/pre>\n<\/div>\n<p><a href=\"\/wp-content\/uploads\/2021\/04\/helm-install-job.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3759 lazyload\" data-src=\"\/wp-content\/uploads\/2021\/04\/helm-install-job.jpg\" alt=\"\" width=\"1251\" height=\"214\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/helm-install-job.jpg 1251w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/helm-install-job-300x51.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/helm-install-job-1024x175.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/helm-install-job-768x131.jpg 768w\" data-sizes=\"(max-width: 1251px) 100vw, 1251px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1251px; --smush-placeholder-aspect-ratio: 1251\/214;\" \/><\/a><\/p>\n<p>\u00d6rnek migration uygulamam\u0131z deploy olmu\u015f durumda.<\/p>\n<h3>Peki \u015fimdi neler yapabiliriz?<\/h3>\n<p>\u00d6ncelikle a\u015fa\u011f\u0131daki komutu kullanarak job&#8217;\u0131n ba\u015far\u0131yla tamamlan\u0131p tamamlanmad\u0131\u011f\u0131n\u0131 kontrol edelim.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">kubectl get job<\/pre>\n<\/div>\n<p><a href=\"\/wp-content\/uploads\/2021\/04\/kubectl-get-job.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3760 lazyload\" data-src=\"\/wp-content\/uploads\/2021\/04\/kubectl-get-job.jpg\" alt=\"\" width=\"1238\" height=\"209\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/kubectl-get-job.jpg 1238w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/kubectl-get-job-300x51.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/kubectl-get-job-1024x173.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/kubectl-get-job-768x130.jpg 768w\" data-sizes=\"(max-width: 1238px) 100vw, 1238px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1238px; --smush-placeholder-aspect-ratio: 1238\/209;\" \/><\/a><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi deploy etti\u011fimiz migration uygulamas\u0131n\u0131n &#8220;<em>COMPLETIONS<\/em>&#8221; durumuna bakarak, ba\u015far\u0131yla tamamlan\u0131p tamamlanmad\u0131\u011f\u0131n\u0131 anlayabiliriz.<\/p>\n<p>E\u011fer herhangi bir hata meydana gelseydi, job&#8217;\u0131n olu\u015fturdu\u011fu ilgili pod&#8217;un log&#8217;lar\u0131na bakarak ilgili hatan\u0131n izini de s\u00fcrebilirdik.<\/p>\n<p>Migration sonucunu SQL Server&#8217;a ba\u011flanarak kontrol etti\u011fimizde ise, ilgili migration&#8217;\u0131n ba\u015far\u0131yla uyguland\u0131\u011f\u0131n\u0131 g\u00f6rebiliriz.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2021\/04\/sql-migration-result.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3761 lazyload\" data-src=\"\/wp-content\/uploads\/2021\/04\/sql-migration-result.jpg\" alt=\"\" width=\"1229\" height=\"404\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/sql-migration-result.jpg 1229w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/sql-migration-result-300x99.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/sql-migration-result-1024x337.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/sql-migration-result-768x252.jpg 768w\" data-sizes=\"(max-width: 1229px) 100vw, 1229px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1229px; --smush-placeholder-aspect-ratio: 1229\/404;\" \/><\/a><\/p>\n<p>Ayr\u0131ca bir job&#8217;\u0131n tamamland\u0131\u011f\u0131nda otomatik olarak silinmedi\u011finden de bahsetmi\u015ftik. Silme i\u015flemini ger\u00e7ekle\u015ftirmek i\u00e7in ise, a\u015fa\u011f\u0131daki standart helm komutunu kullanabiliriz.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">helm delete mytodo-migration<\/pre>\n<\/div>\n<p>Peki diyelim ki biz bu i\u015flemleri automated bir hale getirmek istiyoruz. \u00d6rne\u011fin <strong>Azure DevOps<\/strong> kullan\u0131yoruz ve ilgili migration job&#8217;\u0131n\u0131n, ba\u015far\u0131yla tamamlanmas\u0131ndan sonra otomatik olarak silinmesini istiyoruz.<\/p>\n<p>Bu i\u015flemi ger\u00e7ekle\u015ftirebilmek i\u00e7in ise, &#8220;<em>kubectl<\/em>&#8221; in &#8220;<em>wait<\/em>&#8221; komutundan yararlanabiliriz. Bir ba\u015fka de\u011fi\u015fle ilgili job&#8217;\u0131 silmeden \u00f6nce, bekleme i\u015flemini job tamamlanana kadar s\u00fcrd\u00fcrmemiz gerekmektedir.<\/p>\n<p>Bunu ise a\u015fa\u011f\u0131daki komut yard\u0131m\u0131 ile yapabiliriz.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">kubectl wait --for-condition=complete job\/mytodo-migration-migration-job --timeout=2m<\/pre>\n<\/div>\n<p><a href=\"\/wp-content\/uploads\/2021\/04\/kubectl-job-wait-condition.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3762 lazyload\" data-src=\"\/wp-content\/uploads\/2021\/04\/kubectl-job-wait-condition.jpg\" alt=\"\" width=\"1223\" height=\"191\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/kubectl-job-wait-condition.jpg 1223w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/kubectl-job-wait-condition-300x47.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/kubectl-job-wait-condition-1024x160.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/kubectl-job-wait-condition-768x120.jpg 768w\" data-sizes=\"(max-width: 1223px) 100vw, 1223px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1223px; --smush-placeholder-aspect-ratio: 1223\/191;\" \/><\/a><\/p>\n<p><a href=\"\/wp-content\/uploads\/2021\/04\/wait-devops.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3769 lazyload\" data-src=\"\/wp-content\/uploads\/2021\/04\/wait-devops.jpg\" alt=\"\" width=\"1103\" height=\"369\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/wait-devops.jpg 1103w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/wait-devops-300x100.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/wait-devops-1024x343.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/wait-devops-768x257.jpg 768w\" data-sizes=\"(max-width: 1103px) 100vw, 1103px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1103px; --smush-placeholder-aspect-ratio: 1103\/369;\" \/><\/a><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi belirtti\u011fimiz condition ger\u00e7ekle\u015fene kadar ilgili task, timeout s\u00fcresi boyunca bekletilecektir. Bu i\u015flemin ard\u0131ndan ise job&#8217;\u0131n silinme i\u015flemini ger\u00e7ekle\u015ftirebiliriz.<\/p>\n<h2>\u00d6zetle<\/h2>\n<p>Kubernetes jobs, di\u011fer pod controller&#8217;lar\u0131ndan farkl\u0131 olarak bizlere tek seferlik i\u015flemlerimizi \u00e7al\u0131\u015ft\u0131rabilece\u011fimiz bir yap\u0131 sa\u011flamaktad\u0131r. Bizde bu yap\u0131 ile migration gibi i\u015flemlerimizi nas\u0131l ger\u00e7ekle\u015ftirebilece\u011fimize basit\u00e7e bakmaya \u00e7al\u0131\u015ft\u0131k.<\/p>\n<p>E\u011fer migration uygulamas\u0131n\u0131 ana uygulamadan ba\u011f\u0131ms\u0131z olarak deploy etmiyor olsayd\u0131k, bir ba\u015fka de\u011fi\u015fle ana uygulamam\u0131z\u0131n deployment an\u0131nda migration i\u015flemlerini de ger\u00e7ekle\u015ftirmek isteseydik, <strong>init container<\/strong> veya <strong>helm hook<\/strong> y\u00f6ntemlerini de kullan\u0131m senaryolar\u0131na g\u00f6re tercih edebilirdik.<\/p>\n<p>Bunlar\u0131n yan\u0131 s\u0131ra job&#8217;lar\u0131n, farkl\u0131 kullan\u0131m senaryolar\u0131 ve \u00f6zellikleri de mevcuttur. \u00d6rne\u011fin bir job&#8217;\u0131n execution time&#8217;\u0131n\u0131 &#8220;<em>activeDeadlineSeconds<\/em>&#8221; parametresi ile kontrol edebiliriz. Farkl\u0131 kullan\u0131m senaryolar\u0131 i\u00e7in job konsept&#8217;i hakk\u0131nda daha fazla bilgi edinebilmek ad\u0131na, <em><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/job\/\" target=\"_blank\" rel=\"noopener\">buray\u0131<\/a><\/em> inceleyebilirsiniz.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Teknolojinin s\u00fcrekli geli\u015fti\u011fi ve de\u011fi\u015fti\u011fi gibi, i\u00e7erisinde \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131z uygulaman\u0131n database schema&#8217;s\u0131 da her yeni implemente etti\u011fimiz \u00f6zellik ile de\u011fi\u015febilmekte. Dolay\u0131s\u0131yla domain model&#8217;lerinde ger\u00e7ekle\u015ftirilecek olan de\u011fi\u015fikliklerin, database schema&#8217;s\u0131 \u00fczerinde de uygulanabilmesi i\u00e7in bir migration stratejisi izlememiz gerekmektedir. Bu makale kapsam\u0131nda ise uygulamalar\u0131m\u0131z\u0131 kubernetes ortam\u0131na deploy ederken,&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/performing-sql-migration-operations-by-using-kubernetes-job\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">Kubernetes Job Kullanarak SQL Migration \u0130\u015flemlerini Ger\u00e7ekle\u015ftirmek<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":3779,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[505,418,434,457],"tags":[604,603,602,440,601],"class_list":["post-3740","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core","category-azure","category-containerizing","category-dotnet","tag-net-db-migration","tag-efcore-migration","tag-entityframework","tag-kubernetes","tag-kubernetes-job","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":true,"content":true,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Kubernetes Job Kullanarak SQL Migration \u0130\u015flemlerini Ger\u00e7ekle\u015ftirmek - G\u00f6khan G\u00f6kalp<\/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:\/\/gokhan-gokalp.com\/performing-sql-migration-operations-by-using-kubernetes-job\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kubernetes Job Kullanarak SQL Migration \u0130\u015flemlerini Ger\u00e7ekle\u015ftirmek - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/performing-sql-migration-operations-by-using-kubernetes-job\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2021-04-17T10:56:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-04-17T11:46:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/sql-migrations-k8s-wall.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/performing-sql-migration-operations-by-using-kubernetes-job\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/performing-sql-migration-operations-by-using-kubernetes-job\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"Kubernetes Job Kullanarak SQL Migration \u0130\u015flemlerini Ger\u00e7ekle\u015ftirmek\",\"datePublished\":\"2021-04-17T10:56:21+00:00\",\"dateModified\":\"2021-04-17T11:46:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/performing-sql-migration-operations-by-using-kubernetes-job\\\/\"},\"wordCount\":2069,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/performing-sql-migration-operations-by-using-kubernetes-job\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2021\\\/04\\\/sql-migrations-k8s-wall.jpg\",\"keywords\":[\".net db migration\",\"efcore migration\",\"entityframework\",\"kubernetes\",\"kubernetes job\"],\"articleSection\":[\".NET Core\",\"Azure\",\"Containerizing\",\"dotnet\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/performing-sql-migration-operations-by-using-kubernetes-job\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/performing-sql-migration-operations-by-using-kubernetes-job\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/performing-sql-migration-operations-by-using-kubernetes-job\\\/\",\"name\":\"Kubernetes Job Kullanarak SQL Migration \u0130\u015flemlerini Ger\u00e7ekle\u015ftirmek - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/performing-sql-migration-operations-by-using-kubernetes-job\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/performing-sql-migration-operations-by-using-kubernetes-job\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2021\\\/04\\\/sql-migrations-k8s-wall.jpg\",\"datePublished\":\"2021-04-17T10:56:21+00:00\",\"dateModified\":\"2021-04-17T11:46:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/performing-sql-migration-operations-by-using-kubernetes-job\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/performing-sql-migration-operations-by-using-kubernetes-job\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/performing-sql-migration-operations-by-using-kubernetes-job\\\/#primaryimage\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2021\\\/04\\\/sql-migrations-k8s-wall.jpg\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2021\\\/04\\\/sql-migrations-k8s-wall.jpg\",\"width\":1200,\"height\":675},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/performing-sql-migration-operations-by-using-kubernetes-job\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Performing SQL Migration Operations by using Kubernetes Job\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"description\":\"C# &amp; Python lover\",\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gokhan-gokalp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"pronouns\":\"he\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Kubernetes Job Kullanarak SQL Migration \u0130\u015flemlerini Ger\u00e7ekle\u015ftirmek - G\u00f6khan G\u00f6kalp","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:\/\/gokhan-gokalp.com\/performing-sql-migration-operations-by-using-kubernetes-job\/","og_locale":"tr_TR","og_type":"article","og_title":"Kubernetes Job Kullanarak SQL Migration \u0130\u015flemlerini Ger\u00e7ekle\u015ftirmek - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/performing-sql-migration-operations-by-using-kubernetes-job\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2021-04-17T10:56:21+00:00","article_modified_time":"2021-04-17T11:46:11+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/sql-migrations-k8s-wall.jpg","type":"image\/jpeg"}],"author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"13 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/performing-sql-migration-operations-by-using-kubernetes-job\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/performing-sql-migration-operations-by-using-kubernetes-job\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"Kubernetes Job Kullanarak SQL Migration \u0130\u015flemlerini Ger\u00e7ekle\u015ftirmek","datePublished":"2021-04-17T10:56:21+00:00","dateModified":"2021-04-17T11:46:11+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/performing-sql-migration-operations-by-using-kubernetes-job\/"},"wordCount":2069,"commentCount":2,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/performing-sql-migration-operations-by-using-kubernetes-job\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/sql-migrations-k8s-wall.jpg","keywords":[".net db migration","efcore migration","entityframework","kubernetes","kubernetes job"],"articleSection":[".NET Core","Azure","Containerizing","dotnet"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/performing-sql-migration-operations-by-using-kubernetes-job\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/performing-sql-migration-operations-by-using-kubernetes-job\/","url":"https:\/\/gokhan-gokalp.com\/performing-sql-migration-operations-by-using-kubernetes-job\/","name":"Kubernetes Job Kullanarak SQL Migration \u0130\u015flemlerini Ger\u00e7ekle\u015ftirmek - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/performing-sql-migration-operations-by-using-kubernetes-job\/#primaryimage"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/performing-sql-migration-operations-by-using-kubernetes-job\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/sql-migrations-k8s-wall.jpg","datePublished":"2021-04-17T10:56:21+00:00","dateModified":"2021-04-17T11:46:11+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/performing-sql-migration-operations-by-using-kubernetes-job\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/performing-sql-migration-operations-by-using-kubernetes-job\/"]}]},{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/performing-sql-migration-operations-by-using-kubernetes-job\/#primaryimage","url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/sql-migrations-k8s-wall.jpg","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/04\/sql-migrations-k8s-wall.jpg","width":1200,"height":675},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/performing-sql-migration-operations-by-using-kubernetes-job\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"Performing SQL Migration Operations by using Kubernetes Job"}]},{"@type":"WebSite","@id":"https:\/\/gokhan-gokalp.com\/#website","url":"https:\/\/gokhan-gokalp.com\/","name":"G\u00f6khan G\u00f6kalp","description":"C# &amp; Python lover","publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gokhan-gokalp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe","name":"G\u00f6khan G\u00f6kalp","pronouns":"he","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659"},"sameAs":["https:\/\/gokhan-gokalp.com"],"url":"https:\/\/gokhan-gokalp.com\/tr\/author\/gok-gokalp\/"}]}},"_links":{"self":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/3740","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/comments?post=3740"}],"version-history":[{"count":5,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/3740\/revisions"}],"predecessor-version":[{"id":3782,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/3740\/revisions\/3782"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media\/3779"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=3740"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=3740"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=3740"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}