{"id":15089338,"url":"https://github.com/bgelov/k8s-yamls","last_synced_at":"2026-01-04T14:34:43.243Z","repository":{"id":188827731,"uuid":"657695057","full_name":"bgelov/k8s-yamls","owner":"bgelov","description":"Some kubernetes yaml files","archived":false,"fork":false,"pushed_at":"2023-08-17T01:19:11.000Z","size":127,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-26T10:08:31.789Z","etag":null,"topics":["k8s","k8s-yaml","kubernetes","kubernetes-cluster","kubernetes-yaml","kubernetes-yaml-templates","yaml","yml","yml-files"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bgelov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-06-23T16:14:38.000Z","updated_at":"2023-08-17T01:20:02.000Z","dependencies_parsed_at":"2023-08-20T01:36:52.261Z","dependency_job_id":null,"html_url":"https://github.com/bgelov/k8s-yamls","commit_stats":{"total_commits":25,"total_committers":1,"mean_commits":25.0,"dds":0.0,"last_synced_commit":"1889a0813f75487a7e3da2305f9b14ca13d50671"},"previous_names":["bgelov/k8s-yamls"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bgelov%2Fk8s-yamls","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bgelov%2Fk8s-yamls/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bgelov%2Fk8s-yamls/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bgelov%2Fk8s-yamls/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bgelov","download_url":"https://codeload.github.com/bgelov/k8s-yamls/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244814718,"owners_count":20514805,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["k8s","k8s-yaml","kubernetes","kubernetes-cluster","kubernetes-yaml","kubernetes-yaml-templates","yaml","yml","yml-files"],"created_at":"2024-09-25T08:44:59.279Z","updated_at":"2026-01-04T14:34:43.212Z","avatar_url":"https://github.com/bgelov.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# k8s-yamls\nMy some Kubernetes cheatsheets\n\nOficial Kubernetes cheatsheet: https://kubernetes.io/ru/docs/reference/kubectl/cheatsheet/\n## k8s autocomplete\n\n```\nsudo apt-get install bash-completion\nsource \u003c(kubectl completion bash) # настройка автодополнения в текущую сессию bash, предварительно должен быть установлен пакет bash-completion .\necho \"source \u003c(kubectl completion bash)\" \u003e\u003e ~/.bashrc # добавление автодополнения autocomplete постоянно в командную оболочку bash.\n```\n\n## k8s alias\n\n```\nalias k=kubectl\ncomplete -F __start_kubectl k\n```\n\n# Basic\n\nkubectl version\n\nkubectl apply -f \u003cпуть до файла или прямая ссылка на файл\u003e\n\nkubectl delete -f \u003cпуть до файла или прямая ссылка на файл\u003e\n\n# Minikube\nЗапустить кластер с именем\n```\nminikube start --profile k8s-cluster-1\nminikube start --profile k8s-cluster-2\nminikube start --profile minikube\n```\n\nУдалить кластер с именем\n```\nminikube delete --profile minikube\n```\n\nСтатус кластера\nminikube status --profile k8s-cluster-1\n\nУзнать ip кластера minikube\n```\nminikube ip --profile k8s-cluster-1\n```\n\nОткрыть доступ к конкретному сервису в minikube из хост системы\n```\nminikube service nodeport-service --url --profile k8s-cluster-1\n```\n\nПросмотр и добавление дополнений в minikube\n```\nminikube addons list\nminikube addons enable ingress\n```\n\n# Dashboard\nhttps://github.com/bgelov/k8s-yamls/tree/main/web-ui-dashboard\n\nGet token\nkubectl -n kubernetes-dashboard create token admin-user\n\nStart dashboard\n\nkubectl proxy\nDashboard link: http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/\n\n# Config\nkubectl config get-clusters\n\nkubectl config use-context k8s-cluster-1\nkubectl config use-context k8s-cluster-2\nkubectl config use-context minikube\n\nУстановить неймспейс\n```\nkubectl config set-context --current --namespace=my-namespace\n```\n\n# Nodes\n\nkubectl get nodes\nkubectl get nodes -o wide\n\n# Pods\n\nkubectl get pods --all-namespaces \n\nЧтобы отслеживать изменения в реальном времени\nkubectl get pods --all-namespaces --watch\n\nkubectl run xxx-app --image=bgelov/xxxx --port 8008\nkubectl get pods \n\nВыгрузить конфигурацию в yaml\nkubectl get pod bgelov-app -o yaml\n\nkubectl exec -it bgelov-app -- /bin/bash\nkubectl exec -it bgelov-app -- /bin/sh\n\nkubectl get pod bgelov-app -o yaml\n\nПереадресация портов на хост систему для отладки\n```\nkubectl port-forward bgelov-app 8888:8888\n```\n\nУдалить под\nkubectl delete po bgelov-app\n\nУдалить под в конкретном неймспейсе\nkubectl delete -n default pod bgelov-rc-pf5lj\n\nУдалить под с определённой меткой\nkubectl delete po -l app=nginx\n\n# Pod Logs\n\nkubectl logs bgelov-app\n\nЕсли несколько контейнеров в Pod, то указываем конкретный контейнер\nkubectl logs bgelov-app --container bgelov-app\n\nПри удалении подов логи не сохраняются. Надо делать общекластерное ведение логов.\n\n\n# Pod labels\nЛейблы могут быть присоединены к любому объекту k8s\nПосмотреть все метки\nkubectl get pods --show-labels\n\nПосмотреть только с меткой app\nkubectl get pods -l app\n\nПосмотреть только с меткой app и environment \nkubectl get pods -L app,environment \n\nСелекторы\nkubectl get pods -l environment=dev\nkubectl get pods -l environment!=dev\nkubectl get pods -l environment=dev,app=nginx\n\nkubectl get pods -l !environment\nkubectl get pod -l \"environment in (dev)\"\nkubectl get pods -l \"app notin (nginx)\"\n\n\nПометить pod\nkubectl label pods bgelov-app-2 environment=dev\n\nПометить node\nkubectl label node k8s-cluster-1 gpu=false\n\n# Annotate\nНапример, чтобы знать кто создал под\nkubectl annotate po bgelov-app-gpu-false company-name/creator-email=\"bgelov\"\n\n# Namespaces\nПространства имён\nkubectl get ns\n\nkubectl create namespace qa\n\n```\napiVersion: v1\nkind: Namespace\nmetadata:\n  name: dev\n```\n\nСоздадим тестовые поды в разных неймспейсах: bgelov-pod-with-namespaces.yaml\n\nkubectl get po --all-namespaces\n\n\nУдалить неймспейс вместе с подами внутри\nkubectl delete ns qa\n\n\n# ReplicationController\nЯвляется устаревшим, переходим на ReplicaSet\n\nПросмотр ReplicationController\nkubectl get rc\n\nУдаление ReplicationController \nkubectl delete rc bgelov-rc\n\nМетка в шаблоне должна совпадать с селектором `app: myapp`\n\n```\napiVersion: v1\nkind: ReplicationController\nmetadata:\n  name: myapp\nspec:\n  replicas: \u003cReplicas\u003e\n  selector:\n    app: myapp\n  template:\n    metadata:\n      name: myapp\n      labels:\n        app: myapp\n    spec:\n      containers:\n        - name: myapp\n          image: \u003cImage\u003e\n          ports:\n            - containerPort: \u003cPort\u003e\n```\n\n# ReplicaSet\nЗаменяет \n\n```\napiVersion: apps/v1\nkind: ReplicaSet\nmetadata:\n  name: xiu-rs-2\n  labels:\n    app: xiu\nspec:\n  replicas: 3\n  selector:\n    matchExpressions:\n      - key: app\n        operator: In\n        values:\n          - xiu\n          - http-server\n  template:\n    metadata:\n      labels:\n        app: xiu\n        env: dev\n    spec:\n      containers:\n        - name: xiu-app\n          image: bgelov/1687346100-977d03e7f0746077d90baa216bbf61c2:1.0.0\n          ports:\n            - containerPort: 1935\n\n```   \n\n\n# Deployment\nДеплоймент занимается репликасетами, а репликасеты занимаются конкретными подами\n\nkubectl get deployment\n\nkubectl create deployment xiu-app-depl --image=bgelov/1687346100-977d03e7f0746077d90baa216bbf61c2:1.0.0 --port=8888 --replicas=3\n\nИзменим образ у подов деплоймента. Удалятся со старым образом и создадутся поды с новым образом.\nkubectl set image deployment/xiu-app-depl 1687346100-977d03e7f0746077d90baa216bbf61c2=nginx --record\nОстанется старый репликасет, он станет пустым. Пустой репликасет удалять не нужно.\n\nПосмотреть yaml деплоймента\nkubectl get deployment xiu-app-depl -o yaml\n\nУдалить деплоймент в неймспейсе default\nkubectl delete -n default deployment nginx-temp\n\n\nСтратегия RollingUpdate, когда добавляем по одной ноде и после удаляем по одной ноде\n```\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: xiu\n  labels:\n    app: xiu\nspec:\n  replicas: 5\n  minReadySeconds: 10\n  strategy:\n    rollingUpdate:\n      maxSurge: 1\n      maxUnavailable: 1\n    type: RollingUpdate\n  selector:\n    matchLabels:\n      app: xiu-app\n  template:\n    metadata:\n      labels:\n        app: xiu-app\n    spec:\n      containers:\n      - name: xiu-app\n        image: bgelov/1687346100-977d03e7f0746077d90baa216bbf61c2:1.0.0\n        ports:\n        - containerPort: 1935\n\n```\n\nСтратегия Recreate, когда всё удаляем и всё добавляем\n```\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: xiu\n  labels:\n    app: xiu\nspec:\n  replicas: 5\n  minReadySeconds: 10\n  strategy:\n    type: Recreate\n  selector:\n    matchLabels:\n      app: xiu-app\n  template:\n    metadata:\n      labels:\n        app: xiu-app\n    spec:\n      containers:\n      - name: xiu-app\n        image: bgelov/1687346100-977d03e7f0746077d90baa216bbf61c2:1.0.0\n        ports:\n        - containerPort: 1935\n\n```\n\n# Rollout\nОткат происходит к предыдущей репликасет. Имменно поэтому их не стоит удалять, при изменении деплоймента.\nПосмотреть историю куда можно откатиться\nkubectl rollout history deployment/xiu\n\nОткатиться назад\nkubectl rollout undo deployment xiu\n\nОткатиться до ревизии 1\nkubectl rollout undo deployment xiu --to-revision=1\n\n\n\n# Service\nПредоставляет единую точку входа к группе подов, представляющих одно и то же приложение.\nРаботает на основе селектора.\nЕсть 4 типа:\n- ClusterIP (дефолтный, если не указывать). Только в пределах кластера, из вне и из интернета нельзя достигнуть.\n- NodePort. Прокидываем какой-либо порт из вне.\n- LoadBalancer. Только если кубер крутится на клауд провайдере. Почти как NodePort, но ещё появляется load balancer облачного провайдера.\n- ExternalName. Когда хотим подключаться к какому-то внешнему сервису из кластера. Например, к внешней базе данных. По сути создаётся cname с кластерного имени на внешний домен. Здесь стоит иметь ввиду, что http и https будут работать неправильно из-за различных доменов в хеадере.\n\n\nПример externalname сервиса\n```\napiVersion: v1\nkind: Service\nmetadata:\n  name: external-service\nspec:\n  type: ExternalName\n  externalName: bgelov.ru\n```\n\n\nпример NodePort:\n```\napiVersion: v1\nkind: Service\nmetadata:\n  name: nodeport-service\nspec:\n  # Чтобы трафик поступал на одну и ту же ноду. На все поды на этой ноде. Если на какой-то ноде не будет пода, то будет зависание.\n  # externalTrafficPolicy: Local\n  # Если хотим, чтобы клиенты попадали на один и тот же под\n  sessionAffinity: ClientIP\n  selector:\n    app: xiu-app\n  ports:\n  - protocol: TCP\n    port: 8888\n    targetPort: 1935\n    nodePort: 30080 # Можно не указывать 30000 - 32767 и даже лучше не указывать. k8s сам выберет порт\n  type: NodePort\n```\n\n\nПример loadbalancer\n\nПолучить сервисы\nkubectl get svc\n\nНа имя сервиса можно обращаться:\nhttp://\u003cимя сервиса\u003e.\u003cnamespace\u003e.svc.cluster.local\ncat /etc/resolv.conf\n\n\n```\napiVersion: v1\nkind: Service\nmetadata:\n  name: xiu-service\nspec:\n  selector:\n    app: xiu-app\n  ports:\n  - protocol: TCP\n    port: 8888\n    targetPort: 1935\n  type: NodePort\n```\n\nHeadless сервисы, без кластерного ip. По dns имени будут резолвиться все поды.\n```\napiVersion: v1\nkind: Service\nmetadata:\n  name: xiu-service\nspec:\n  ClusterIP: None\n  selector:\n    app: xiu-app\n  ports:\n  - protocol: TCP\n    port: 8888\n    targetPort: 1935\n  type: ClusterIP\n  ```\n\n# Endpoints \n\nkubectl get endpoints\n\n\n# Ingress\nРаботает на 7 уровне, на http\nКогда мы создаём сервис loadbalancer, у нас для каждого создаётся свой лоадбалансер. Он работает на 4 уровне, на транспортном.\n\nДобавление ingress сервиса в minikube\n```\nminikube addons list\nminikube addons enable ingress\n```\n\nkubectl get ingress\n\n\n# Events\n\nПроверка событий в кластере\nkubectl get events --watch\n\n\n# Liveness Probe\nПроверка живучести контейнера. Периодически происходит проверка и если она не проходит, то под автоматически перезапускается.\nТри механизма:\n- http get\nОбращается по урлу и если там ошибка, сработает проверка\n```\n    spec:\n      containers:\n      - name: kuber-app\n        image: bakavets/kuber:v1.0-unhealthy\n        ports:\n        - containerPort: 8000\n        livenessProbe:\n          httpGet:\n            path: /healthcheck\n            port: 8000\n          initialDelaySeconds: 5\n          periodSeconds: 5\n```\n\nhttpHeaders для httpGet когда нам нужно следить за определённым именем хоста на поде\n\n```\n  template:\n    metadata:\n      labels:\n        app: http-server-http-with-host-headers\n    spec:\n      containers:\n      - name: kuber-app\n        image: bakavets/kuber:livenessprobe-http-with-host-headers\n        ports:\n        - containerPort: 80\n        livenessProbe:\n          httpGet:\n            path: /\n            httpHeaders:\n            - name: Host\n              value: kuber-healthy.example.com\n            port: 80\n          # initialDelaySeconds: 5\n          periodSeconds: 5\n```\n\n\n\n- tcp\nПроверка tcp сокета. Пытается открыть подключение к указанному порту.\n```\n      containers:\n      - name: kuber-app\n        image: bakavets/kuber:v1.0\n        ports:\n        - containerPort: 8000\n        livenessProbe:\n          tcpSocket:\n            port: 8000\n          initialDelaySeconds: 15 # Defaults to 0 seconds. Minimum value is 0.\n          periodSeconds: 10 # Default to 10 seconds. Minimum value is 1.\n          timeoutSeconds: 1 # Defaults to 1 second. Minimum value is 1.\n          successThreshold: 1 # Defaults to 1. Must be 1 for liveness and startup Probes. Minimum value is 1.\n          failureThreshold: 3 # Defaults to 3. Minimum value is 1.\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: kuber-service-tcp\nspec:\n  selector:\n    app: http-server-tcp\n  ports:\n    - protocol: TCP\n      port: 80\n      targetPort: 8000\n      nodePort: 30002\n  type: NodePort\n```\n\n\n- exec\nВыполняется каякая-либо exec команда\n```\n...\n      containers:\n      - name: ubuntu\n        image: ubuntu\n        args:\n        - /bin/sh\n        - -c\n        - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600\n        livenessProbe:\n          exec:\n            command:\n            - cat\n            - /tmp/healthy\n          # Следующие параметры задаются по умолчанию, их необязательно указывать\n          # Количество секунд от старта контейнера до начала liveness probe\n          initialDelaySeconds: 5 # Defaults to 0 seconds. Minimum value is 0.\n          # Длительность времени между пробами\n          periodSeconds: 5 # Default to 10 seconds. Minimum value is 1.\n          # Количество секунд ожидания проблы\n          timeoutSeconds: 1 # Defaults to 1 second. Minimum value is 1.\n          # Минимальное количество успешных проверок после падения\n          successThreshold: 1 # Defaults to 1. Must be 1 for liveness and startup Probes. Minimum value is 1.\n          # Количество плохих проверок, перед тем как считать проверку провалившейся\n          failureThreshold: 3 # Defaults to 3. Minimum value is 1.\n```\n\n\n# Readiness Probes\nАналогично Liveness Probes, все те же методы, но работает для другого.\nЕсли Readiness Probes не будут проходить, то под не будет регистрироваться к сервису. И следовательно на этот под не будет поступать клиентский трафик.\nReadiness Probes часто используют совместно с Liveness Probes.\n\n```\n    spec:\n      containers:\n      - name: kuber-app\n        image: bakavets/kuber:v1.0-unhealthy\n        ports:\n        - containerPort: 8000\n        readinessProbe:\n          httpGet:\n            path: /healthcheck\n            port: 8000\n          initialDelaySeconds: 5\n          periodSeconds: 5\n        livenessProbe:\n          httpGet:\n            path: /healthcheck\n            port: 8000\n          initialDelaySeconds: 5\n          periodSeconds: 5\n```\n\n\n# Startup Probe\nИногда приложению может потребоваться больше времени для инициализации.\nStartup Probe устанавливается большее время для старта контейнера.\n\n```\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: kuber-http-allprobes\n  labels:\n    app: kuber\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: kuber-http-allprobes\n  template:\n    metadata:\n      labels:\n        app: kuber-http-allprobes\n    spec:\n      containers:\n      - name: kuber-app\n        image: bakavets/kuber:v1.0\n        ports:\n        - containerPort: 8000\n        startupProbe:\n          exec:\n            command:\n            - cat\n            - /server-test.py\n          initialDelaySeconds: 10\n          failureThreshold: 30 # 30 * 10 = 300 + 10 = 310 sec\n          periodSeconds: 10\n        readinessProbe:\n          httpGet:\n            path: /\n            port: 8000\n          initialDelaySeconds: 10\n          periodSeconds: 5\n        livenessProbe:\n          exec:\n            command:\n            - cat\n            - /server-test.py\n          failureThreshold: 1\n          periodSeconds: 10\n  ```\n\n\n# Переопределение CMD и ENTRYPOINT Docker иструкций\n\nДля переопределения CMD инструкций, мы их указываем в args аттрибуте контейнера\n\n```\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: kuber-args\n  labels:\n    app: kuber\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: http-server-args\n  template:\n    metadata:\n      labels:\n        app: http-server-args\n    spec:\n      containers:\n      - name: kuber-app\n        image: bakavets/kuber:v1.0-args\n        args: \n        - \"3\"\n        - \"2\"\n        - text-temp\n        ports:\n        - containerPort: 8000\n```\n\nДля переопределения ENTRYPOINT мы пишем инструкцию command\n```\n  template:\n    metadata:\n      labels:\n        app: http-server-args\n    spec:\n      containers:\n      - name: kuber-app\n        image: bakavets/kuber:v1.0-args\n        command: [\"xiu\", \"-c\", \"/etc/xiu/config_rtmp.toml\"]\n        # при указании в столбик числа необходимо брать в двойные кавычки\n        args: \n        - \"3\"\n        - \"2\"\n        - text-temp\n        ports:\n        - containerPort: 8000\n```\n\n\n\n# DaemonSet\nЗапускает какой-либо один под на всех нодах или нодах с определённым лейблом.\n\n```\napiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n  name: kuber-daemonset\n  labels:\n    app: kuber-daemonset\nspec:\n  selector:\n    matchLabels:\n      app: kuber-daemon\n  template:\n    metadata:\n      labels:\n        app: kuber-daemon\n    spec:\n      nodeSelector:\n        gpu: \"true\"\n      containers:\n      - name: kuber-app\n        image: bakavets/kuber\n        ports:\n        - containerPort: 8000\n```\n\n# Volumes\nЕсли мы скачиваем что-то во врайтабл слой контейнера, это медленнее и занимает больше места на диске. В кубернетес можно примонтировать к контейнерам emptyDir, которая будет сохранять файлы на диск ноды и этот волюм будет жить до тех пор, пока живы поды. Если под закрашится и перезапустится, то эмтидир останется. Если под пересоздастся, то эмтидир удалится.\nЕсли мы монтируем эмтидир в каталог, в котором уже существуют данные, то эти данные скроются. Чтобы данные не скрывались, надо монтировать в папку используя параметр subPath.\nПример с эмтидиром:\n```\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: kuber\n  labels:\n    app: kuber\nspec:\n  replicas: 3\n  selector:\n    matchLabels:\n      app: http-server\n  template:\n    metadata:\n      labels:\n        app: http-server\n    spec:\n      containers:\n      - name: kuber-app-1\n        image: bakavets/kuber\n        ports:\n        - containerPort: 8000\n        volumeMounts:\n        - mountPath: /cache-1\n          name: cache-volume\n      - name: nginx\n        image: nginx\n        ports:\n        - containerPort: 80\n        volumeMounts:\n        - mountPath: /usr/share/nginx/html/data\n        # - mountPath: /cache-2\n          name: cache-volume\n          subPath: data\n      volumes:\n      - name: cache-volume\n        emptyDir: {}\n```\n\nДанные в эмтидир можно так же сохранять в памяти. Для этого надо прописать параметр medium: Memory:\n```\n  volumes:\n  - name: shared-data\n    emptyDir: # {}\n       medium: Memory\n```\n\n\n- hostPath. Этот тип не рекомендует использовать сам кубернетес, так как происходит монтирование директории хоста. А если вдруг его используешь, то надо ставить ридонли.\n```\n\napiVersion: v1\nkind: Pod\nmetadata:\n  name: test-pd\nspec:\n  containers:\n  - image: bakavets/kuber\n    name: test-container\n    volumeMounts:\n    - mountPath: /test-pd\n      name: test-volume\n  volumes:\n  - name: test-volume\n    hostPath:\n      # directory location on host\n      path: /data\n      # this field is optional\n      type: Directory\n  ```\n\n\n\n\n\n\npersistentVolumeClaim - заявка на ресурсы\npersistentVolume - ресурс\nи в самом ресурсе указываем claimName\n\n```\n# https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-v1/\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: aws-pv-kuber\n  labels:\n    type: aws-pv-kuber\nspec:\n  capacity:\n    storage: 3Gi\n  accessModes: # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes\n    - ReadWriteOnce\n  persistentVolumeReclaimPolicy: Retain # https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-v1/#PersistentVolumeSpec # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#recycle\n  storageClassName: \"\" # Empty value means that this volume does not belong to any StorageClass. https://kubernetes.io/docs/concepts/storage/persistent-volumes/#class-1\n  awsElasticBlockStore:\n    volumeID: \"vol-02a71cfd076eac916\"\n    fsType: ext4\n```\n\n```\n# https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-v1/\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: aws-pv-kuber\n  labels:\n    type: aws-pv-kuber\nspec:\n  capacity:\n    storage: 3Gi\n  accessModes: # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes\n    - ReadWriteOnce\n  persistentVolumeReclaimPolicy: Retain # https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-v1/#PersistentVolumeSpec # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#recycle\n  storageClassName: \"\" # Empty value means that this volume does not belong to any StorageClass. https://kubernetes.io/docs/concepts/storage/persistent-volumes/#class-1\n  awsElasticBlockStore:\n    volumeID: \"vol-02a71cfd076eac916\"\n    fsType: ext4\n```\n\n```\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: kuber\n  labels:\n    app: kuber\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: http-server\n  template:\n    metadata:\n      labels:\n        app: http-server\n    spec:\n      containers:\n      - name: kuber-app\n        image: bakavets/kuber\n        ports:\n        - containerPort: 8000\n        volumeMounts:\n        - mountPath: /cache\n          name: cache-volume\n      volumes:\n      - name: cache-volume\n        persistentVolumeClaim:\n          claimName: aws-pvc-kuber\n```\n\n\n\n\n\nС помощью storageclass можно настроить автоматическсое создание persistentvolume\n```\napiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n  name: ebs-csi-gp3\nprovisioner: ebs.csi.aws.com\nallowVolumeExpansion: true\nparameters:\n  type: gp3\n  fsType: ext4\n```\n\n\n\n\n\n# ConfigMap\nДля хранения несекретных данных в формате ключ-значение. Поды могут использовать их как переменные окружения, аргументы командной строки или файлы конфигурации волюмов.\nНапример, нам надо указать хост базы данных.\nКонфиг файлы для приложений.\nЕсли конфиг файлы большие, то обычно используют волюмы.\n\n\nПример конфигмапа:\n```\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: demo-cm\ndata:\n  # property-like keys; each key maps to a simple value\n  interval: \"5\"\n  count: \"3\"\n  # file-like keys\n  properties: |\n    Hello from World!\n    This is demo config!\n    As an example.\n  config.ini: \"This is demo config!\"\n```\n\nПример деплоя с конфигмапом:\n```\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: kuber-2\n  labels:\n    app: kuber-2\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: http-server-2\n  template:\n    metadata:\n      labels:\n        app: http-server-2\n    spec:\n      containers:\n      - name: kuber-app\n        image: bakavets/kuber:v1.0-args\n        args: [\"$(INTERVAL)\",\"$(COUNT)\",\"$(TEXT_ARG)\"]\n        ports:\n        - containerPort: 8000\n        env:\n          - name: INTERVAL\n            valueFrom:\n              configMapKeyRef:\n                name: demo-cm\n                key: interval\n          - name: COUNT\n            valueFrom:\n              configMapKeyRef:\n                name: demo-cm\n                key: count\n          - name: TEXT_ARG\n            valueFrom:\n              configMapKeyRef:\n                name: demo-cm\n                key: properties\n        volumeMounts:\n        - name: config\n          mountPath: \"/config\"\n          readOnly: true\n      volumes:\n        # You set volumes at the Pod level, then mount them into containers inside that Pod\n        - name: config\n          configMap:\n            # Provide the name of the ConfigMap you want to mount.\n            name: demo-cm\n            # An array of keys from the ConfigMap to create as files\n            items:\n            - key: \"properties\"\n              path: \"properties\"\n            - key: \"config.ini\"\n              path: \"config.ini\"\n```\n\nКогдв мы мапим конфиг через volumeMounts, у нас скроются все остальные файлы в каталоге.\nЧтобы не скрылись, можно использовать subPath:\n```\n          volumeMounts:\n            - name: nginx-conf\n              mountPath: /etc/nginx/conf.d/nginx.conf\n              subPath: nginx.conf\n              readOnly: true\n```\n\nНиже полный пример\n\n```\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: nginx-conf-file\n  labels:\n    app: nginx\ndata:\n  nginx.conf: |\n    server {\n      listen 80;\n      access_log /var/log/nginx/reverse-access.log;\n      error_log /var/log/nginx/reverse-error.log;\n      location / {\n            proxy_pass https://github.com/bakavets;\n      }\n    }\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: nginx-proxy\nspec:\n  selector:\n    matchLabels:\n      app: nginx\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: nginx\n    spec:\n      containers:\n        - name: nginx\n          image: nginx\n          ports:\n          - containerPort: 80\n          volumeMounts:\n            - name: nginx-conf\n              mountPath: /etc/nginx/conf.d/nginx.conf\n              subPath: nginx.conf\n              readOnly: true\n      volumes:\n        - name: nginx-conf\n          configMap:\n            name: nginx-conf-file\n```\n\n\nПеременные окружения можно объявлять через блок env\n```\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: kuber-1\n  labels:\n    app: kuber-1\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: http-server-1\n  template:\n    metadata:\n      labels:\n        app: http-server-1\n    spec:\n      containers:\n      - name: kuber-app\n        image: bakavets/kuber:v1.0\n        ports:\n        - containerPort: 8000\n        env:\n        - name: HELLO\n          value: \"Hello\"\n        - name: WORLD\n          value: \"World\"\n        - name: ENV_HELLO_WORLD\n          value: \"$(HELLO)_$(WORLD) from Pod\"\n\n```\n\n\nCreate a Kubernetes Configmap with custom nginx.conf using kubectl:\n\nkubectl create configmap nginx-config --from-file=nginx.conf\n\nCreate ConfigMaps from literal values\nYou can use kubectl create configmap with the --from-literal argument to define a literal value from the command line:\n\nkubectl create configmap config --from-literal=interval=7 --from-literal=count=3 --from-literal=config.ini=\"Hello from ConfigMap\"\n\nCreate ConfigMaps from folder:\nkubectl create configmap my-config --from-file=configs/\n\nUse the option --from-env-file to create a ConfigMap from an env-file, for example:\nkubectl create configmap config-env-file --from-env-file=env-file.properties\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbgelov%2Fk8s-yamls","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbgelov%2Fk8s-yamls","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbgelov%2Fk8s-yamls/lists"}