{"id":323462,"date":"2021-05-20T15:00:25","date_gmt":"2021-05-20T15:00:25","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=323462"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=323462","title":{"rendered":"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0432 Kubernetes \u0441 OpenTracing, Jaeger \u0438 Ingress-NGINX"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e56\/259\/933\/e56259933743d72b107b3d5d20d95df7.jpeg\" width=\"4000\" height=\"2666\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u044d\u043f\u043e\u0445\u0443, \u043a\u043e\u0433\u0434\u0430 \u043a\u0440\u0443\u043f\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0431\u043e\u043b\u0435\u0435 500 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0432\u0430\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b \u0441\u0431\u043e\u0439 \u0438\u043b\u0438 \u0441\u043d\u0438\u0437\u0438\u043b\u0430\u0441\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0411\u0435\u0437 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043f\u043e\u0438\u0441\u043a \u0438\u0433\u043e\u043b\u043a\u0438 \u0432 \u0441\u0442\u043e\u0433\u0435 \u0441\u0435\u043d\u0430.<\/p>\n<p><strong>\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 (Distributed Tracing)<\/strong> &#8212; \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0414\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0437\u0430\u043c\u0435\u043d\u0438\u043c.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 <a href=\"https:\/\/github.com\/diazjf\/meow-micro\"><u>Meow-Micro<\/u><\/a>, \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u041d\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435.<\/p>\n<h2> \u0427\u0442\u043e \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f?<\/h2>\n<ul>\n<li>\n<p>\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f&nbsp;<a href=\"https:\/\/golang.org\/\"><u>GoLang<\/u><\/a><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432&nbsp;<a href=\"https:\/\/kubernetes.io\/\"><u>Kubernetes<\/u><\/a><\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 NGINX \/&nbsp;<a href=\"https:\/\/github.com\/kubernetes\/ingress-nginx\"><u>Ingress-NGINX<\/u><\/a><\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c <a href=\"https:\/\/www.docker.com\/products\/docker-desktop\"><u>Docker-Desktop<\/u><\/a><\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c <a href=\"https:\/\/helm.sh\/\"><u>Helm v3<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435 \u043a\u043e\u0434, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Go, \u0443\u043c\u0435\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Ingress-nginx \u0438 \u0437\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b Kubernetes, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a Service \u0438 Deployment.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0441\u0432\u0435\u0436\u0438\u0442\u044c \u0437\u043d\u0430\u043d\u0438\u044f, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u044d\u0442\u0438\u043c\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/kubernetes.io\/docs\/tutorials\/kubernetes-basics\/\"><u>Kubernetes Basics<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/awkwardferny.medium.com\/getting-started-with-kubernetes-ingress-nginx-on-minikube-d75e58f52b6c\"><u>Ingress-Nginx Basics<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<h2>\u0417\u0430\u043f\u0443\u0441\u043a Kubernetes \u0432 Docker Desktop<\/h2>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 <a href=\"https:\/\/www.docker.com\/products\/docker-desktop\"><u>Docker Desktop<\/u><\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, \u043d\u043e \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Docker Desktop \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes:<\/p>\n<ol>\n<li>\n<p>\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443&nbsp;<strong><em>Preferences<\/em><\/strong><\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c82\/0a0\/e45\/c820a0e455fd2143479a63f3a781e894.png\" width=\"2724\" height=\"1664\"><figcaption><\/figcaption><\/figure>\n<p>2. \u0412\u044b\u0431\u0435\u0440\u0435\u0442\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0443&nbsp;<strong><em>Kubernetes<\/em><\/strong>, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0444\u043b\u0430\u0436\u043e\u043a&nbsp;<strong><em>Enable Kubernetes<\/em><\/strong> \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443&nbsp;<strong><em>Apply &amp; Restart<\/em><\/strong><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b4e\/475\/b92\/b4e475b92362300f9008215669fccd1b.png\" width=\"2724\" height=\"1664\"><figcaption><\/figcaption><\/figure>\n<p>3. \u0412 \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0435\u043c\u0441\u044f \u043e\u043a\u043d\u0435 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443&nbsp;<strong><em>Install<\/em><\/strong> \u0438 \u0434\u043e\u0436\u0434\u0438\u0442\u0435\u0441\u044c \u043f\u043e\u043a\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a50\/88f\/5cb\/a5088f5cb251961baf0ab700c23f5b23.png\" width=\"2724\" height=\"1664\"><figcaption><\/figcaption><\/figure>\n<p>4. \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0443\u043d\u043a\u0442&nbsp;<strong><em>Kubernetes <\/em><\/strong>\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0437\u0430\u0434\u0430\u0447<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/06e\/df4\/9c2\/06edf49c2c4463f1179b94abb1fc226c.png\" width=\"300\" height=\"419\"><figcaption><\/figcaption><\/figure>\n<p>5. \u0412 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u043c \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u0438\u0440\u0438\u0442\u0435&nbsp;<strong><em>docker-desktop<\/em><\/strong><\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8a9\/def\/102\/8a9def10239c868de03e67e267a09c9e.png\" width=\"300\" height=\"41\"><figcaption><\/figcaption><\/figure>\n<p>6. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043a \u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443<\/p>\n<pre><code>$ kubectl cluster-info  Kubernetes master is running at  https:\/\/kubernetes.docker.internal:6443 KubeDNS is running at https:\/\/kubernetes.docker.internal:6443\/api\/v1\/ namespaces\/kube-system\/services\/kube-dns:dns\/proxy<\/code><\/pre>\n<h2>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Ingress-NGINX Controller<\/h2>\n<p>1. \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0438\u0437 <a href=\"https:\/\/kubernetes.github.io\/ingress-nginx\/deploy\/#docker-for-mac\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430<\/u><\/a> \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Ingress-NGINX Controller.<\/p>\n<pre><code class=\"diff\">$ kubectl apply -f https:\/\/raw.githubusercontent.com\/kubernetes\/ingress-nginx\/controller-v0.45.0\/deploy\/static\/provider\/cloud\/deploy.yaml  namespace\/ingress-nginx created serviceaccount\/ingress-nginx created configmap\/ingress-nginx-controller created clusterrole.rbac.authorization.k8s.io\/ingress-nginx created clusterrolebinding.rbac.authorization.k8s.io\/ingress-nginx created role.rbac.authorization.k8s.io\/ingress-nginx created rolebinding.rbac.authorization.k8s.io\/ingress-nginx created service\/ingress-nginx-controller-admission created service\/ingress-nginx-controller created\\ deployment.apps\/ingress-nginx-controller created validatingwebhookconfiguration.admissionregistration.k8s.io\/ingress-nginx-admission created serviceaccount\/ingress-nginx-admission created] clusterrole.rbac.authorization.k8s.io\/ingress-nginx-admission created clusterrolebinding.rbac.authorization.k8s.io\/ingress-nginx-admission created role.rbac.authorization.k8s.io\/ingress-nginx-admission created rolebinding.rbac.authorization.k8s.io\/ingress-nginx-admission created job.batch\/ingress-nginx-admission-create created\\ job.batch\/ingress-nginx-admission-patch created<\/code><\/pre>\n<p>2. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u0447\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Ingress \u0421ontroller \u043f\u0440\u043e\u0448\u043b\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e. Pods \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u044b \u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 Ready.<\/p>\n<pre><code>$ kubectl get pods -n ingress-nginx  NAME                                     READY   STATUS    RESTARTS  ingress-nginx-admission-create-52jsl        0\/1     Completed   0           ingress-nginx-admission-patch-78fkc         0\/1     Completed   0           ingress-nginx-controller-6f5454cbfb-qsfnn   1\/1     Running     0 <\/code><\/pre>\n<p><strong>\u0412\u0430\u0436\u043d\u043e:<\/strong>&nbsp;\u0415\u0441\u043b\u0438 Pod \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 Pending \u0438\u0437-\u0437\u0430 \u043d\u0435\u0445\u0432\u0430\u0442\u043a\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 CPU\/Memory, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u043e\u0431\u0432\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 Docker Desktop.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/705\/2b5\/60f\/7052b560f0c17ade4fb584dba3b53b5d.png\" width=\"2724\" height=\"1664\"><figcaption><\/figcaption><\/figure>\n<h2>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Jaeger \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Ingress Controller<\/h2>\n<p><a href=\"https:\/\/github.com\/jaegertracing\/jaeger\"><u>Jaeger<\/u><\/a><u> <\/u>&#8212; \u044d\u0442\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043d\u0430\u0448\u0438\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c Jaeger \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435  Ingress Controller.<\/p>\n<p>1. \u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0439\u0442\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439&nbsp;<a href=\"https:\/\/github.com\/diazjf\/meow-micro\"><u>meow-micro<\/u><\/a>, \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e \u0432\u0441\u0435\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445.<\/p>\n<pre><code>$ git clone https:\/\/github.com\/diazjf\/meow-micro.git  Cloning into 'meow-micro'... remote: Enumerating objects: 105, done. ... $ cd meow-micro<\/code><\/pre>\n<p>2. \u0412 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0432\u044b \u043d\u0430\u0439\u0434\u0451\u0442\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0434\u043b\u044f <a href=\"https:\/\/hub.docker.com\/r\/jaegertracing\/all-in-one\"><u>jaeger-all-in-one<\/u><\/a>. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c Jaeger \u0438\u0437 \u044d\u0442\u0438\u0445 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432.<\/p>\n<pre><code>$ kubectl apply -f jaeger\/jaeger-all-in-one.yaml  deployment.apps\/jaeger created service\/jaeger-query created service\/jaeger-collector created service\/jaeger-agent created service\/zipkin created<\/code><\/pre>\n<p>3. \u0423\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e Jaeger \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0438 \u0433\u043e\u0442\u043e\u0432 \u043a \u0440\u0430\u0431\u043e\u0442\u0435.<\/p>\n<pre><code>$ kubectl get pods  NAME                      READY   STATUS    RESTARTS   AGE jaeger-6f6b5d8689-8gccp   1\/1     Running   0          17s<\/code><\/pre>\n<p>4. \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 Ingress-NGINX and Jaeger, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&nbsp;<strong><em>enable-opentracing&nbsp;<\/em><\/strong>\u0438&nbsp;<strong><em>jaeger-collector-host<\/em><\/strong>&nbsp;\u0432&nbsp;<strong><em>ingress-nginx-controller&nbsp;<\/em><\/strong>ConfigMap. \u0412 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 <strong><em>jaeger-collector-host <\/em><\/strong>\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u043c\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 Jaeger.<\/p>\n<pre><code>$ echo '   apiVersion: v1   kind: ConfigMap   data:     enable-opentracing: \"true\"     jaeger-collector-host: jaeger-agent.default.svc.cluster.local                 metadata:     name: ingress-nginx-controller     namespace: ingress-nginx   ' | kubectl replace -f - configmap\/ingress-nginx-controller replaced<\/code><\/pre>\n<p>5. \u0423\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 Ingress Controller \u0432\u043a\u043b\u044e\u0447\u0435\u043d&nbsp;\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d <strong><em>opentracing<\/em><\/strong><em>.<\/em><\/p>\n<pre><code>$ kubectl get pods -n ingress-nginx | grep controller  ingress-nginx-controller-6f5454cbfb-qptxt   1\/1     Running     0          8m56s  $ kubectl exec -it ingress-nginx-controller-6f5454cbfb-qptxt -n ingress-nginx -- bash -c \"cat nginx.conf | grep ngx_http_opentracing_module.so\"  load_module \/etc\/nginx\/modules\/ngx_http_opentracing_module.so;  $ kubectl exec -it ingress-nginx-controller-6f5454cbfb-qptxt -n ingress-nginx -- bash -c \"cat nginx.conf | grep jaeger\"  opentracing_load_tracer \/usr\/local\/lib\/libjaegertracing_plugin.so \/etc\/nginx\/opentracing.json;  $ kubectl exec -it ingress-nginx-controller-6f5454cbfb-qptxt -n ingress-nginx -- bash -c \"cat \/etc\/nginx\/opentracing.json\"  {   \"service_name\": \"nginx\",   \"propagation_format\": \"jaeger\",   \"sampler\": {     \"type\": \"const\",     \"param\": 1,     \"samplingServerURL\": \"http:\/\/127.0.0.1:5778\/sampling\"   },   \"reporter\": {     \"endpoint\": \"\",     \"localAgentHostPort\": \"jaeger-agent.default.svc.cluster.local:6831\"   },   \"headers\": {     \"TraceContextHeaderName\": \"\",     \"jaegerDebugHeader\": \"\",     \"jaegerBaggageHeader\": \"\",     \"traceBaggageHeaderPrefix\": \"\"   } }<\/code><\/pre>\n<p>Jaeger \u0438 Ingress Controller \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u044b. \u0421\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430\u0448\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b!<\/p>\n<h2>\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0422\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 <a href=\"https:\/\/github.com\/diazjf\/meow-micro\"><strong><u>meow-micro<\/u><\/strong><\/a><strong><u> <\/u><\/strong>\u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041a\u043b\u0438\u0435\u043d\u0442 <strong><em>meow-client<\/em><\/strong> &#8212; \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 REST \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441\u0435\u0440\u0432\u0438\u0441\u0443 <strong><em>meow-server <\/em><\/strong>\u0447\u0435\u0440\u0435\u0437 GRPC.<\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 REST \u0438 GRPC \u0441 GoLang:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/tutorialedge.net\/golang\/creating-restful-api-with-golang\/\"><u>GoLang HTTP Server<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/tutorialedge.net\/golang\/go-grpc-beginners-tutorial\/\"><u>GoLang GRPC Communication<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<h3>tracing.go<\/h3>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Jaeger \u0438\u0437 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f Helm \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438&nbsp;<a href=\"https:\/\/github.com\/diazjf\/meow-micro\/blob\/main\/helm\/templates\/meow-client.yaml\"><u>meow-client<\/u><\/a>&nbsp;and&nbsp;<a href=\"https:\/\/github.com\/diazjf\/meow-micro\/blob\/main\/helm\/templates\/meow-server.yaml\"><u>meow-server.<\/u><\/a><\/p>\n<pre><code>cfg, err := config.FromEnv() if err != nil { panic(fmt.Sprintf(\"Could not parse Jaeger env vars: %s\", err.Error()))  }   tracer, closer, err := cfg.NewTracer() if err != nil {    panic(fmt.Sprintf(\"Could not initialize jaeger tracer: %s\", err.Error()))  }<\/code><\/pre>\n<h3>client.go<\/h3>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 &#8212; \u0437\u0430\u0434\u0430\u0435\u0442 service name&nbsp;\u0434\u043b\u044f trace \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 span.<\/p>\n<ul>\n<li>\n<p><strong>Span<\/strong>&nbsp;\u2014 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0435\u043a\u043e\u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445). Span&#8217;\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 span&#8217;\u044b, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e span&#8217;\u043e\u0432 \u0432&nbsp;Trace.<\/p>\n<\/li>\n<li>\n<p><strong>Trace<\/strong>&nbsp;\u2014 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0436\u0438\u0437\u043d\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043e\u043d\u044f\u0442\u0438\u044f\u0445 <a href=\"https:\/\/www.jaegertracing.io\/docs\/1.22\/architecture\/#trace\"><u>trace<\/u><\/a> \u0438 <a href=\"https:\/\/www.jaegertracing.io\/docs\/1.22\/architecture\/#span\"><u>span<\/u><\/a> \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.<\/p>\n<pre><code>\/\/ main function span os.Setenv(\"JAEGER_SERVICE_NAME\", \"meow-client\") tracer, closer := tracing.Init() defer closer.Close() http.HandleFunc(\"\/\", func(w http.ResponseWriter, r *http.Request) { spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header)) span := tracer.StartSpan(\"send-meow-communication\", ext.RPCServerOption(spanCtx)) defer span.Finish() ... \/\/ sleep function span os.Setenv(\"JAEGER_SERVICE_NAME\", \"meow-client\") tracer, closer := tracing.Init() defer closer.Close() span := tracer.StartSpan(\"sleep\") defer span.Finish()<\/code><\/pre>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c <a href=\"https:\/\/helm.sh\/docs\/intro\/install\/\"><u>Helm v3<\/u><\/a> \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u043b\u044e\u0431\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 macOS \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e brew. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435. <\/p>\n<pre><code>$ brew install helm ... ==&gt; Downloading https:\/\/ghcr.io\/v2\/homebrew\/core\/helm\/manifests\/3.5.4 ######################################################################## 100.0% ==&gt; Downloading https:\/\/ghcr.io\/v2\/homebrew\/core\/helm\/blobs\/sha256:5dac5803c1ad2db3a91b0928fc472aaf80a4 ==&gt; Downloading from https:\/\/pkg-containers-az.githubusercontent.com\/ghcr1\/blobs\/sha256:5dac5803c1ad2db ######################################################################## 100.0% ==&gt; Pouring helm--3.5.4.big_sur.bottle.tar.gz ... $ helm version version.BuildInfo{Version:\"v3.3.4\", GitCommit:\"a61ce5633af99708171414353ed49547cf05013d\", GitTreeState:\"clean\", GoVersion:\"go1.14.9\"}<\/code><\/pre>\n<p>\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f Makefile \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes.<\/p>\n<pre><code># Build client and server from Dockerfile $ make build docker build -t meow-client:1.0 -f client\/Dockerfile . [+] Building 17.1s (10\/10) FINISHED ... docker build -t meow-server:1.0 -f server\/Dockerfile . [+] Building 0.5s (10\/10) FINISHED ... # Install Microservices into Kubernetes via Helm  $ make install helm install -f helm\/Values.yaml meow-micro .\/helm NAME: meow-micro LAST DEPLOYED: Mon Apr 26 13:42:38 2021 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e Pods \u043e\u0431\u043e\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438\u0441\u044c \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442.<\/p>\n<pre><code>$ kubectl get pods  NAME                           READY   STATUS    RESTARTS   AGE jaeger-6f6b5d8689-s7cln        1\/1     Running   0          26m meow-client-8b974778c-85896    1\/1     Running   0          15m meow-server-56f559db44-5mvgp   1\/1     Running   0          15m<\/code><\/pre>\n<h2>\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438<\/h2>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435! \u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443.<\/p>\n<p>\u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c Jaeger, \u0443\u043a\u0430\u0437\u0430\u0432 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u0430\u0434\u0440\u0435\u0441&nbsp;<a href=\"http:\/\/localhost:8081\/\"><u>http:\/\/localhost:8081<\/u><\/a>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2b4\/f71\/615\/2b4f71615c076670237a0b99e8b2752f.png\" width=\"1916\" height=\"868\"><figcaption><\/figcaption><\/figure>\n<p>2. \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430\u0448\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e.<\/p>\n<pre><code>$ curl http:\/\/localhost\/meow -X POST -d '{\"name\": \"Meow-Mixer\"}' 200 - Meow sent: Meow-Mixer<\/code><\/pre>\n<p>3. \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430. \u0412 \u043c\u0435\u043d\u044e Service \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 &#8212; <strong>nginx<\/strong>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bfa\/c38\/2a0\/bfac382a0a06995ad6699b7fac93ba22.png\" width=\"3360\" height=\"1724\"><figcaption><\/figcaption><\/figure>\n<p>4. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443&nbsp;<strong>Find Traces<\/strong>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2de\/832\/61c\/2de83261ca9bb60c32ec8ede1c492218.png\" width=\"3360\" height=\"1735\"><figcaption><\/figcaption><\/figure>\n<p>5. \u041e\u0442\u043e\u0431\u0440\u0430\u0437\u044f\u0442\u0441\u044f \u0432\u0441\u0435 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0434\u043b\u044f nginx. \u041a\u0430\u0436\u0434\u0443\u044e \u0438\u0437 \u043d\u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/56e\/65e\/361\/56e65e36128155e796beca24b66c576c.png\" width=\"3360\" height=\"1737\"><figcaption><\/figcaption><\/figure>\n<p>6. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043d\u044f\u043b \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/289\/c65\/027\/289c65027489afdbd97db7274f790b95.png\" alt=\"\" title=\"\" width=\"3360\" height=\"875\"><figcaption><\/figcaption><\/figure>\n<p>\u0418 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0443.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/063\/a3f\/33e\/063a3f33ef02d7412a452bec5669f11b.png\" width=\"3360\" height=\"1020\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0430\u0451\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430, \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0441\u044e \u0435\u0451 \u043c\u043e\u0449\u044c \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439.<\/p>\n<h2>\u0414\u0440\u0443\u0433\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438<\/h2>\n<p>\u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Jaeger \u0434\u043b\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 <a href=\"https:\/\/kubernetes.github.io\/ingress-nginx\/user-guide\/third-party-addons\/opentracing\/\"><u>Ingress-Nginx<\/u><\/a>. \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Zipkin \u0438\u043b\u0438 DataDog.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/timeweb\/blog\/558288\/\"> https:\/\/habr.com\/ru\/company\/timeweb\/blog\/558288\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u044d\u043f\u043e\u0445\u0443, \u043a\u043e\u0433\u0434\u0430 \u043a\u0440\u0443\u043f\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0431\u043e\u043b\u0435\u0435 500 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0432\u0430\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b \u0441\u0431\u043e\u0439 \u0438\u043b\u0438 \u0441\u043d\u0438\u0437\u0438\u043b\u0430\u0441\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0411\u0435\u0437 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043f\u043e\u0438\u0441\u043a \u0438\u0433\u043e\u043b\u043a\u0438 \u0432 \u0441\u0442\u043e\u0433\u0435 \u0441\u0435\u043d\u0430.<\/p>\n<p><strong>\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 (Distributed Tracing)<\/strong> &#8212; \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0414\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0437\u0430\u043c\u0435\u043d\u0438\u043c.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 <a href=\"https:\/\/github.com\/diazjf\/meow-micro\"><u>Meow-Micro<\/u><\/a>, \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u041d\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435.<\/p>\n<h2> \u0427\u0442\u043e \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f?<\/h2>\n<ul>\n<li>\n<p>\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f&nbsp;<a href=\"https:\/\/golang.org\/\"><u>GoLang<\/u><\/a><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432&nbsp;<a href=\"https:\/\/kubernetes.io\/\"><u>Kubernetes<\/u><\/a><\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 NGINX \/&nbsp;<a href=\"https:\/\/github.com\/kubernetes\/ingress-nginx\"><u>Ingress-NGINX<\/u><\/a><\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c <a href=\"https:\/\/www.docker.com\/products\/docker-desktop\"><u>Docker-Desktop<\/u><\/a><\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c <a href=\"https:\/\/helm.sh\/\"><u>Helm v3<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435 \u043a\u043e\u0434, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Go, \u0443\u043c\u0435\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Ingress-nginx \u0438 \u0437\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b Kubernetes, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a Service \u0438 Deployment.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0441\u0432\u0435\u0436\u0438\u0442\u044c \u0437\u043d\u0430\u043d\u0438\u044f, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u044d\u0442\u0438\u043c\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/kubernetes.io\/docs\/tutorials\/kubernetes-basics\/\"><u>Kubernetes Basics<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/awkwardferny.medium.com\/getting-started-with-kubernetes-ingress-nginx-on-minikube-d75e58f52b6c\"><u>Ingress-Nginx Basics<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<h2>\u0417\u0430\u043f\u0443\u0441\u043a Kubernetes \u0432 Docker Desktop<\/h2>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 <a href=\"https:\/\/www.docker.com\/products\/docker-desktop\"><u>Docker Desktop<\/u><\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, \u043d\u043e \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Docker Desktop \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes:<\/p>\n<ol>\n<li>\n<p>\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443&nbsp;<strong><em>Preferences<\/em><\/strong><\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>2. \u0412\u044b\u0431\u0435\u0440\u0435\u0442\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0443&nbsp;<strong><em>Kubernetes<\/em><\/strong>, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0444\u043b\u0430\u0436\u043e\u043a&nbsp;<strong><em>Enable Kubernetes<\/em><\/strong> \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443&nbsp;<strong><em>Apply &amp; Restart<\/em><\/strong><\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>3. \u0412 \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0435\u043c\u0441\u044f \u043e\u043a\u043d\u0435 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443&nbsp;<strong><em>Install<\/em><\/strong> \u0438 \u0434\u043e\u0436\u0434\u0438\u0442\u0435\u0441\u044c \u043f\u043e\u043a\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>4. \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0443\u043d\u043a\u0442&nbsp;<strong><em>Kubernetes <\/em><\/strong>\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0437\u0430\u0434\u0430\u0447<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>5. \u0412 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u043c \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u0438\u0440\u0438\u0442\u0435&nbsp;<strong><em>docker-desktop<\/em><\/strong><\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>6. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043a \u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443<\/p>\n<pre><code>$ kubectl cluster-info  Kubernetes master is running at  https:\/\/kubernetes.docker.internal:6443 KubeDNS is running at https:\/\/kubernetes.docker.internal:6443\/api\/v1\/ namespaces\/kube-system\/services\/kube-dns:dns\/proxy<\/code><\/pre>\n<h2>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Ingress-NGINX Controller<\/h2>\n<p>1. \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0438\u0437 <a href=\"https:\/\/kubernetes.github.io\/ingress-nginx\/deploy\/#docker-for-mac\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430<\/u><\/a> \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 Ingress-NGINX Controller.<\/p>\n<pre><code class=\"diff\">$ kubectl apply -f https:\/\/raw.githubusercontent.com\/kubernetes\/ingress-nginx\/controller-v0.45.0\/deploy\/static\/provider\/cloud\/deploy.yaml  namespace\/ingress-nginx created serviceaccount\/ingress-nginx created configmap\/ingress-nginx-controller created clusterrole.rbac.authorization.k8s.io\/ingress-nginx created clusterrolebinding.rbac.authorization.k8s.io\/ingress-nginx created role.rbac.authorization.k8s.io\/ingress-nginx created rolebinding.rbac.authorization.k8s.io\/ingress-nginx created service\/ingress-nginx-controller-admission created service\/ingress-nginx-controller created\\ deployment.apps\/ingress-nginx-controller created validatingwebhookconfiguration.admissionregistration.k8s.io\/ingress-nginx-admission created serviceaccount\/ingress-nginx-admission created] clusterrole.rbac.authorization.k8s.io\/ingress-nginx-admission created clusterrolebinding.rbac.authorization.k8s.io\/ingress-nginx-admission created role.rbac.authorization.k8s.io\/ingress-nginx-admission created rolebinding.rbac.authorization.k8s.io\/ingress-nginx-admission created job.batch\/ingress-nginx-admission-create created\\ job.batch\/ingress-nginx-admission-patch created<\/code><\/pre>\n<p>2. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u0447\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Ingress \u0421ontroller \u043f\u0440\u043e\u0448\u043b\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e. Pods \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u044b \u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 Ready.<\/p>\n<pre><code>$ kubectl get pods -n ingress-nginx  NAME                                     READY   STATUS    RESTARTS  ingress-nginx-admission-create-52jsl        0\/1     Completed   0           ingress-nginx-admission-patch-78fkc         0\/1     Completed   0           ingress-nginx-controller-6f5454cbfb-qsfnn   1\/1     Running     0 <\/code><\/pre>\n<p><strong>\u0412\u0430\u0436\u043d\u043e:<\/strong>&nbsp;\u0415\u0441\u043b\u0438 Pod \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 Pending \u0438\u0437-\u0437\u0430 \u043d\u0435\u0445\u0432\u0430\u0442\u043a\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 CPU\/Memory, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u043e\u0431\u0432\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 Docker Desktop.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Jaeger \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Ingress Controller<\/h2>\n<p><a href=\"https:\/\/github.com\/jaegertracing\/jaeger\"><u>Jaeger<\/u><\/a><u> <\/u>&#8212; \u044d\u0442\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043d\u0430\u0448\u0438\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c Jaeger \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435  Ingress Controller.<\/p>\n<p>1. \u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0439\u0442\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439&nbsp;<a href=\"https:\/\/github.com\/diazjf\/meow-micro\"><u>meow-micro<\/u><\/a>, \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e \u0432\u0441\u0435\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445.<\/p>\n<pre><code>$ git clone https:\/\/github.com\/diazjf\/meow-micro.git  Cloning into 'meow-micro'... remote: Enumerating objects: 105, done. ... $ cd meow-micro<\/code><\/pre>\n<p>2. \u0412 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0432\u044b \u043d\u0430\u0439\u0434\u0451\u0442\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0434\u043b\u044f <a href=\"https:\/\/hub.docker.com\/r\/jaegertracing\/all-in-one\"><u>jaeger-all-in-one<\/u><\/a>. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c Jaeger \u0438\u0437 \u044d\u0442\u0438\u0445 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432.<\/p>\n<pre><code>$ kubectl apply -f jaeger\/jaeger-all-in-one.yaml  deployment.apps\/jaeger created service\/jaeger-query created service\/jaeger-collector created service\/jaeger-agent created service\/zipkin created<\/code><\/pre>\n<p>3. \u0423\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e Jaeger \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0438 \u0433\u043e\u0442\u043e\u0432 \u043a \u0440\u0430\u0431\u043e\u0442\u0435.<\/p>\n<pre><code>$ kubectl get pods  NAME                      READY   STATUS    RESTARTS   AGE jaeger-6f6b5d8689-8gccp   1\/1     Running   0          17s<\/code><\/pre>\n<p>4. \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 Ingress-NGINX and Jaeger, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&nbsp;<strong><em>enable-opentracing&nbsp;<\/em><\/strong>\u0438&nbsp;<strong><em>jaeger-collector-host<\/em><\/strong>&nbsp;\u0432&nbsp;<strong><em>ingress-nginx-controller&nbsp;<\/em><\/strong>ConfigMap. \u0412 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 <strong><em>jaeger-collector-host <\/em><\/strong>\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u043c\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 Jaeger.<\/p>\n<pre><code>$ echo '   apiVersion: v1   kind: ConfigMap   data:     enable-opentracing: \"true\"     jaeger-collector-host: jaeger-agent.default.svc.cluster.local                 metadata:     name: ingress-nginx-controller     namespace: ingress-nginx   ' | kubectl replace -f - configmap\/ingress-nginx-controller replaced<\/code><\/pre>\n<p>5. \u0423\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 Ingress Controller \u0432\u043a\u043b\u044e\u0447\u0435\u043d&nbsp;\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d <strong><em>opentracing<\/em><\/strong><em>.<\/em><\/p>\n<pre><code>$ kubectl get pods -n ingress-nginx | grep controller  ingress-nginx-controller-6f5454cbfb-qptxt   1\/1     Running     0          8m56s  $ kubectl exec -it ingress-nginx-controller-6f5454cbfb-qptxt -n ingress-nginx -- bash -c \"cat nginx.conf | grep ngx_http_opentracing_module.so\"  load_module \/etc\/nginx\/modules\/ngx_http_opentracing_module.so;  $ kubectl exec -it ingress-nginx-controller-6f5454cbfb-qptxt -n ingress-nginx -- bash -c \"cat nginx.conf | grep jaeger\"  opentracing_load_tracer \/usr\/local\/lib\/libjaegertracing_plugin.so \/etc\/nginx\/opentracing.json;  $ kubectl exec -it ingress-nginx-controller-6f5454cbfb-qptxt -n ingress-nginx -- bash -c \"cat \/etc\/nginx\/opentracing.json\"  {   \"service_name\": \"nginx\",   \"propagation_format\": \"jaeger\",   \"sampler\": {     \"type\": \"const\",     \"param\": 1,     \"samplingServerURL\": \"http:\/\/127.0.0.1:5778\/sampling\"   },   \"reporter\": {     \"endpoint\": \"\",     \"localAgentHostPort\": \"jaeger-agent.default.svc.cluster.local:6831\"   },   \"headers\": {     \"TraceContextHeaderName\": \"\",     \"jaegerDebugHeader\": \"\",     \"jaegerBaggageHeader\": \"\",     \"traceBaggageHeaderPrefix\": \"\"   } }<\/code><\/pre>\n<p>Jaeger \u0438 Ingress Controller \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u044b. \u0421\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430\u0448\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b!<\/p>\n<h2>\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0422\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 <a href=\"https:\/\/github.com\/diazjf\/meow-micro\"><strong><u>meow-micro<\/u><\/strong><\/a><strong><u> <\/u><\/strong>\u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041a\u043b\u0438\u0435\u043d\u0442 <strong><em>meow-client<\/em><\/strong> &#8212; \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 REST \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441\u0435\u0440\u0432\u0438\u0441\u0443 <strong><em>meow-server <\/em><\/strong>\u0447\u0435\u0440\u0435\u0437 GRPC.<\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 REST \u0438 GRPC \u0441 GoLang:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/tutorialedge.net\/golang\/creating-restful-api-with-golang\/\"><u>GoLang HTTP Server<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/tutorialedge.net\/golang\/go-grpc-beginners-tutorial\/\"><u>GoLang GRPC Communication<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<h3>tracing.go<\/h3>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Jaeger \u0438\u0437 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f Helm \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438&nbsp;<a href=\"https:\/\/github.com\/diazjf\/meow-micro\/blob\/main\/helm\/templates\/meow-client.yaml\"><u>meow-client<\/u><\/a>&nbsp;and&nbsp;<a href=\"https:\/\/github.com\/diazjf\/meow-micro\/blob\/main\/helm\/templates\/meow-server.yaml\"><u>meow-server.<\/u><\/a><\/p>\n<pre><code>cfg, err := config.FromEnv() if err != nil { panic(fmt.Sprintf(\"Could not parse Jaeger env vars: %s\", err.Error()))  }   tracer, closer, err := cfg.NewTracer() if err != nil {    panic(fmt.Sprintf(\"Could not initialize jaeger tracer: %s\", err.Error()))  }<\/code><\/pre>\n<h3>client.go<\/h3>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 &#8212; \u0437\u0430\u0434\u0430\u0435\u0442 service name&nbsp;\u0434\u043b\u044f trace \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 span.<\/p>\n<ul>\n<li>\n<p><strong>Span<\/strong>&nbsp;\u2014 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0435\u043a\u043e\u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445). Span&#8217;\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 span&#8217;\u044b, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e span&#8217;\u043e\u0432 \u0432&nbsp;Trace.<\/p>\n<\/li>\n<li>\n<p><strong>Trace<\/strong>&nbsp;\u2014 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0436\u0438\u0437\u043d\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043e\u043d\u044f\u0442\u0438\u044f\u0445 <a href=\"https:\/\/www.jaegertracing.io\/docs\/1.22\/architecture\/#trace\"><u>trace<\/u><\/a> \u0438 <a href=\"https:\/\/www.jaegertracing.io\/docs\/1.22\/architecture\/#span\"><u>span<\/u><\/a> \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.<\/p>\n<pre><code>\/\/ main function span os.Setenv(\"JAEGER_SERVICE_NAME\", \"meow-client\") tracer, closer := tracing.Init() defer closer.Close() http.HandleFunc(\"\/\", func(w http.ResponseWriter, r *http.Request) { spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header)) span := tracer.StartSpan(\"send-meow-communication\", ext.RPCServerOption(spanCtx)) defer span.Finish() ... \/\/ sleep function span os.Setenv(\"JAEGER_SERVICE_NAME\", \"meow-client\") tracer, closer := tracing.Init() defer closer.Close() span := tracer.StartSpan(\"sleep\") defer span.Finish()<\/code><\/pre>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c <a href=\"https:\/\/helm.sh\/docs\/intro\/install\/\"><u>Helm v3<\/u><\/a> \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u043b\u044e\u0431\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 macOS \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e brew. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435. <\/p>\n<pre><code>$ brew install helm ... ==&gt; Downloading https:\/\/ghcr.io\/v2\/homebrew\/core\/helm\/manifests\/3.5.4 ######################################################################## 100.0% ==&gt; Downloading https:\/\/ghcr.io\/v2\/homebrew\/core\/helm\/blobs\/sha256:5dac5803c1ad2db3a91b0928fc472aaf80a4 ==&gt; Downloading from https:\/\/pkg-containers-az.githubusercontent.com\/ghcr1\/blobs\/sha256:5dac5803c1ad2db ######################################################################## 100.0% ==&gt; Pouring helm--3.5.4.big_sur.bottle.tar.gz ... $ helm version version.BuildInfo{Version:\"v3.3.4\", GitCommit:\"a61ce5633af99708171414353ed49547cf05013d\", GitTreeState:\"clean\", GoVersion:\"go1.14.9\"}<\/code><\/pre>\n<p>\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f Makefile \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes.<\/p>\n<pre><code># Build client and server from Dockerfile $ make build docker build -t meow-client:1.0 -f client\/Dockerfile . [+] Building 17.1s (10\/10) FINISHED ... docker build -t meow-server:1.0 -f server\/Dockerfile . [+] Building 0.5s (10\/10) FINISHED ... # Install Microservices into Kubernetes via Helm  $ make install helm install -f helm\/Values.yaml meow-micro .\/helm NAME: meow-micro LAST DEPLOYED: Mon Apr 26 13:42:38 2021 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e Pods \u043e\u0431\u043e\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438\u0441\u044c \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442.<\/p>\n<pre><code>$ kubectl get pods  NAME                           READY   STATUS    RESTARTS   AGE jaeger-6f6b5d8689-s7cln        1\/1     Running   0<\/code><\/pre>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-323462","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/323462","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=323462"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/323462\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=323462"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=323462"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=323462"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}