OpenShift рдореЗрдВ рдЬрд╛рд╡рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рддреИрдирд╛рдд рдХрд░рдирд╛

рдРрд╕рд╛ рд▓рдЧреЗрдЧрд╛ рдХрд┐ рдРрд╕рд╛ рд╣реИ? рд╣рдо fabric8-maven-plugin рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЪрд▓рддреЗ рд╣реИрдВ: рдмрд┐рд▓реНрдбрд┐рдВрдЧ, OpenShift рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд░рди рдХрд░рддреЗ рд╣реБрдПред рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВрдиреЗ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛, рддреЛ рдореИрдВ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордЭ рдЪрд╛рд╣рддрд╛ рдерд╛, рдФрд░ рддрдм рдореИрдВ рдУрдкрдирд╢реАрдлреНрдЯ рдореЗрдВ рдЖрд╡реЗрджрди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рддреИрдирд╛рддреА рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдФрд░ рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдРрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓ рдЧрдпрд╛ред

  • рдореИрдВ рдЕрдкрдиреЗ рдЯреВрд▓ (рдорд╛рд╡реЗрди, рдЧреНрд░реЗрдбрд▓, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рд╕реНрд╡рдпрдВ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реВрдВред
  • рдореИрдВ рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЙрдХрд░ рдЫрд╡рд┐ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ
  • Openshift рдореЗрдВ рдмрд┐рд▓реНрдб рдФрд░ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЧрдИ рд╣реИ, рдЕрд░реНрдерд╛рдд рдХрд┐рд╕реА рднреА рдХрдВрдЯреЗрдирд░ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ, рдлрд▓реА рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рд╣реИрдВред
  • рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реА рдмрд╛рд╣рд░реА рд╡рд┐рдзрд╛рдирд╕рднрд╛, рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ

рдмреЗрд╢рдХ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рд╕реНрд╡рдпрдВ рдУрдкрдирд╢рд┐рдлреНрдЯ рдХреА рдЙрдкрд▓рдмреНрдз рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдмрд╣реБрддрд╛рдпрдд рд╕реЗ рд╣реИрдВред
рдФрд░ рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЬрд╛рд╡рд╛ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреА рддреИрдпрд╛рд░реА рд╣реИ, рдлрд┐рд░ рдореИрдВ рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдбреЙрдХрд░рдлрд╛рдЗрд▓ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рдирдХреА рдореБрдЭреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

Dockerfile

FROM openjdk

MAINTAINER Rylkov Alexander <arylkov@.>

COPY demo.springboot.mvn-0.0.1-SNAPSHOT.jar /deployments/app.jar

ENV JAVA_OPTS="$JAVA_OPTS -Xms500m -Xmx1024m"

EXPOSE 8080
EXPOSE 5005

ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /deployments/app.jar" ]

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рджреЛ рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрдВрдЧреА: рд╡рд┐рд░реВрдкрдг рд╕рд╛рдХреНрд╖реНрдп рдФрд░ рдбреЙрдХрдлрд╛рдЗрд▓ред



рдлрд╛рдЗрд▓реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╕рд╢рд░реНрдд рд╣реИ, рдпрджрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдбреЙрдХрд░ рдЫрд╡рд┐ рдореЗрдВ рдбреЙрдХрд░ рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдпрд╣рд╛рдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЕрдм, рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдореЗрдВ, рдмреЗрд╕рд┐рдХ рдЬрд╛рд╡рд╛ рдЗрдореЗрдЬ рдФрд░ рдореЗрд░реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рджреЛ рдкреЛрд░реНрдЯ рдЦреБрд▓реЗ рд╣реИрдВ, рдЖрджрд┐

ред рдЗрд╕ рдЪрд░рдг рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдФрд░ рдбреЙрдХрд┐рдВрдЧ рдЗрдореЗрдЬ рдХреЛ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреВрд▓ рдореЗрдВ рд╡рд┐рдХрд▓реНрдк / рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рд╣реИред

рдЕрдЧрд▓рд╛, рдореИрдВ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдУрдкрдирд╢рд┐рдлреНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ, рдпрд╣ рдСрдкрд░реЗрд╢рди рдПрдХ рдмрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рдХреЗрд╡рд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ, рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдФрд░ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд░ рд╕рдВрднрд╡ рдЪреАрдЬ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд╣рдо рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕рд░рд▓ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдореЗрдВ рддреАрди рд╕рдмрд╕реЗ рдЬрд░реВрд░реА рд╡рд┐рдиреНрдпрд╛рд╕ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ

  • ImageStream
  • Buildconfig
  • DeploymentConfig

рдЯреЗрдореНрдкрд▓реЗрдЯ рдЬрд╛рд╡рд╛-рдРрдк-рдирдореВрдирд╛
kind: Template
apiVersion: v1
metadata:
  labels:
    app: java-app-sample
  name: java-app-sample
  annotations:
    description: >-
      This example shows how to create a simple Java application in openshift
    tags: java
parameters:
  - name: APP_NAME
    description: application name
    value: app-sample
    required: true
objects:
  - kind: ImageStream
    apiVersion: v1
    metadata:
      name: "${APP_NAME}"
    spec:
      tags:
        - from:
            kind: DockerImage
            name: 172.30.1.1:5000/myproject/${APP_NAME}:latest
          name: latest
  - kind: BuildConfig
    apiVersion: v1
    metadata:
      name: "${APP_NAME}"
      labels:
        name: "${APP_NAME}"
    spec:
      source:
        binary: {}
        type: Binary
      strategy:
        type: Docker
      output:
        to:
          kind: DockerImage
          name: 172.30.1.1:5000/myproject/${APP_NAME}:latest
      postCommit: {}
      resources: {}
  - kind: DeploymentConfig
    apiVersion: v1
    metadata:
      name: "${APP_NAME}"
    spec:
      strategy:
        type: Rolling
        rollingParams:
          updatePeriodSeconds: 1
          intervalSeconds: 1
          timeoutSeconds: 120
        resources: {}
      replicas: 1
      selector:
        app: "${APP_NAME}"
      template:
        metadata:
          labels:
            app: "${APP_NAME}"
        spec:
          containers:
            - name: "${APP_NAME}"
              image: 172.30.1.1:5000/myproject/${APP_NAME}:latest
              ports:
                - containerPort: 8080
                  protocol: TCP
                - containerPort: 5005
                  protocol: TCP
              env:
                - name: TZ
                  value: Europe/Moscow
              resources:
                limits:
                  cpu: '0.5'
                  memory: 1000Mi
                requests:
                  cpu: '0.2'
                  memory: 500Mi
              imagePullPolicy: Always
          restartPolicy: Always
          dnsPolicy: ClusterFirst
    triggers:
      - type: ConfigChange
        imageChangeParams:
          automatic: true
          containerNames:
            - "${APP_NAME}"
          from:
            kind: ImageStreamTag
            name: 172.30.1.1:5000/myproject/${APP_NAME}:latest
      - type: ImageChange
    status: {}


рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ, рдХреБрдЫ рдХрдВрдЯреЗрдирд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрд╕рд╛рдзрди / рд╕реАрдорд╛рдПрдВ, рдЯреАрдмреА рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд░, рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд╛рдо (APP_NAME)ред рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛ рдкрддрд╛ рдорд┐рдиреАрд╢рдлрд╝реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ (рдореИрдВ рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ 172.30.1.1/10000/myproject/) рдФрд░ рдЕрдиреНрдпред

рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣рд╛рдБ рдЗрдВрдЧрд┐рдд рдХреА рдЧрдИ рд╣реИред

  - kind: BuildConfig
    spec:
      source:
        binary: {}
        type: Binary
      strategy:
        type: Docker

BuildConfig рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рд╕реНрд░реЛрдд рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдлрд╝рд╛рдЗрд▓ (s) рд╣реЛрдЧрд╛, рдФрд░ docker рдХреА рдЫрд╡рд┐ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рд░рдгрдиреАрддрд┐ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - Dockerfile (рдкреНрд░рдХрд╛рд░: Docker)

OpenShift рдореЗрдВ рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдмрдирд╛рддреЗ рд╣реИрдВред

 oc create -f template.yaml


рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ (рд╡реЗрдм тАЛтАЛUI рдХрдВрд╕реЛрд▓ рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдирд╣реАрдВ)ред



рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВрдЧреЗ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдирд╛рдо рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рдирд╣реАрдВ)

oc new-app java-app-sample -p APP_NAME=app-sample

рдЯреЗрдореНрдкрд▓реЗрдЯ рдирд╛рдо рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ



рдореЗрд░реЗ рддреАрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рдП рдЧрдП рд╣реИрдВред

рд╣рдо рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЖрд╡реЗрджрди рдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдФрд░ рддреИрдирд╛рддреА рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

>oc start-build app-sample --from-dir . --follow

рдЙрд╕ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрд╣рд╛рдВ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдлрд╝рд╛рдЗрд▓ рдФрд░ рдбреЙрдХрд░реАрдлрд╛рдЗрд▓ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд╕ --from-dir рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдкреВрд░реНрдг рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ OpenShift рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ docker рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдЫрд╡рд┐ рдХреЛ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдЖрджреЗрд╢ рдХреЗ рдЕрдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣ рд╕реЗред



рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝реЛрд▓реНрдбрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдУрдкрдирд╢рд┐рдлреНрдЯ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдиреЗ рдбреЙрдХрдлрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЫрд╡рд┐ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЙрдХрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХреА рдФрд░ рдЕрдВрдд рдореЗрдВ рдЫрд╡рд┐ рдХреЛ рдбреЙрдХрдЯрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рд░рдЦрд╛ред

рдЕрдиреБрдкреНрд░рдпреЛрдЧ OpenShift рд╡реЗрдм рдХрдВрд╕реЛрд▓



рдореЗрдВ рдкреНрд░рд╛рд░рдВрдн рд╣реБрдЖ ред рд▓реЙрдЧ рдореЗрдВ



рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд░



рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрдВрдЯреЗрдирд░ рдкреИрд░рд╛рдореАрдЯрд░



, рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд▓рдЧ-рдЗрди рдХреЗ рдмрд┐рдирд╛, рдЕрдзрд┐рдХрддрдо рдирд┐рдпрдВрддреНрд░рдг рдФрд░ рдкрд╕рдВрдж рдХреА рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдХреЗ рд╕рд╛рде, рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ OpenShift рдореЗрдВ рд░рдЦрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред

рд╕рд╛рдордЧреНрд░реА


OpenShift рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП Minishift рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ , рдореИрдВ Minishift рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛

All Articles