рдореИрдВ .NET рдХреЛрд░ + рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ + рдПрдкреЗрдЯреНрд░рд┐рдХреНрд╕ + рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ + рдЧреНрд░рд╛рдлрд╛рдирд╛ + рдЬреЙрдмреНрд╕ + рд╕реНрд╡рд╛рд╕реНрдереНрдп рдЬрд╛рдВрдЪ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ

рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд╛рдЗрдЯ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ, рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ, рдЕрдиреБрд╕реВрдЪрд┐рдд рдиреМрдХрд░рд┐рдпреЛрдВ рдФрд░ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдЬрд╛рдВрдЪ рдХрд░рдиреЗ (рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб рд╕рдВрд▓рдЧреНрди рд╣реИрдВ) рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп

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

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


рд▓рд┐рдирдХреНрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рдорд┐рдиреАрдмреНрдпреВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
  1. рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдбреЙрдХрдЯрд░ рдбреЗрд╕реНрдХрдЯреЙрдк рд╣реИ
  2. рдЗрд╕рдореЗрдВ рдЖрдкрдХреЛ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдПрдХрд▓-рдиреЛрдб рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
  3. рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ kubernetis рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ http: // localhost: 8001 / рд╣реИ
  4. рдЙрд╕рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреБрдмреЗрдХреЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддрд╛ рд╣реИ
    рдХрдорд╛рдВрдб> kubectl version рд╕рд╛рде рдЗрд╕рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ
    рдирд╡реАрдирддрдо рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдпрд╣рд╛рдБ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ https://storage.googleapis.com/kubernetes-release/release/stable.txt
    рдЖрдк рдЗрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд▓рд┐рдВрдХ https://storage.googleapis.com/kubernetes-release/release/v1.13.2/bin/windows/amd64/kubectl.exe рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
  5. kubectl cluster-info рдХрд┐ рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛рд░реНрдп рдХрд░ рд░рд╣рд╛ рд╣реИ> kubectl cluster-info

рдпреВрдЖрдИ рд╕реНрдерд╛рдкрдирд╛


  1. рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдХ рд╣реА рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
     kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml 
  2. рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
     kubectl describe secret 

    рдФрд░ рдХреЙрдкреА рдХрд░реЗрдВ
  3. рдЕрдм рдкреНрд░реЙрдХреНрд╕реА рд╢реБрд░реВ рдХрд░реЗрдВ
     kubectl proxy 
  4. рдФрд░ рдЖрдк http: // localhost: 8001 / api / v1 / namespaces / kube-system / services / https: kubernetes-dashboard: /xy / рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ


рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдЪрд▓ рд░рд╣рд╛ рд╣реИ


  1. рдореИрдВрдиреЗ рд╕реНрдЯреВрдбрд┐рдпреЛ https://github.com/SanSYS/kuberfirst рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдорд╛рдирдХ mvc netcoreapp2.1 рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдпрд╛
  2. Dockerfile:
     FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY ./MetricsDemo.csproj . RUN ls RUN dotnet restore "MetricsDemo.csproj" COPY . . RUN dotnet build "MetricsDemo.csproj" -c Release -o /app FROM build AS publish RUN dotnet publish "MetricsDemo.csproj" -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "MetricsDemo.dll"] 
  3. рдЗрд╕ рдЪреАрдЬрд╝ рдХреЛ рдореАрдЯреНрд░рд┐рдХ 3 рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛
     docker build -t metricsdemo3 . 
  4. рд▓реЗрдХрд┐рди! рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреЛрдмрд░рд╛ рд╣рдм рд╕реЗ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдЦреАрдВрдЪрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕реНрдерд╛рдиреАрдп рд░рдЬрд┐рд╕реНрдЯрд░ рдЙрдард╛рддрд╛ рд╣реВрдВ
  5. рдиреЛрдЯ - рдХреБрдмреЗрд░рдиреЗрдЯрд┐рд╕ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА
     docker create -p 5000:5000 --restart always --name registry registry:2 
  6. рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЕрдзрд┐рдХреГрдд рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ:
     { "registry-mirrors": [], "insecure-registries": [ "localhost:5000" ], "debug": true, "experimental": false } 
  7. рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдзрдХреНрдХрд╛ рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЗрд╢рд╛рд░реЛрдВ
     docker start registry docker tag metricsdemo3 localhost:5000/sansys/metricsdemo3 docker push localhost:5000/sansys/metricsdemo3 
  8. рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
  9. UI рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ



рдпрджрд┐ рдпрд╣ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ рдФрд░ рдЖрдк рд╕рдВрдЪрд╛рд▓рди рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ


рдПрдХ рддреИрдирд╛рддреА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ
1-рддреИрдирд╛рддреА-app.yaml
 kind: Deployment apiVersion: apps/v1 metadata: name: metricsdemo labels: app: web spec: replicas: 2 #    (  ) #  ,      selector: matchLabels: app: metricsdemo template: metadata: labels: app: metricsdemo #     selector  kind: Service spec: containers: - name: metricsdemo #   image: localhost:5000/sansys/metricsdemo3 #    ports: - containerPort: 80 #       # :    ,       --- kind: Service apiVersion: v1 metadata: name: metricsdemo #    __meta_kubernetes_service_name="metricsdemo",  https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config labels: apptype: business #    __meta_kubernetes_service_label_apptype="business" -  instancetype: web #    __meta_kubernetes_service_label_instancetype="web" spec: selector: app: metricsdemo #    labels:app type: LoadBalancer #      ports: - protocol: TCP #    _meta_kubernetes_service_port_protocol="TCP" port: 9376 targetPort: 80 name: portapi #    __meta_kubernetes_service_port_name="portapi" 

рдЫреЛрдЯрд╛ рд╡рд┐рд╡рд░рдг
  • Kind - рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ yaml рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЗрдХрд╛рдИ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
  • apiVersion - рд╡рд╕реНрддреБ рдХреЛ рдХрд┐рд╕ рдПрдкреАрдЖрдИ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  • рд▓реЗрдмрд▓ - рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рд▓реЗрдмрд▓ (рдмрд╛рдИрдВ рдУрд░ рдХреА рдХреБрдВрдЬрд┐рдпрд╛рдБ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рд╕реЛрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)
  • рдЪрдпрдирдХрд░реНрддрд╛ - рдЖрдкрдХреЛ рддреИрдирд╛рддреА рдХреЗ рд╕рд╛рде рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЗрдмрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ

рдЕрдЧрд▓рд╛:
 kubectl create -f .\1-deployment-app.yaml 

рдФрд░ рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЕрдкрдиреА рддреИрдирд╛рддреА рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП http: // localhost: 8001 / api / v1 / namespaces / kube-system / services / https: kubernetes-рдбреИрд╢рдмреЛрд░реНрдб: / рдкреНрд░реЙрдХреНрд╕реА / #! / рддреИрдирд╛рддреА? рдиреЗрдорд╕реНрдкреЗрд╕ = рдбрд┐рдлрд╝реЙрд▓реНрдЯ
рд╕реНрдХреНрд░реАрди

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



рдЖрд╡реЗрджрди рдореЗрдВ рдХрд╕реНрдЯрдо рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдЬреЛрдбрд╝рдирд╛


рдЖрд╡реЗрджрди рдореЗрдВ рдкреИрдХреЗрдЬ https://www.app-metrics.io/ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛
рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдЬреЛрдбрд╝реВрдВрдЧрд╛, рдЕрднреА рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ - рдореИрдВ рдПрдкреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХреЗ рдХрд╛рдЙрдВрдЯрд░реЛрдВ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реВрдВ
рдпрд╣рд╛рдБ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╣реИ
 private static void AutoDiscoverRoutes(HttpContext context) { if (context.Request.Path.Value == "/favicon.ico") return; List<string> keys = new List<string>(); List<string> vals = new List<string>(); var routeData = context.GetRouteData(); if (routeData != null) { keys.AddRange(routeData.Values.Keys); vals.AddRange(routeData.Values.Values.Select(p => p.ToString())); } keys.Add("method"); vals.Add(context.Request.Method); keys.Add("response"); vals.Add(context.Response.StatusCode.ToString()); keys.Add("url"); vals.Add(context.Request.Path.Value); Program.Metrics.Measure.Counter.Increment(new CounterOptions { Name = "api", //ResetOnReporting = true, // ,     MeasurementUnit = Unit.Calls, Tags = new MetricTags(keys.ToArray(), vals.ToArray()) }); } 

рдФрд░ рдПрдХрддреНрд░рд┐рдд рдореЗрдЯреНрд░рд┐рдХреНрд╕ http: // localhost: 9376 / рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ



* IMetricRoot рдпрд╛ рдЗрд╕рдХреЗ рдЕрдореВрд░реНрдд рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (Services.AddMetrics (Program.Metrics); )

рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╕рдВрдЧреНрд░рд╣


рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╕реЗрдЯрд┐рдВрдЧ: рдЗрд╕рдХреЗ рдХреЙрдиреНрдлрд┐рдЧрд░ (prometheus.yml) рдореЗрдВ рдПрдХ рдирдпрд╛ рдХрд╛рдо рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдирдпрд╛ рд▓рдХреНрд╖реНрдп рдмрдирд╛рдПрдВ:
 global: scrape_interval: 15s evaluation_interval: 15s rule_files: # - "first.rules" # - "second.rules" scrape_configs: - job_name: prometheus static_configs: - targets: ['localhost:9090', '__:'] 

рд▓реЗрдХрд┐рди рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЛ рдХреБрдмреЗрд░рдиреЗрдЯрд┐рд╕ https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kuberneteses/sd_config рд╕реЗ рдореАрдЯреНрд░рд┐рдХ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХрд╛ рдореВрд▓ рд╕рдорд░реНрдерди рд╣реИ
рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛ рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЫрд╛рдирдиреЗ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ: рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд▓реЗрдмрд▓
рдбреЙрдХ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдиреМрдХрд░реА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
 - job_name: business-metrics #     metrics_path: /metrics kubernetes_sd_configs: - role: endpoints #   .   service,pod,ingress static_configs: - targets: - localhost:9090 relabel_configs: #       default   c  apptype = business - action: keep regex: default;business source_labels: - __meta_kubernetes_namespace - __meta_kubernetes_service_label_apptype 

рдХреБрдмреЗрд░рдиреЗрдЯрд┐рд╕ рдореЗрдВ, рдХреЙрдиреНрдлрд┐рдЧрд░ рдлрд╛рдЗрд▓ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕реНрдерд╛рди рд╣реИ - рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди
рдореИрдВ рдЗрд╕ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рд╡рд╣рд╛рдВ рд╕рд╣реЗрдЬрддрд╛ рд╣реВрдВ:
2-рдкреНрд░реЛрдореЗрдерд┐рдпрд╕-configmap.yaml
 apiVersion: v1 kind: ConfigMap #  ,   metadata: name: prometheus-config #  - namespace: default labels: kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: EnsureExists data: #     prometheus.yml: | global: scrape_interval: 5s # Default is every 1 minute. evaluation_interval: 5s # The default is every 1 minute. scrape_configs: - job_name: prometheus static_configs: - targets: - localhost:9090 - job_name: business-metrics #     metrics_path: /metrics kubernetes_sd_configs: - role: endpoints #   .   service,pod,ingress static_configs: - targets: - localhost:9090 relabel_configs: #       default   c  apptype = business - action: keep regex: default;business source_labels: - __meta_kubernetes_namespace - __meta_kubernetes_service_label_apptype 

рдХреБрдмреЗрд░рдиреЗрдЯрд┐рд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрдерд╛рди
 kubectl create -f .\2-prometheus-configmap.yaml 

рдЕрдм рдЖрдкрдХреЛ рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
kubectl create -fред \ 3-рдкрд░рд┐рдирд┐рдпреЛрдЬрди-prometheus.yaml
 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: prometheus namespace: default spec: replicas: 1 template: metadata: labels: app: prometheus-server spec: containers: - name: prometheus image: prom/prometheus args: - "--config.file=/etc/config/prometheus.yml" - "--web.enable-lifecycle" ports: - containerPort: 9090 volumeMounts: - name: prometheus-config-volume #    mountPath: /etc/config/ #     volumes: - name: prometheus-config-volume #     configMap: defaultMode: 420 name: prometheus-config #  - --- kind: Service apiVersion: v1 metadata: name: prometheus spec: selector: app: prometheus-server #    labels:app type: LoadBalancer #      ports: - protocol: TCP port: 9090 targetPort: 9090 

рдзреНрдпрд╛рди рджреЗрдВ - prometheus.yml рдлрд╝рд╛рдЗрд▓ рдХрд╣реАрдВ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди-рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рднреА рдлрд╛рдЗрд▓реЗрдВ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕-рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди-рд╡реЙрд▓реНрдпреВрдо рдЦрдВрдб рдореЗрдВ рдлрд╛рдЗрд▓реЗрдВ рдмрди рдЬрд╛рддреА рд╣реИрдВ, рдЬреЛ / etc / config / рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдореБрд╣рд┐рдо рдХреА рдЬрд╛рддреА рд╣реИ
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдкрде рдХреЗ рд╕рд╛рде рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рддрд░реНрдХ рд╣реИрдВ
--web.enable-lifecycle - рдХрд╣рддреА рд╣реИ рдХрд┐ рдЖрдк POST / - / рд░реАрд▓реЛрдб рдХреЛ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдирдП рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ (рдЙрдкрдпреЛрдЧреА рдЕрдЧрд░ рдХреЙрдиреНрдлрд┐рдЧрд░ "рдлреНрд▓рд╛рдИ рдкрд░" рдмрджрд▓рддрд╛ рд╣реИ рдФрд░ рдЖрдк рдХрдВрдЯреЗрдирд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреИрдирд╛рдд рд╣реИ
 kubectl create -f .\3-deployment-prometheus.yaml 

рдЫреЛрдЯреЗ рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ рдФрд░ рдкрддрд╛ http: // localhost: 9090 / рд▓рдХреНрд╖реНрдп рдкрд░ рдЬрд╛рдПрдВ , рдЖрдкрдХреЛ рд╡рд╣рд╛рдВ рдЕрдкрдиреА рд╕реЗрд╡рд╛ рдХреЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБрдУрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП



рдФрд░ рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рдЖрдк рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ
 sum by (response, action, url, app) (delta(application_api[15s])) 

рдмрд╢рд░реНрддреЗ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рд╕рд╛рдЗрдЯ рдкрд░ рдЬрд╛ рд░рд╣рд╛ рдерд╛, рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓реЗрдЧрд╛


рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛ - https://prometheus.io/docs/prometheus/latest/querying/asasics/

рдЧреНрд░рд╛рдлрд╛рдирд╛ рдореЗрдВ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ


рд╣рдо рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдереЗ - рд╕рдВрд╕реНрдХрд░рдг 5 рддрдХ, рдбреИрд╢рдмреЛрд░реНрдб рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗрд╡рд▓ HTTP рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦрд┐рд╕рдХрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдм рдЖрдк рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЧреНрд░рд╛рдлреНрдЯрд╛рдирд╛ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдбреИрд╢рдмреЛрд░реНрдб рдХреЛ рдЦреАрдВрдЪ рд╕рдХрддрд╛ рд╣реИ
  1. /etc/grafana/provisioning/datasources/ - source configs (рдкреНрд░реЛрдореЗрдЯрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕, рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬрд╝, рдЬрд╝реИрдмрд┐рдХреНрд╕, рдЗрд▓рд╛рд╕реНрдЯрд┐рдХ, рдЖрджрд┐)
  2. /etc/grafana/provisioning/dashboards/ - /etc/grafana/provisioning/dashboards/ рдПрдХреНрд╕реЗрд╕ рд╕реЗрдЯрд┐рдВрдЧреНрд╕
  3. /var/lib/grafana/dashboards/ - рдпрд╣рд╛рдБ рдореИрдВ рдЦреБрдж рдХреЛ рдбреИрд╢рдмреЛрд░реНрдб рдХреЛ json рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реВрдБрдЧрд╛

рдпрд╣ рдЗрд╕ рддрд░рд╣ рдирд┐рдХрд▓рд╛
 apiVersion: v1 kind: ConfigMap metadata: creationTimestamp: null name: grafana-provisioning-datasources namespace: default data: all.yml: | datasources: - name: 'Prometheus' type: 'prometheus' access: 'proxy' org_id: 1 url: 'http://prometheus:9090' is_default: true version: 1 editable: true --- apiVersion: v1 kind: ConfigMap metadata: creationTimestamp: null name: grafana-provisioning-dashboards namespace: default data: all.yml: | apiVersion: 1 providers: - name: 'default' orgId: 1 folder: '' type: file disableDeletion: false updateIntervalSeconds: 10 #how often Grafana will scan for changed dashboards options: path: /var/lib/grafana/dashboards --- apiVersion: v1 kind: ConfigMap metadata: creationTimestamp: null name: grafana-dashboards namespace: default data: service-http-requests.json: | { "annotations": { "list": [ { "builtIn": 1, "datasource": "-- Grafana --", "enable": true, "hide": true, "iconColor": "rgba(0, 211, 255, 1)", "name": "Annotations & Alerts", "type": "dashboard" } ] }, "editable": true, "gnetId": null, "graphTooltip": 0, "links": [], "panels": [ { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "fill": 1, "gridPos": { "h": 9, "w": 12, "x": 0, "y": 0 }, "id": 2, "legend": { "alignAsTable": false, "avg": false, "current": false, "max": false, "min": false, "rightSide": true, "show": true, "total": false, "values": false }, "lines": true, "linewidth": 1, "links": [], "nullPointMode": "null", "percentage": false, "pointradius": 5, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "expr": "sum by (response, action, url, app) (delta(application_api[15s]))", "format": "time_series", "interval": "15s", "intervalFactor": 1, "legendFormat": "{{app}} {{response}} - {{url}}", "refId": "A" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "Http requests", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ], "yaxis": { "align": false, "alignLevel": null } } ], "refresh": "5s", "schemaVersion": 16, "style": "dark", "tags": [], "templating": { "list": [] }, "time": { "from": "now-30m", "to": "now" }, "timepicker": { "refresh_intervals": [ "5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d" ], "time_options": [ "5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d" ] }, "timezone": "", "title": "Business metrics", "uid": "Dm0tD0Qik", "version": 1 } 

рдЦреБрдж рдХреА рддреИрдирд╛рддреА, рдХреЛрдИ рдирдИ рдмрд╛рдд рдирд╣реАрдВ
 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: grafana namespace: default labels: app: grafana component: core spec: replicas: 1 template: metadata: labels: app: grafana component: core spec: containers: - image: grafana/grafana name: grafana imagePullPolicy: IfNotPresent resources: limits: cpu: 100m memory: 100Mi requests: cpu: 100m memory: 100Mi env: - name: GF_AUTH_BASIC_ENABLED value: "true" - name: GF_AUTH_ANONYMOUS_ENABLED value: "true" - name: GF_AUTH_ANONYMOUS_ORG_ROLE value: Admin readinessProbe: httpGet: path: /login port: 3000 # initialDelaySeconds: 30 # timeoutSeconds: 1 volumeMounts: - name: grafana-provisioning-datasources mountPath: /etc/grafana/provisioning/datasources/ - name: grafana-provisioning-dashboards mountPath: /etc/grafana/provisioning/dashboards/ - name: grafana-dashboards mountPath: /var/lib/grafana/dashboards/ volumes: - name: grafana-provisioning-datasources configMap: defaultMode: 420 name: grafana-provisioning-datasources - name: grafana-provisioning-dashboards configMap: defaultMode: 420 name: grafana-provisioning-dashboards - name: grafana-dashboards configMap: defaultMode: 420 name: grafana-dashboards nodeSelector: beta.kubernetes.io/os: linux --- apiVersion: v1 kind: Service metadata: name: grafana namespace: default labels: app: grafana component: core spec: type: LoadBalancer ports: - protocol: TCP port: 3000 targetPort: 3000 selector: app: grafana component: core 

рд╡рд┐рд╕реНрддреГрдд рдХрд░реЗрдВ
 kubectl create -f .\4-grafana-configmap.yaml kubectl create -f .\5-deployment-grafana.yaml 

рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЧреНрд░реЗрдлрд╛рди рддреБрд░рдВрдд рдирд╣реАрдВ рдмрдврд╝рддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕рд╛рдЗрдХреНрд▓реЗрдЗрдЯ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк рд▓реЙрдЧ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ
рдЕрдм http: // localhost: 3000 / рдкрд░ рдЬрд╛рдПрдВ
рдФрд░ рдбреИрд╢рдмреЛрд░реНрдб рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ




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

рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдп


рдХреНрдпреВрдмреЗрд░ рдореЗрдВ рдореБрдХреБрдЯ рдкрд░ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд░реЛрдирдЬреЛрдм рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ
рдХреНрд░реЛрдирдЬреЙрдм рдХреЗ рд╕рд╛рде, рдЖрдк рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 # https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/ apiVersion: batch/v1beta1 kind: CronJob metadata: name: runapijob spec: schedule: "*/1 * * * *" jobTemplate: spec: template: spec: containers: - name: runapijob image: busybox args: - /bin/sh - -c - date; wget -O - http://metricsdemo:9376/api/job/run/wakeUp > /dev/null restartPolicy: OnFailure 

рд╢реЗрдбреНрдпреВрд▓ рд╕реЗрдХреНрд╢рди рдореБрдХреБрдЯ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕рд┐рдХ рдирд┐рдпрдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ
рдЯреНрд░рд┐рдЧрд░ рдХрдВрдЯреЗрдирд░ (рдкреЙрдбрдмреЙрдХреНрд╕) рдХреА рдкреЙрдб рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдореЗрдЯреНрд░рд┐рд╕рдбреЗрдореЗрдореЛ рд╕реЗрд╡рд╛ рдПрдкреА рд╡рд┐рдзрд┐ рдЦреАрдВрдЪрддрд╛ рд╣реВрдВ
рдЖрдк рдХрд╛рдо рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
 kubectl.exe get cronjob runapijob --watch 



рдиреМрдХрд░реА рд╕реЗ рдЭрдЯрдХрд╛ рджреЗрдиреЗ рд╡рд╛рд▓реА рдореБрдЦреНрдп рд╕реЗрд╡рд╛ рдХреЛ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реЗрд╡рд╛ рдореЗрдВ рдХреЙрд▓ рд▓рдЧрднрдЧ рдПрдХ рд╕рдорд╛рди рдкреНрд░рд╕рд╛рд░ рдХреЗ рд╕рд╛рде рдЪреВрд▓реНрд╣рд╛ рдореЗрдВ рдЬрд╛рддреА рд╣реИ
рдпрд╣ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ

рдХрд╛рд░реНрдп рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдХрдВрд╕реЛрд▓ рд╕реЗ рд▓реЙрдиреНрдЪ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ about рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ рдбреЗрдореЛ
 #   ,       -      kubectl run pi --image=perl -- perl -Mbignum=bpi -wle 'print bpi(2000)' #   . , ,  .   -   kubectl run pi --image=perl --restart=OnFailure -- perl -Mbignum=bpi -wle 'print bpi(2000)' #    5  kubectl run pi --image=perl --restart=OnFailure --schedule="0/5 * * * ?" -- perl -Mbignum=bpi -wle 'print bpi(2000)' 


рджреЛрд╖ рд╕рд╣рд┐рд╖реНрдгреБрддрд╛


рдпрджрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреНрд▓рд╕реНрдЯрд░ рдкреЙрдб рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИ
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рддрд░реАрдХрд╛ рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рдПрдкреА рдбреНрд░реЙрдк рдХрд░рддрд╛ рд╣реИ
 [HttpGet("kill/me")] public async void Kill() { throw new Exception("Selfkill"); } 

* Async рд╢реВрдиреНрдп рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдкреАрдЖрдИ рдореЗрдВ рдЬреЛ рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ, рдЙрд╕реЗ рдЕрдирд╣реЗрд▓реНрдб рдЕрдкрд╡рд╛рдж рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреНрд░реИрд╢ рдХрд░ рджреЗрддрд╛ рд╣реИ

рдореИрдВ http: // localhost: 9376 / api / job / рдХрд┐рд▓ / me рд╕реЗ рдЕрдкреАрд▓ рдХрд░рддрд╛ рд╣реВрдВ
рд╢реНрд░рд╡рдг рдХреА рд╕реВрдЪреА рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╕реЗрд╡рд╛ рдХреЗ рдХрд┐рд╕реА рдПрдХ рдЪреВрд▓реНрд╣рд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ



рд▓реЙрдЧ рдХрдорд╛рдВрдб рд╡рд░реНрддрдорд╛рди рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ -p рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдпрд╣ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓реЙрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЧрд┐рд░рд╛рд╡рдЯ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ: рдЧрд┐рд░ рдЧрдпрд╛ - рдЧреБрд▓рд╛рдм

рд▓реЗрдХрд┐рди рдЖрд╡реЗрджрди рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рд▓рд╛рдЗрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рдЧрд┐рд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдпрд╛ рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдзреАрд░реЗ-рдзреАрд░реЗ

рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ , рдлрд▓реА рдореЗрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдХрдо рд╕реЗ рдХрдо рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ "рдЙрддреНрддрд░рдЬреАрд╡рд┐рддрд╛" рд╣реИрдВ
  1. рддрддреНрдкрд░рддрд╛ - рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рдкреЙрдб рдкрд░ рдпрд╛рддрд╛рдпрд╛рдд рд╢реБрд░реВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдлрд▓реА рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдиреЗ рддрдХ рд╡рд╛рдкрд╕ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  2. liveness - "рдЙрддреНрддрд░рдЬреАрд╡рд┐рддрд╛ рдХреЗ рд▓рд┐рдП" рдЖрд╡реЗрджрди рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдХрд┐рд╕реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрд╕рд╛рдзрди рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧрддрд┐рд░реЛрдз рдФрд░ рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕рдордпрдмрд╛рд╣реНрдп), рддреЛ рдХрдВрдЯреЗрдирд░ рдлрд┐рд░ рд╕реЗ рдЪрд╛рд▓реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред 200 рдФрд░ 400 рдХреЗ рдмреАрдЪ рдХреЗ рд╕рднреА http рдХреЛрдб рдХреЛ рд╕рдлрд▓ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд╛рдХреА рд╕рднреА рд╡рд┐рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВ

рдореИрдВ рдЯрд╛рдЗрдордЖрдЙрдЯ рджреНрд╡рд╛рд░рд╛ рдкреБрдирдГ рдЖрд░рдВрдн рдХреА рдЬрд╛рдВрдЪ рдХрд░реВрдВрдЧрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рдПрдХ рдирдпрд╛ рдПрдкреА рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реВрдВрдЧрд╛, рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░ 123 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░рдЬреАрд╡рд┐рддрд╛ рд╕рддреНрдпрд╛рдкрди рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдзреАрдорд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред

 static bool deadlock; [HttpGet("alive/{cmd}")] public string Kill(string cmd) { if (cmd == "deadlock") { deadlock = true; return "Deadlocked"; } if (deadlock) Thread.Sleep(123 * 1000); return deadlock ? "Deadlocked!!!" : "Alive"; } 


рдореИрдВ рдХрдВрдЯреЗрдирд░ рдореЗрдВ 1-рдкрд░рд┐рдирд┐рдпреЛрдЬрди- app.yaml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреБрдЫ рдЦрдВрдб рдЬреЛрдбрд╝рддрд╛ рд╣реВрдБ:
 containers: - name: metricsdemo image: localhost:5000/sansys/metricsdemo3:6 ports: - containerPort: 80 readinessProbe: #       httpGet: path: /health port: 80 initialDelaySeconds: 5 periodSeconds: 5 livenessProbe: #      httpGet: path: /api/job/alive/check port: 80 initialDelaySeconds: 5 periodSeconds: 5 

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрдк рдиреЗ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд░рд╣рд╛ рд╣реИ
 kubectl get events --watch 

рдореИрдВ рдореЗрдиреВ рдХреЛ рджрдмрд╛рддрд╛ рд╣реВрдВ рдбреЗрдбрд▓реЙрдХ рдореА ( http: // localhost: 9376 / api / job / рдЬрд╝рд┐рдВрджрд╛ / рдЧрддрд┐рд░реЛрдз )



рдФрд░ рдкрд╛рдБрдЪ рд╕реЗрдХрдВрдб рдХреЗ рднреАрддрд░ рдореИрдВ рд╕рдорд╕реНрдпрд╛ рдФрд░ рдЙрд╕рдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдБ

 1s Warning Unhealthy Pod Liveness probe failed: Get http://10.1.0.137:80/api/job/alive/check: net/http: request canceled (Client.Timeout exceeded while awaiting headers) 1s Warning Unhealthy Pod Liveness probe failed: Get http://10.1.0.137:80/api/job/alive/check: net/http: request canceled (Client.Timeout exceeded while awaiting headers) 0s Warning Unhealthy Pod Liveness probe failed: Get http://10.1.0.137:80/api/job/alive/check: net/http: request canceled (Client.Timeout exceeded while awaiting headers) 0s Warning Unhealthy Pod Readiness probe failed: Get http://10.1.0.137:80/health: dial tcp 10.1.0.137:80: connect: connection refused 0s Normal Killing Pod Killing container with id docker://metricsdemo:Container failed liveness probe.. Container will be killed and recreated. 0s Normal Pulled Pod Container image "localhost:5000/sansys/metricsdemo3:6" already present on machine 0s Normal Created Pod Created container 0s Normal Started Pod Started container 


рдирд┐рд╖реНрдХрд░реНрд╖


  1. рдПрдХ рддрд░рдл, рдкреНрд░рд╡реЗрд╢ рджрд╣рд▓реАрдЬ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдмрд╣реБрдд рдХрдо рдирд┐рдХрд▓рд╛, рджреВрд╕рд░реА рддрд░рдл, рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреБрдмреЗрд░рдиреЗрдЯ рдХреНрд▓рд╕реНрдЯрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХрд╛ рдХрдВрдкреНрдпреВрдЯрд░ рд╣реИред рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ, рд░рд╛рдЬреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ, рдП / рдмреА рдкрд░реАрдХреНрд╖рдг рдЖрджрд┐ рдХреА рд╕реАрдорд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред
  2. рдкреНрд░реЛрдореЗрдерд╕ рдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдХреНрдпреВрдмрд░ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рджреМрд░рд╛рди рд╡рд┐рднрд┐рдиреНрди рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкрдврд╝рдХрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдпрд╣ рдХреНрд▓рд╕реНрдЯрд░ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ
  3. рдпрд╣ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдПрдХ рдлреАрдЪрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдирддреАрдЬрддрди, рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рдмрд┐рдирд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирдП рдореАрдЯреНрд░рд┐рдХред рдкреНрд░рдпрд╛рд╕ рдордВрдЪ рдФрд░ рдареЗрд╕ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рд▓рдЧреЗрдВрдЧреЗред рдЖрд░рд╛рдо рд╕реЗ


рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ


  1. рдЕрдиреБрдкреНрд░рдпреЛрдЧ : рдХреЗ : рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ : , рдЬреЛ рдХрд┐ рдЧреНрд░рд╛рдлреНрдЯрд╛рдирд╛ тЖТ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдбреЙрдХрдЯрд░-рдХрдВрдкреЛрдЬ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рд╣реИ
  2. kubectl create -f file.yml - рдПрдХ рдЗрдХрд╛рдИ рдмрдирд╛рдПрдБ
  3. kubectl delete -f file.yml - рдПрдХ рдЗрдХрд╛рдИ рд╣рдЯрд╛рдПрдВ
  4. kubectl get pod - рд╕рднреА рдЪреВрд▓реНрд╣реЛрдВ (рд╕реЗрд╡рд╛, рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ ...) рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
    • --namespace=kube-system - рдиреЗрдорд╕реНрдкреЗрд╕ рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ
    • -n kube-system - рдЗрд╕реА рддрд░рд╣
  5. kubectl -it exec grafana-d8d4d9f5c-cvnkh -- /bin/bash - рддрд▓ рдкрд░ рдЕрдиреБрд▓рдЧреНрдирдХ
  6. kubectl delete service grafana - рдПрдХ рд╕реЗрд╡рд╛, рдлрд▓реА рдХреЛ рд╣рдЯрд╛рдПрдВред рдкрд░рд┐рдирд┐рдпреЛрдЬрди (- рд╕рднреА рд╣рдЯрд╛рдПрдБ)
  7. kubectl describe - рдЗрдХрд╛рдИ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ (рдЖрдк рдЗрд╕реЗ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)
  8. kubectl edit service metricsdemo - рдиреЛрдЯрдкреИрдб рд▓реЙрдиреНрдЪ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдордХреНрдЦреА рдкрд░ рд╕рднреА рдпрд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
    рдбреЗрдореЛ
  9. kubectl --help - рдмрдбрд╝реА рдорджрдж)
  10. рдПрдХ рдЖрдо рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдлрд▓реА (рд╡рд┐рдЪрд╛рд░ - рдПрдХ рдЪрд▓ рд░рд╣реА рдЫрд╡рд┐), рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛ рдФрд░ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИрдВ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЕрдВрджрд░ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ (tcpdump / nc рдЖрджрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ)ред - рдпреБрдЬрд╝рд╛рдИ рдХреБрдмреЗрдЯреЗрд▓-рдбрд┐рдмрдЧ рд╣реИрдмреНрд░. com/en/company/flant/blog/ 436112


рд╕рдВрджрд░реНрдн


  1. рдРрдк рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреНрдпрд╛ рд╣реИ?
  2. Kubernetes
  3. рдкреНрд░реЛрдореЗрдерд┐рдпрд╕
  4. рдкреВрд░реНрд╡ рддреИрдпрд╛рд░ рдЧреНрд░рд╛рдлреНрдЯрд╛рдирд╛ рд╡рд┐рдиреНрдпрд╛рд╕
  5. рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд▓реЛрдЧ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рдХреБрдЫ рдЪреАрдЬреЗрдВ рдкреБрд░рд╛рдиреА рд╣реИрдВ) - рд╡рд╣рд╛рдБ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд▓реЙрдЧрд┐рдВрдЧ, рдЕрд▓рд░реНрдЯ рдЖрджрд┐ рднреА рд╣реИрдВред
  6. рд╣реЗрд▓реНрдо - рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рдкреНрд░рдмрдВрдзрдХ - рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЛрдореЗрдерд╕ + рдЧреНрд░рд╛рдлрд╛рдирд╛ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рдерд╛, рд▓реЗрдХрд┐рди рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ - рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ
  7. Coober рд╕реЗ Prometheus рдХреЗ рд▓рд┐рдП рдХреНрдпреВрдмреНрд╕
  8. рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдЕрд╕рдлрд▓рддрд╛ рдХреА рдХрд╣рд╛рдирд┐рдпрд╛рдБ
  9. Kubernetes-рд╣рд╛ред 5 рдЬрд╛рджреВрдЧрд░ рдХреЗ рд╕рд╛рде рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдлреЗрд▓рдУрд╡рд░ рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рддреИрдирд╛рдд рдХрд░реЗрдВ

рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдЬреАрдердм рдкрд░ рдЙрдкрд▓рдмреНрдз рдЬреИрдо

Source: https://habr.com/ru/post/hi437286/


All Articles