{"id":86902,"date":"2020-07-01T07:42:28","date_gmt":"2020-07-01T05:42:28","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/udalyaem-ustarevshuyu-feature-branch-v-kubernetes-klastere"},"modified":"2020-07-01T07:42:28","modified_gmt":"2020-07-01T05:42:28","slug":"udalyaem-ustarevshuyu-feature-branch-v-kubernetes-klastere","status":"publish","type":"post","link":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/udalyaem-ustarevshuyu-feature-branch-v-kubernetes-klastere","title":{"rendered":"Verwijder de verouderde feature branch in het Kubernetes-cluster","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Verwijder de verouderde feature branch in het Kubernetes-cluster\" src=\"\/wp-content\/uploads\/2020\/07\/d97c0cce385c587e16f26f6d19b9d108.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Hallo! <b>Feature branch<\/b> (aka deploy preview, review app) \u2014 dit is wanneer niet alleen de master branch wordt gedeployed, maar ook elke pull request naar een unieke URL. Je kunt controleren of de code werkt in een productieomgeving, en de functie kan aan andere programmeurs of productontwikkelaars worden getoond. Terwijl je aan de pull request werkt, wordt elke nieuwe commit de huidige deploy voor de oude code verwijderd, en een nieuwe deploy voor de nieuwe code uitgerold. Vraagstukken kunnen ontstaan als je de pull request in de master branch hebt samengevoegd. De feature branch is dan niet meer nodig, maar de Kubernetes-resources blijven nog steeds in de cluster.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Meer over feature branches<\/h2>\n<p><\/p>\n<p>Een van de benaderingen om feature branches in Kubernetes te maken, is door gebruik te maken van namespaces. In het kort ziet de productieconfiguratie er zo uit:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">kind: Namespace\napiVersion: v1\nmetadata:\n  name: habr-back-end\n...\n\nkind: Deployment\napiVersion: apps\/v1\nmetadata:\n  namespace: habr-back-end\nspec:\n  replicas: 3\n...<\/code><\/pre>\n<p><\/p>\n<p>Voor feature branches wordt een namespace aangemaakt met haar identificatie (bijvoorbeeld het nummer van de pull request) en een of andere prefix\/suffix (bijvoorbeeld, <b>-pr-<\/b>):<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">kind: Namespace\napiVersion: v1\nmetadata:\n  name: habr-back-end-pr-17\n...\n\nkind: Deployment\napiVersion: apps\/v1\nmetadata:\n  namespace: habr-back-end-pr-17\nspec:\n  replicas: 1\n...<\/code><\/pre>\n<p><\/p>\n<p>Over het algemeen, ik schreef <b>Kubernetes Operator<\/b> (een applicatie die toegang heeft tot de clusterresources), <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dmytrostriletskyi\/stale-feature-branch-operator\">link naar het project op Github<\/a><\/noindex>). Het verwijdert namespaces die betrekking hebben op oude feature branches. In Kubernetes, als een namespace wordt verwijderd, worden andere resources in die namespace ook automatisch verwijderd.<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl get pods --all-namespaces | grep -e \"-pr-\"\nNAMESPACE            ... AGE\nhabr-back-end-pr-264 ... 4d8h\nhabr-back-end-pr-265 ... 5d7h<\/code><\/pre>\n<p><\/p>\n<p>Over hoe je feature branches in de cluster kunt implementeren, kun je lezen <noindex><a rel=\"nofollow\" href=\"https:\/\/itnext.io\/feature-deployments-in-kubernetes-c74bdcff0d8e\">here<\/a><\/noindex> en <noindex><a rel=\"nofollow\" href=\"https:\/\/codefresh.io\/kubernetes-tutorial\/dynamically-creating-k8s-namespaces-every-branch-pull-request-2\">here<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h2>Motivatie<\/h2>\n<p><\/p>\n<p>Laten we eens kijken naar de typische levenscyclus van een pull request met continue integratie (<code>continue integratie<\/code>):<\/p>\n<p><\/p>\n<ol>\n<li>We pushen een nieuwe commit naar de branch.<\/li>\n<li>Bij de build worden linter- en\/of tests uitgevoerd.<\/li>\n<li>De configuraties van de Kubernetes pull request worden on-the-fly gegenereerd (bijvoorbeeld, zijn nummer wordt ingebracht in een kant-en-klaar sjabloon).<\/li>\n<li>Met behulp van kubectl apply komen de configuraties in het cluster (deploy).<\/li>\n<li>De pull request wordt samengevoegd met de master branch.<\/li>\n<\/ol>\n<p><\/p>\n<p>Terwijl je aan de pull request werkt, wordt elke nieuwe commit de huidige deploy voor de oude code verwijderd en een nieuwe deploy voor de nieuwe code uitgerold. Maar wanneer de pull request in de master branch wordt samengevoegd, wordt er alleen voor de master branch gebouwd. Hierdoor vergeten we de pull request, terwijl zijn Kubernetes-resources nog steeds in de cluster aanwezig zijn.<\/p>\n<p><\/p>\n<h2>Hoe te gebruiken<\/h2>\n<p><\/p>\n<p>Installeer het project met de onderstaande opdracht:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl apply -f https:\/\/raw.githubusercontent.com\/dmytrostriletskyi\/stale-feature-branch-operator\/master\/configs\/production.yml<\/code><\/pre>\n<p><\/p>\n<p>Maak een bestand met de volgende inhoud en installeer het via <code>kubectl apply -f<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: feature-branch.dmytrostriletskyi.com\/v1\nkind: StaleFeatureBranch\nmetadata:\n  name: stale-feature-branch\nspec:\n  namespaceSubstring: -pr-\n  afterDaysWithoutDeploy: 3<\/code><\/pre>\n<p><\/p>\n<p>Parameter <b>namespaceSubstring<\/b> is nodig om namespaces voor pull requests van andere namespaces te filteren. Bijvoorbeeld, als de cluster de volgende namespaces heeft: <code>habr-back-end<\/code>, <code>habr-front-end<\/code>, <code>habr-back-end-pr-17<\/code>, <code>habr-back-end-pr-33<\/code>, dan zullen de kandidaten voor verwijdering zijn <code>habr-back-end-pr-17<\/code>, <code>habr-back-end-pr-33<\/code>.<\/p>\n<p><\/p>\n<p>Parameter <b>afterDaysWithoutDeploy<\/b> is nodig om oude namespaces te verwijderen. Bijvoorbeeld, als een namespace is aangemaakt <code>3 dagen 1 uur<\/code> geleden, en de parameter is ingesteld op <code>3 dagen<\/code>, dan zal deze namespace worden verwijderd. Het werkt ook omgekeerd, als de namespace is aangemaakt <code>2 dagen 23 uur<\/code> geleden, en de parameter is ingesteld op <code>3 dagen<\/code>, dan zal deze namespace niet worden verwijderd.<\/p>\n<p><\/p>\n<p>Er is nog een andere parameter, die bepaalt hoe vaak alle namespaces moeten worden gescand en gecontroleerd op dagen zonder deploy \u2014 <b>checkEveryMinutes<\/b>. Standaard is deze ingesteld op <code>30 minuten<\/code>.<\/p>\n<p><\/p>\n<h2>Hoe het werkt<\/h2>\n<p><\/p>\n<p>In de praktijk heeft men nodig:<\/p>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/get-docker\">Docker<\/a><\/noindex> voor gebruik in een ge\u00efsoleerde omgeving.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-minikube\">Minikube<\/a><\/noindex> zal de Kubernetes cluster lokaal opzetten.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-kubectl\">kubectl<\/a><\/noindex> \u2014 de commandoregelinterface voor het beheren van de cluster.<\/li>\n<\/ol>\n<p><\/p>\n<p>We zetten de Kubernetes cluster lokaal op:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ minikube start --vm-driver=docker\nminikube v1.11.0 op Darwin 10.15.5\nGebruik de docker-driver op basis van het bestaande profiel.\nStart de beheersnode minikube in cluster minikube.<\/code><\/pre>\n<p><\/p>\n<p>Geef op <code>kubectl<\/code> gebruik de lokale cluster als standaard:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl config use-context minikube\nSwitched to context \"minikube\".<\/code><\/pre>\n<p><\/p>\n<p>We downloaden de configuraties voor de productieomgeving:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ curl https:\/\/raw.githubusercontent.com\/dmytrostriletskyi\/stale-feature-branch-operator\/master\/configs\/production.yml &gt; stale-feature-branch-production-configs.yml<\/code><\/pre>\n<p><\/p>\n<p>Omdat productieconfiguraties zijn ingesteld om oude namespaces te controleren, en in onze nieuw opgerichte cluster zijn ze er niet, zullen we de omgevingsvariabele vervangen. <code>IS_DEBUG<\/code> en een werkende opdracht krijgen. <code>true<\/code>. Met deze waarde wordt de parameter <code>afterDaysWithoutDeploy<\/code> wordt niet meegenomen en namespaces worden niet gecontroleerd op dagen zonder deploy, alleen op de aanwezigheid van een substring (<code>-pr-<\/code>).<\/p>\n<p><\/p>\n<p>Als je in <code>Linux<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ sed -i 's|false|true|g' stale-feature-branch-production-configs.yml<\/code><\/pre>\n<p><\/p>\n<p>Als je in <code>macOS<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ sed -i \"\" 's|false|true|g' stale-feature-branch-production-configs.yml<\/code><\/pre>\n<p><\/p>\n<p>We installeren het project:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl apply -f stale-feature-branch-production-configs.yml<\/code><\/pre>\n<p><\/p>\n<p>We controleren of de resource <code>StaleFeatureBranch<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl api-resources | grep stalefeaturebranches\nNAAM                 ... APIGROUP                             ... TYPE\nstalefeaturebranches ... feature-branch.dmytrostriletskyi.com ... StaleFeatureBranch<\/code><\/pre>\n<p><\/p>\n<p>We controleren of de operator in de cluster aanwezig is:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl get pods --namespace stale-feature-branch-operator\nNAAM                                           ... STATUS  ... LEVENSJAREN\nstale-feature-branch-operator-6bfbfd4df8-m7sch ... Draait ... 38s<\/code><\/pre>\n<p><\/p>\n<p>Als je in de logs kijkt, is hij klaar om resources te verwerken <code>StaleFeatureBranch<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator\n... \"msg\":\"Operator Version: 0.0.1\"}\n...\n... \"msg\":\"Starting EventSource\", ... , \"source\":\"kind source: \/, Kind=\"}\n... \"msg\":\"Starting Controller\", ...}\n... \"msg\":\"Starting workers\", ..., \"worker count\":1}<\/code><\/pre>\n<p><\/p>\n<p>Voorgeconfigureerde <code>fixtures<\/code> (voorgeconfigureerde instellingen voor het modelleren van clusterbronnen) voor de hulpbron <code>StaleFeatureBranch<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl apply -f https:\/\/raw.githubusercontent.com\/dmytrostriletskyi\/stale-feature-branch-operator\/master\/fixtures\/stale-feature-branch.yml<\/code><\/pre>\n<p><\/p>\n<p>In de configuraties is aangegeven om naar namespaces te zoeken met een substring <code>-pr-<\/code> eens in <code>1 minuut<\/code>.:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: feature-branch.dmytrostriletskyi.com\/v1\nkind: StaleFeatureBranch\nmetadata:\n  naam: stale-feature-branch\nspec:\n  namespaceSubstring: -pr-\n  afterDaysWithoutDeploy: 1 \n  checkEveryMinutes: 1<\/code><\/pre>\n<p><\/p>\n<p>De operator heeft gereageerd en is klaar om namespaces te controleren:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator\n... \"msg\":\"Stale feature branch is being processing.\",\"namespaceSubstring\":\"-pr-\",\"afterDaysWithoutDeploy\":1,\"checkEveryMinutes\":1,\"isDebug\":\"true\"}<\/code><\/pre>\n<p><\/p>\n<p>Instellen <code>fixtures<\/code>, die twee namespaces bevatten (<code>project-pr-1<\/code>, <code>project-pr-2<\/code>) en hun <code>deployments<\/code>, <code>services<\/code>, <code>ingress<\/code>, enzovoort:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl apply -f https:\/\/raw.githubusercontent.com\/dmytrostriletskyi\/stale-feature-branch-operator\/master\/fixtures\/first-feature-branch.yml -f https:\/\/raw.githubusercontent.com\/dmytrostriletskyi\/stale-feature-branch-operator\/master\/fixtures\/second-feature-branch.yml\n...\nnamespace\/project-pr-1 gecre\u00eberd\ndeployment.apps\/project-pr-1 gecre\u00eberd\nservice\/project-pr-1 gecre\u00eberd\nhorizontalpodautoscaler.autoscaling\/project-pr-1 gecre\u00eberd\nsecret\/project-pr-1 gecre\u00eberd\nconfigmap\/project-pr-1 gecre\u00eberd\ningress.extensions\/project-pr-1 gecre\u00eberd\nnamespace\/project-pr-2 gecre\u00eberd\ndeployment.apps\/project-pr-2 gecre\u00eberd\nservice\/project-pr-2 gecre\u00eberd\nhorizontalpodautoscaler.autoscaling\/project-pr-2 gecre\u00eberd\nsecret\/project-pr-2 gecre\u00eberd\nconfigmap\/project-pr-2 gecre\u00eberd\ningress.extensions\/project-pr-2 gecre\u00eberd<\/code><\/pre>\n<p><\/p>\n<p>We controleren of alle bovenstaande resources succesvol zijn aangemaakt:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-1 &amp;&amp; kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-2\n...\nNAAM                              ... KLAAR ... STATUS  ... LEVENSDUUR\npod\/project-pr-1-848d5fdff6-rpmzw ... 1\/1   ... Actief ... 67s\n\nNAAM                         ... KLAAR ... BESCHIKBAAR ... LEVENSDUUR\ndeployment.apps\/project-pr-1 ... 1\/1   ... 1         ... 67s\n...<\/code><\/pre>\n<p><\/p>\n<p>Aangezien we <code>debug<\/code>, namespaces <code>project-pr-1<\/code> en <code>project-pr-2<\/code>, en alle andere resources, moeten direct worden verwijderd ongeacht de parameter <code>afterDaysWithoutDeploy<\/code>. Dit is zichtbaar in de logs van de operator:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator\n... \"msg\":\"Namespace should be deleted due to debug mode is enabled.\",\"namespaceName\":\"project-pr-1\"}\n... \"msg\":\"Namespace is being processing.\",\"namespaceName\":\"project-pr-1\",\"namespaceCreationTimestamp\":\"2020-06-16 18:43:58 +0300 EEST\"}\n... \"msg\":\"Namespace has been deleted.\",\"namespaceName\":\"project-pr-1\"}\n... \"msg\":\"Namespace should be deleted due to debug mode is enabled.\",\"namespaceName\":\"project-pr-2\"}\n... \"msg\":\"Namespace is being processing.\",\"namespaceName\":\"project-pr-2\",\"namespaceCreationTimestamp\":\"2020-06-16 18:43:58 +0300 EEST\"}\n... \"msg\":\"Namespace has been deleted.\",\"namespaceName\":\"project-pr-2\"}<\/code><\/pre>\n<p><\/p>\n<p>Als we de resources controleren, zullen ze in status zijn <code>Terminating<\/code> (verwijderingsproces) of al verwijderd zijn (de uitvoer van het commando is leeg).<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-1 &amp;&amp; kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-2\n...<\/code><\/pre>\n<p><\/p>\n<p>U kunt het proces om te maken herhalen <code>fixtures<\/code> en bevestigen dat ze binnen een minuut worden verwijderd.<\/p>\n<p><\/p>\n<h2>Alternatieven<\/h2>\n<p><\/p>\n<p>Wat kan men doen in plaats van de operator die in het cluster werkt? Er zijn verschillende benaderingen, allemaal zijn ze niet perfect (en hun nadelen zijn subjectief), en iedereen moet zelf beslissen welke het beste past bij het specifieke project:<\/p>\n<p><\/p>\n<ol>\n<li>\n<p>Verwijder de feature branch tijdens de build van de master branch voor continue integratie.<\/p>\n<p><\/p>\n<ul>\n<li>Hiervoor moet je weten welke pull request betrekking heeft op de commit die gebouwd wordt. Aangezien de feature branch namespace het identificatienummer van de pull request bevat - zijn nummer, of de naam van de branch, moet de identificatie altijd in de commit worden opgegeven.<\/li>\n<li>De builds van master branches falen. Bijvoorbeeld, je hebt de volgende stappen: download het project, voer tests uit, bouw het project, maak een release, stuur notificaties, en maak de feature branch van de laatste pull request schoon. Als de build faalt bij het verzenden van notificaties, moet je alle bronnen in de cluster handmatig verwijderen.<\/li>\n<li>Zonder de juiste context is het verwijderen van de feature branch in de master build niet vanzelfsprekend.<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>\n<p>Gebruik van webhooks (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.community\/t\/trigger-jenkins-job-when-a-pull-request-is-merged-to-a-branch\/1169\">bijvoorbeeld<\/a><\/noindex>).<\/p>\n<p><\/p>\n<ul>\n<li>Misschien is dit niet jouw aanpak. Bijvoorbeeld, in <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jenkins.io\">Jenkins<\/a><\/noindex>, slechts \u00e9\u00e9n type pipeline ondersteunt de mogelijkheid om zijn configuraties in de broncode op te slaan. Bij gebruik van webhooks moet je je eigen script schrijven voor hun verwerking. Dit script moet geplaatst worden in de Jenkins-interface, wat moeilijk te onderhouden is.<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>\n<p>Schrijf <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/cron-jobs\/\">Cronjob<\/a><\/noindex> en voeg het Kubernetes-cluster toe.<\/p>\n<p><\/p>\n<ul>\n<li>De tijdsinspanning voor het schrijven en onderhouden.<\/li>\n<li>De operator werkt al in een vergelijkbare stijl, is gedocumenteerd en wordt ondersteund.<\/li>\n<\/ul>\n<p>\n<\/li>\n<\/ol>\n<p><\/p>\n<p>Bedankt voor uw aandacht voor het artikel. <strong><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dmytrostriletskyi\/stale-feature-branch-operator\">Link naar het project op GitHub<\/a><\/noindex><\/strong>.<\/p>\n<p>Bron: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/508534\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442! Feature branch (aka deploy preview, review app) \u2014 \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e master \u0432\u0435\u0442\u043a\u0430, \u043d\u043e \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 pull request \u043d\u0430 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 URL. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0438 \u043a\u043e\u0434 \u0432 production-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438, \u0444\u0438\u0447\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c \u0438\u043b\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u043b\u043e\u0433\u0430\u043c. \u041f\u043e\u043a\u0430 \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0432 pull request&#8217;\u0435, \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 commit \u0442\u0435\u043a\u0443\u0449\u0438\u0439 deploy \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f, \u0430 \u043d\u043e\u0432\u044b\u0439 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":86903,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-86902","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442!\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/udalyaem-ustarevshuyu-feature-branch-v-kubernetes-klastere\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0443\u044e feature branch \u0432 Kubernetes \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442!\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/udalyaem-ustarevshuyu-feature-branch-v-kubernetes-klastere\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-01T05:42:28+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-01T05:42:28+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Verwijder de verouderde feature branch in het Kubernetes-cluster | ProHoster","description":"Hallo!","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/udalyaem-ustarevshuyu-feature-branch-v-kubernetes-klastere","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0443\u044e feature branch \u0432 Kubernetes \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442!","og:url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/udalyaem-ustarevshuyu-feature-branch-v-kubernetes-klastere","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-01T05:42:28+00:00","article:modified_time":"2020-07-01T05:42:28+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"86902","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 14:03:55","updated":"2022-10-03 08:48:02","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/86902","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=86902"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/86902\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/86903"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=86902"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=86902"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=86902"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}