[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-kubernetes-kak-vyglyadit-yaml-manifest-dlya-deploya-java-spring-boot-prilozheniya":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},1325,"kak-vyglyadit-yaml-manifest-dlya-deploya-java-spring-boot-prilozheniya",26,"kubernetes","Kubernetes","☸️","Как выглядит YAML-манифест для деплоя Java\u002FSpring Boot приложения?","Полный набор манифестов для развёртывания типичного Spring Boot приложения включает Deployment, Service, Ingress, ConfigMap, Secret и HPA.\n\n\u003Cdetails>\n\u003Csummary>Deployment\u003C\u002Fsummary>\n\n```yaml\napiVersion: apps\u002Fv1\nkind: Deployment\nmetadata:\n  name: my-spring-app\n  namespace: production\n  labels:\n    app: my-spring-app\n    version: \"1.0.0\"\nspec:\n  replicas: 3\n  revisionHistoryLimit: 5\n  strategy:\n    type: RollingUpdate\n    rollingUpdate:\n      maxSurge: 1\n      maxUnavailable: 0\n  selector:\n    matchLabels:\n      app: my-spring-app\n  template:\n    metadata:\n      labels:\n        app: my-spring-app\n        version: \"1.0.0\"\n    spec:\n      terminationGracePeriodSeconds: 60\n      containers:\n        - name: app\n          image: my-registry\u002Fmy-spring-app:1.0.0\n          imagePullPolicy: Always\n          ports:\n            - name: http\n              containerPort: 8080\n              protocol: TCP\n          env:\n            - name: JAVA_OPTS\n              value: >-\n                -XX:MaxRAMPercentage=75.0\n                -XX:+UseContainerSupport\n                -Djava.security.egd=file:\u002Fdev\u002F.\u002Furandom\n            - name: SPRING_PROFILES_ACTIVE\n              value: \"kubernetes,production\"\n          envFrom:\n            - configMapRef:\n                name: spring-config\n            - secretRef:\n                name: spring-secret\n          resources:\n            requests:\n              memory: \"512Mi\"\n              cpu: \"250m\"\n            limits:\n              memory: \"1Gi\"\n              cpu: \"1000m\"\n          startupProbe:\n            httpGet:\n              path: \u002Factuator\u002Fhealth\u002Fliveness\n              port: http\n            initialDelaySeconds: 15\n            periodSeconds: 5\n            failureThreshold: 30\n          livenessProbe:\n            httpGet:\n              path: \u002Factuator\u002Fhealth\u002Fliveness\n              port: http\n            periodSeconds: 10\n            failureThreshold: 3\n          readinessProbe:\n            httpGet:\n              path: \u002Factuator\u002Fhealth\u002Freadiness\n              port: http\n            periodSeconds: 5\n            failureThreshold: 3\n      imagePullSecrets:\n        - name: registry-credentials\n```\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>Service\u003C\u002Fsummary>\n\n```yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: my-spring-app-service\n  namespace: production\n  labels:\n    app: my-spring-app\nspec:\n  type: ClusterIP\n  selector:\n    app: my-spring-app\n  ports:\n    - name: http\n      port: 80\n      targetPort: http\n      protocol: TCP\n```\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>Ingress\u003C\u002Fsummary>\n\n```yaml\napiVersion: networking.k8s.io\u002Fv1\nkind: Ingress\nmetadata:\n  name: my-spring-app-ingress\n  namespace: production\n  annotations:\n    nginx.ingress.kubernetes.io\u002Fproxy-body-size: \"10m\"\n    nginx.ingress.kubernetes.io\u002Fproxy-read-timeout: \"60\"\nspec:\n  ingressClassName: nginx\n  tls:\n    - hosts:\n        - api.example.com\n      secretName: api-tls-secret\n  rules:\n    - host: api.example.com\n      http:\n        paths:\n          - path: \u002F\n            pathType: Prefix\n            backend:\n              service:\n                name: my-spring-app-service\n                port:\n                  number: 80\n```\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>ConfigMap + Secret + HPA\u003C\u002Fsummary>\n\n```yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: spring-config\n  namespace: production\ndata:\n  SPRING_DATASOURCE_URL: \"jdbc:postgresql:\u002F\u002Fpostgres-service:5432\u002Fmydb\"\n  SPRING_JPA_HIBERNATE_DDL_AUTO: \"validate\"\n  SPRING_JPA_SHOW_SQL: \"false\"\n  SERVER_SHUTDOWN: \"graceful\"\n  SPRING_LIFECYCLE_TIMEOUT_PER_SHUTDOWN_PHASE: \"30s\"\n---\napiVersion: v1\nkind: Secret\nmetadata:\n  name: spring-secret\n  namespace: production\ntype: Opaque\nstringData:\n  SPRING_DATASOURCE_USERNAME: \"app_user\"\n  SPRING_DATASOURCE_PASSWORD: \"secure-password-here\"\n---\napiVersion: autoscaling\u002Fv2\nkind: HorizontalPodAutoscaler\nmetadata:\n  name: my-spring-app-hpa\n  namespace: production\nspec:\n  scaleTargetRef:\n    apiVersion: apps\u002Fv1\n    kind: Deployment\n    name: my-spring-app\n  minReplicas: 3\n  maxReplicas: 10\n  metrics:\n    - type: Resource\n      resource:\n        name: cpu\n        target:\n          type: Utilization\n          averageUtilization: 70\n```\n\n\u003C\u002Fdetails>\n\nВсе манифесты можно поместить в отдельные файлы в директории `k8s\u002F` и применить одной командой: `kubectl apply -f .\u002Fk8s\u002F -n production`.\n\n> **На собеседовании:** не нужно помнить YAML наизусть, но нужно знать структуру: какие ресурсы необходимы (Deployment, Service, ConfigMap, Secret, Probes) и ключевые поля (replicas, strategy, resources, probes). Частая ошибка — забыть про terminationGracePeriodSeconds или imagePullSecrets.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":19,"featuredSnippetReady":22},"Как выглядит YAML-манифест для деплоя Java\u002FSpring Boot прило — Gymterview","Полный набор манифестов для развёртывания типичного Spring Boot приложения включает Deployment, Service, Ingress, ConfigMap, Secret и HPA.","Полный набор манифестов для развёртывания типичного Spring Boot приложения включает Deployment, Service, Ingress, Config",[7,13],true]