{"id":31760,"date":"2025-08-04T05:00:00","date_gmt":"2025-08-04T03:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=31760"},"modified":"2025-07-31T14:54:56","modified_gmt":"2025-07-31T12:54:56","slug":"jak-skonfigurowac-lokalne-srodowisko-k8s-z-microk8s","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/jak-skonfigurowac-lokalne-srodowisko-k8s-z-microk8s\/","title":{"rendered":"Jak skonfigurowa\u0107 lokalne \u015brodowisko K8s z MicroK8s?"},"content":{"rendered":"\n<p>W tym artykule poka\u017c\u0119 Ci, jak w kilka minut wdro\u017cy\u0107 aplikacj\u0119 webow\u0105 na lokalnym klastrze K8s przy pomocy MicroK8s.<\/p>\n\n\n\n<p>Zbudujemy prost\u0105 aplikacj\u0119 webow\u0105 (uploader plik\u00f3w) w Pythonie, przygotujemy obraz Dockera, opublikujemy go w lokalnym rejestrze i wdro\u017cymy w Kubernetesie.<\/p>\n\n\n\n<p><strong>Ten przewodnik jest idealny dla:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>u\u017cytkownik\u00f3w Linuxa,<\/li>\n\n\n\n<li>developer\u00f3w chc\u0105cych testowa\u0107 aplikacje w wiernie odzwierciedlonym \u015brodowisku K8s bez konieczno\u015bci u\u017cywania chmury,<\/li>\n\n\n\n<li>zespo\u0142\u00f3w DevOps rozpoczynaj\u0105cych prac\u0119 z K8s,<\/li>\n\n\n\n<li>ka\u017cdego, kto chce szybko stworzy\u0107 lokalne \u015brodowisko Kubernetes do cel\u00f3w edukacyjnych lub testowych.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Dlaczego Microk8s, a nie Docker Desktop?<\/strong><\/h2>\n\n\n\n<p>Dlaczego warto rozwa\u017cy\u0107 wykorzystanie MicroK8s zamiast Docker Desktop? Z kilku powod\u00f3w:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>jest l\u017cejsze i szybsze \u2013 Microk8s zu\u017cywa mniej zasob\u00f3w (CPU\/RAM) \u2013 nawet 500 MB, w por\u00f3wnaniu do 4+ GB,<\/li>\n\n\n\n<li>jest darmowe, open-source,<\/li>\n\n\n\n<li>prostsza\/wierniejsza konfiguracja wielu komponent\u00f3w K8s.<\/li>\n<\/ul>\n\n\n\n<p><strong>Wykonamy:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>instalacje i konfiguracje Microk8s, Dockera oraz Docker Registry,<\/li>\n\n\n\n<li>aplikacj\u0119 webow\u0105 umo\u017cliwiaj\u0105c\u0105 przesy\u0142anie plik\u00f3w (file uploader),<\/li>\n\n\n\n<li>obraz Dockera z aplikacj\u0105,<\/li>\n\n\n\n<li>klastrowe \u015brodowisko MicroK8s z PVC (PersistentVolumeClaim),<\/li>\n\n\n\n<li>deployment i service w Kubernetesie dost\u0119pne przez NodePort.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Czym jest MicroK8s?<\/strong><\/h2>\n\n\n\n<p>MicroK8s to lekka dystrybucja Kubernetes stworzona przez Canonical (tw\u00f3rc\u00f3w Ubuntu). Idealna do lokalnego developmentu, test\u00f3w CI\/CD oraz PoC-\u00f3w. Nie wymaga du\u017cych zasob\u00f3w i dzia\u0142a dobrze w r\u00f3\u017cnych \u015brodowiskach.<\/p>\n\n\n\n<p><strong>Potrzebujesz:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Python 3.x (dla aplikacji),<\/li>\n\n\n\n<li>Docker,<\/li>\n\n\n\n<li>MicroK8s,<\/li>\n\n\n\n<li>Podstawowe narz\u0119dzia CLI: kubectl, curl, git.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Instalacja Dockera<\/strong><\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# Docker\nsudo apt update\nsudo apt install -y docker.io\n<\/pre><\/div>\n\n\n<p><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# Kubectl (je\u015bli nie u\u017cywasz wersji z MicroK8s)\nsudo apt install -y kubectl curl git\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>Instalacja i konfiguracja MicroK8s<\/strong><\/h2>\n\n\n\n<p>Instalacja MicroK8s:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo snap install microk8s \u2013classic\n<\/pre><\/div>\n\n\n<p>Nadanie uprawnie\u0144: dodaj u\u017cytkownika do grupy Microk8s, aby unikn\u0105\u0107 konieczno\u015bci u\u017cywania sudo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo usermod -a -G microk8s $USER\nnewgrp microk8s\n<\/pre><\/div>\n\n\n<p>Sprawdzenie statusu:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nmicrok8s status --wait-ready\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>Aktywacja wbudowanego registry<\/strong><\/h2>\n\n\n\n<p>MicroK8s oferuje wbudowany lokalny rejestr Dockerowy:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nmicrok8s enable registry\n<\/pre><\/div>\n\n\n<p>Domy\u015blnie dzia\u0142a na localhost:32000.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Kodowanie<\/h2>\n\n\n\n<p>Tworzymy pliki o poni\u017cszym schemacie:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"264\" height=\"156\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/Przechwytywanie-1.jpg\" alt=\"schemat tworzenia plik\u00f3w\" class=\"wp-image-31764\"\/><figcaption class=\"wp-element-caption\">Ryc. 1 Schemat  tworzenia plik\u00f3w<\/figcaption><\/figure>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# uploader.py\nfrom flask import Flask, request\nimport os\n\napp = Flask(__name__)\nUPLOAD_FOLDER = os.getenv(&#039;UPLOAD_FOLDER&#039;, &#039;uploads&#039;)\nos.makedirs(UPLOAD_FOLDER, exist_ok=True)\n\n@app.route(&#039;\/&#039;, methods=&#x5B;&#039;GET&#039;, &#039;POST&#039;])\ndef upload_file():\n    if request.method == &#039;POST&#039;:\n        f = request.files&#x5B;&#039;file&#039;]\n        f.save(os.path.join(UPLOAD_FOLDER, f.filename))\n        return &#039;File uploaded!&#039;\n    return &#039;&#039;&#039;\n        &lt;form method=&quot;post&quot; enctype=&quot;multipart\/form-data&quot;&gt;\n            &lt;input type=&quot;file&quot; name=&quot;file&quot;&gt;\n            &lt;input type=&quot;submit&quot;&gt;\n        &lt;\/form&gt;\n    &#039;&#039;&#039;\n\nif __name__ == &#039;__main__&#039;:\n    app.run(host=&#039;0.0.0.0&#039;, port=8080)\n<\/pre><\/div>\n\n\n<p><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# Dockerfile\nFROM python:3.11-slim\nWORKDIR \/app\n . .\nRUN pip install -r requirements.txt\nEXPOSE 8080\nENV UPLOAD_FOLDER=\/data\/uploads\nRUN mkdir -p ${UPLOAD_FOLDER}\nCMD &#x5B;&quot;python&quot;, &quot;uploader.py&quot;]\n<\/pre><\/div>\n\n\n<p><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n# requirements.txt\nflask\n<\/pre><\/div>\n\n\n<p><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\n# deployment.yaml\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: uploader-pv\nspec:\n  capacity:\n    storage: 1Gi\n  accessModes:\n    - ReadWriteOnce\n  storageClassName: manual\n  hostPath:\n    path: &quot;\/tmp\/uploader-data&quot;\n---\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: uploader-pvc\nspec:\n  accessModes:\n    - ReadWriteOnce\n  resources:\n    requests:\n      storage: 1Gi\n  storageClassName: manual\n---\napiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: file-uploader\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: file-uploader\n  template:\n    metadata:\n      labels:\n        app: file-uploader\n    spec:\n      containers:\n      - name: uploader\n        image: localhost:32000\/file-uploader:latest\n        ports:\n        - containerPort: 8080\n        volumeMounts:\n        - name: uploader-storage\n          mountPath: \/data\n        env:\n        - name: UPLOAD_FOLDER\n          value: &quot;\/data\/uploads&quot;\n      volumes:\n      - name: uploader-storage\n        persistentVolumeClaim:\n          claimName: uploader-pvc\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: uploader-service\nspec:\n  type: NodePort\n  selector:\n    app: file-uploader\n  ports:\n    - port: 8080\n      targetPort: 8080\n      nodePort: 30001\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>Tworzymy obraz i publikujemy go lokalnie<\/strong><\/h2>\n\n\n\n<p>Zak\u0142adaj\u0105c, \u017ce pliki uploader.py, Dockerfile i requirements.txt s\u0105 w katalogu projektu:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# Budowa obrazu\ndocker build -t file-uploader:latest\n<\/pre><\/div>\n\n\n<p><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# Tagowanie do lokalnego registry\ndocker tag file-uploader localhost:32000\/file-uploader\n<\/pre><\/div>\n\n\n<p><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n# Push do MicroK8s registry\ndocker push localhost:32000\/file-uploader\n<\/pre><\/div>\n\n\n<p>Wdro\u017cenie:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nmicrok8s kubectl apply -f deployment.yaml\n<\/pre><\/div>\n\n\n<p>Sprawd\u017a, czy wszystko dzia\u0142a:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nmicrok8s kubectl get pods\nmicrok8s kubectl get svc\n<\/pre><\/div>\n\n\n<p>Dost\u0119p do aplikacji \u2013 po uruchomieniu aplikacji, b\u0119dzie ona dost\u0119pna w przegl\u0105darce pod adresem:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nhttp:\/\/localhost:30001\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/oferty-pracy\/\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" width=\"737\" height=\"170\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/praca-PL-k-4.jpg\" alt=\"oferty pracy\" class=\"wp-image-31768\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/praca-PL-k-4.jpg 737w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/praca-PL-k-4-300x69.jpg 300w\" sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>Dzi\u0119ki zdefiniowanemu PersistentVolume pliki b\u0119d\u0105 zapisywane lokalnie w:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n\/tmp\/uploader-data\/uploads\/\n<\/pre><\/div>\n\n\n<p>To pozwala zachowa\u0107 dane mi\u0119dzy restartami Pod\u00f3w \u2013 bardzo przydatne nawet w testowym \u015brodowisku.<\/p>\n\n\n\n<p>Dzi\u0119ki MicroK8s mo\u017cna w ci\u0105gu kilku minut przetestowa\u0107 aplikacj\u0119 dzia\u0142aj\u0105c\u0105 w Kubernetesie lokalnie, bez potrzeby korzystania z chmury. Wdro\u017cenie jest szybkie, lekkie i powtarzalne \u2013 a jednocze\u015bnie bliskie rzeczywistej infrastrukturze.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;31760&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;3&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 3)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Jak skonfigurowa\u0107 lokalne \u015brodowisko K8s z MicroK8s?&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 3)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>W tym artykule poka\u017c\u0119 Ci, jak w kilka minut wdro\u017cy\u0107 aplikacj\u0119 webow\u0105 na lokalnym klastrze K8s przy pomocy MicroK8s. Zbudujemy &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/jak-skonfigurowac-lokalne-srodowisko-k8s-z-microk8s\/\">Continued<\/a><\/p>\n","protected":false},"author":725,"featured_media":31771,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[1512,153,1085,1084,155,584],"class_list":["post-31760","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-poradnik","tag-docker","tag-k8s","tag-kubernetes","tag-linux","tag-python"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2025\/07\/Idea.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/31760"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/725"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=31760"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/31760\/revisions"}],"predecessor-version":[{"id":31774,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/31760\/revisions\/31774"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/31771"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=31760"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=31760"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=31760"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}