{"id":331314,"date":"2022-03-31T15:00:14","date_gmt":"2022-03-31T15:00:14","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=331314"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=331314","title":{"rendered":"<span>\u041f\u043e\u0448\u0430\u0433\u043e\u0432\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 Kubernetes \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043a \u0432\u0435\u0431\u0438\u043d\u0430\u0440\u0443 <a href=\"https:\/\/www.youtube.com\/watch?v=tFzM-2pwL8A\">\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 Kubernetes \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0437\u0430 \u0447\u0430\u0441<\/a>.<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6245ab807637ad1287cbf6ca\" data-style=\"\" id=\"6245ab807637ad1287cbf6ca\" width=\"\"><\/div>\n<h2>\u041f\u0440\u0435\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u044b<\/h2>\n<ul>\n<li>\n<p>\u041a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes (\u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f\u00a0<a href=\"https:\/\/minikube.sigs.k8s.io\/docs\/start\/\">minikube<\/a>)<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/kubernetes.io\/docs\/reference\/kubectl\/\">kubectl<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/sdk.operatorframework.io\/docs\/installation\/\">Operator SDK<\/a><\/p>\n<\/li>\n<\/ul>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <\/h2>\n<ul>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">mkdir k8s-operator-in-an-hour<\/code><\/pre>\n<ul>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">cd k8s-operator-in-an-hour<\/code><\/pre>\n<ul>\n<li>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">operator-sdk init --domain mcs.mail.ru --plugins ansible<\/code><\/pre>\n<ul>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0430\u043f\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">opetator-sdk create api \\     --groups ops \\     --version v1alpha1 \\     --kind Project \\     --generate-role<\/code><\/pre>\n<ul>\n<li>\n<p>\u0412\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0444\u0430\u0439\u043b\u00a0<code>config\/samples\/ops_v1alpha1_project.yaml<\/code>\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0442\u0438\u043f\u0430 Project<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">apiVersion: ops.mcs.mail.ru\/v1alpha1 kind: Project metadata:   name: test spec:   members:     - p.petrov     - i.ivanov   environments:     - name: prod       resources:         requests:           cpu: 4           memory: 4Gi         limits:           cpu: 4           memory: 4Gi<\/code><\/pre>\n<ul>\n<li>\n<p>\u0412 \u0444\u0430\u0439\u043b\u0435\u00a0<code>config\/crd\/bases\/ops.mcs.mail.ru_projects.yaml<\/code>\u00a0\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">plural: projects      singular: project -  scope: Namespaced +  scope: Cluster    versions:    - name: v1alpha1<\/code><\/pre>\n<ul>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u044f\u043c \u0442\u0430\u0441\u043a\u0438 \u0432 Ansible \u0440\u043e\u043b\u044c. \u0412 \u0444\u0430\u0439\u043b\u00a0<code>roles\/project\/tasks\/main.yml<\/code>\u00a0\u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">--- - name: Create a namespace   kubernetes.core.k8s:     state: present     definition:       apiVersion: v1       kind: Namespace       metadata:         name: \"{{ ansible_operator_meta.name }}-{{ item.name }}\"         labels:           app.kubernetes.io\/managed-by: \"projects-operator\"   loop: \"{{ environments }}\"  - name: Create a resource quota   kubernetes.core.k8s:     state: present     definition:       apiVersion: v1       kind: ResourceQuota       metadata:         namespace: \"{{ ansible_operator_meta.name }}-{{ item.name }}\"         name: resource-quota         labels:           app.kubernetes.io\/managed-by: \"projects-operator\"       spec:         hard:           limits.cpu: \"{{item.resources.limits.cpu}}\"           limits.memory: \"{{item.resources.limits.memory}}\"           requests.cpu: \"{{item.resources.requests.cpu}}\"           requests.memory: \"{{item.resources.requests.memory}}\"   loop: \"{{ environments }}\"  - name: Create a member role building   kubernetes.core.k8s:     state: present     definition:       apiVersion: rbac.authorization.k8s.io\/v1       kind: RoleBinding       metadata:         name: \"{{ item[1] }}\"         namespace: \"{{ ansible_operator_meta.name }}-{{ item[0].name }}\"         labels:           app.kubernetes.io\/managed-by: \"projects-operator\"       roleRef:         apiGroup: rbac.authorization.k8s.io         kind: ClusterRole         name: edit       subjects:         - kind: ServiceAccount           name: \"{{ item[1] }}\"           namespace: users   with_nested:     - \"{{ environments }}\"     - \"{{ members }}\"<\/code><\/pre>\n<ul>\n<li>\n<p>\u041a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c RBAC \u043f\u0440\u0430\u0432\u0430 \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430. \u0424\u0430\u0439\u043b\u00a0<code>config\/rbac\/role.yaml<\/code>\u00a0\u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043c \u043a \u0442\u0430\u043a\u043e\u043c\u0443 \u0432\u0438\u0434\u0443<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">--- apiVersion: rbac.authorization.k8s.io\/v1 kind: ClusterRole metadata:   name: manager-role rules:   ##   ## Base operator rules   ##   ##   - apiGroups:       - \"\"     resources:       - namespaces       - resourcequotas     verbs:       - create       - delete       - get       - list       - patch       - update       - watch   - apiGroups:       - rbac.authorization.k8s.io     resources:       - rolebindings     verbs:       - create       - delete       - get       - list       - patch       - update       - watch   - apiGroups:        - rbac.authorization.k8s.io     resources:       - clusterroles     verbs:       - bind     resourceNames:       - edit   ## Rules for ops.mcs.mail.ru\/v1alpha1, Kind: Project   ##   - apiGroups:       - ops.mcs.mail.ru     resources:       - projects       - projects\/status       - projects\/finalizers     verbs:       - create       - delete       - get       - list       - patch       - update       - watch #+kubebuilder:scaffold:rules<\/code><\/pre>\n<ul>\n<li>\n<p>\u0412 \u0444\u0430\u0439\u043b\u00a0<code>watches.yaml<\/code>\u00a0\u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u043b\u044e\u0447 \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0436\u0435\u043d\u0438\u044f \u0437\u0430 cluster wide \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">  watchClusterScopedResources: true<\/code><\/pre>\n<h2>\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0434\u0435\u043f\u043b\u043e\u0439 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440<\/h2>\n<ul>\n<li>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0437 \u0441 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">make docker-build IMG=&lt;your dockerhub username>\/k8s-operator-in-an-hour:v0.0.1<\/code><\/pre>\n<ul>\n<li>\n<p>\u041f\u0443\u0448\u0438\u043c \u043e\u0431\u0440\u0430\u0437 \u0432 \u0440\u0435\u0434\u0436\u0438\u0441\u0442\u0440\u0438<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">make docker-push IMG=&lt;your dockerhub username>\/k8s-operator-in-an-hour:v0.0.1<\/code><\/pre>\n<ul>\n<li>\n<p>\u0414\u0435\u043f\u043b\u043e\u0438\u043c \u0432\u0441\u0435 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">make deploy IMG=&lt;your dockerhub username>\/k8s-operator-in-an-hour:v0.0.1<\/code><\/pre>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e Project \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430<\/h2>\n<ul>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0438\u043f\u0430 Project \u0438\u0437 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u043d\u0435\u0435 \u0444\u0430\u0439\u043b\u0430\u00a0<code>config\/samples\/ops_v1alpha1_project.yaml<\/code><\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">kubectl apply -f config\/samples\/ops_v1alpha1_project.yaml<\/code><\/pre>\n<ul>\n<li>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0442\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043d\u044d\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u00a0<code>test-prod<\/code>, \u0440\u0435\u0441\u0443\u0440\u0441 \u043a\u0432\u043e\u0442\u044b \u0432 \u043d\u0435\u043c \u043e\u043e\u0441\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u0434\u0430\u0432\u0430\u043b\u0438 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438\u0435 Project \u0438 \u0438\u043c\u0435\u044e\u0442\u0441\u044f \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0440\u043e\u043b\u044c\u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">$ kubectl get ns  NAME                 STATUS   AGE default              Active   12d kube-node-lease      Active   12d kube-public          Active   12d kube-system          Active   12d test-prod            Active   10m<\/code><\/pre>\n<pre><code class=\"go\">kubectl get rolebinding -n test-prod kubectl get resourcequota -n test-prod<\/code><\/pre>\n<h2>\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/h2>\n<ul>\n<li>\n<p>\u0414\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0432\u0441\u0435\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 crd \u0438\u0437 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">make undeploy IMG=&lt;your dockerhub username>\/k8s-operator-in-an-hour:v0.0.1<\/code><\/pre>\n<p><strong>\u0413\u043e\u0442\u043e\u0432\u043e, \u0432\u044b \u0432\u0435\u043b\u0438\u043a\u043e\u043b\u0435\u043f\u043d\u044b!<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>\u0415\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0435\u043e\u0440\u0438\u0438 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u043f\u043e Kubernetes <\/summary>\n<div class=\"spoiler__content\">\n<p>\u0417\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442 Kubernetes \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u043a\u0443\u0440\u0441\u0435 <a href=\"https:\/\/slurm.club\/3iXUi0l\">Kubernetes: \u041c\u0435\u0433\u0430-\u043f\u043e\u0442\u043e\u043a<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0443\u0436\u0435 12 \u0430\u043f\u0440\u0435\u043b\u044f. <\/p>\n<p>\u041d\u0430 \u043a\u0443\u0440\u0441\u0435 \u0432\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 Kubernetes \u0432\u043d\u0443\u0442\u0440\u0438: \u0438\u0437\u0443\u0447\u0438\u0442\u0435 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 production-ready \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 (\u00abthe-not-so-easy-way\u00bb), \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u043a\u0430\u0441\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043a\u0443\u0440\u0441\u0430<\/summary>\n<div class=\"spoiler__content\">\n<p><strong>\u0422\u0435\u043c\u0430 \u21161. \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<br \/>\u0422\u0435\u043c\u0430 \u21162. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438\u0437\u043d\u0443\u0442\u0440\u0438<\/strong><\/p>\n<p><em>\u0420\u0430\u0437\u0431\u043e\u0440 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b Kubernetes, \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438.\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u044b kubeadm.<\/em><\/p>\n<p><strong>\u0422\u0435\u043c\u0430 \u21163. \u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435<\/strong><\/p>\n<p><em>\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 k8s, \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 Active Directory \u0438 Kubernetes.<\/em><\/p>\n<p><strong>\u0422\u0435\u043c\u0430 \u21164. Network Policy<\/strong><\/p>\n<p><em>\u041e\u0431\u0437\u043e\u0440 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0434\u043b\u044f Kubernetes. \u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u043e\u0433\u043e \u0444\u0430\u0435\u0440\u0432\u043e\u043b\u0430 \u0432 Kubernetes.<\/em><\/p>\n<p><strong>\u0422\u0435\u043c\u0430 \u21165. \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435<\/strong><\/p>\n<p><em>\u041f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 Kubernetes, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0432 Kubernetes \u0431\u043e\u043b\u0435\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439, \u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u043c. \u0423\u0437\u043d\u0430\u0435\u043c, \u043a\u0430\u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 Limits\/Requests \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438, \u043a\u0430\u043a \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 root-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0432 Namespace.<\/em><\/p>\n<p><strong>\u0422\u0435\u043c\u0430 \u21166. Kubernetes \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c<\/strong><\/p>\n<p><em>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 scheduler, API Server, Controller manager, \u0443\u0447\u0438\u043c\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f Kubernetes.<\/em><\/p>\n<p><strong>\u0422\u0435\u043c\u0430 \u21167. Stateful \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435<\/strong><\/p>\n<p><em>\u041f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Kubernetes \u0438 \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c. \u041e\u0431\u0441\u0443\u0434\u0438\u043c, \u043a\u0430\u043a\u0438\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0443\u0442 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u0430 \u043a\u0430\u043a\u0438\u0435 \u043c\u0435\u043d\u0435\u0435. \u041e\u0431\u0441\u0443\u0434\u0438\u043c \u043a\u0430\u043a\u0438\u0435 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043c\u043d\u0438 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Kubernetes.<\/em><\/p>\n<p><strong>\u0422\u0435\u043c\u0430 \u21168. \u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432<\/strong><\/p>\n<p><em>\u041f\u0440\u0438\u0435\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438 \u0432 \u043a\u0443\u0431\u0435\u0440\u043d\u0435\u0442\u0435\u0441. \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f Hashicorp Vault, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0438\u0437 Vault \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0435\u0431-\u0445\u0443\u043a\u0430 \u043e\u0442 Banzai Clod.<\/em><\/p>\n<p><strong>\u0422\u0435\u043c\u0430 \u21169. Horisontal Pod Autoscaler<\/strong><\/p>\n<p><em>\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0441 \u0430\u0432\u0442\u043e\u0441\u043a\u0435\u0439\u043b\u0438\u043d\u0433\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043a \u0430\u0432\u0442\u043e\u0441\u043a\u0435\u0439\u043b\u0435\u0440\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/em><\/p>\n<p><strong>\u0422\u0435\u043c\u0430 \u2116 10. \u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/strong><\/p>\n<p><em>\u041c\u0435\u0442\u043e\u0434\u044b \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u0432 \u043d\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0431\u0435\u043a\u0430\u043f\u0430 \u043d\u0430 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 Velero.<\/em><\/p>\n<p><strong>\u0422\u0435\u043c\u0430 \u211611. \u0420\u043e\u0442\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435<\/strong><\/p>\n<p><em>\u0421\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0434\u043b\u044f Control Plane \u0443\u0442\u0438\u043b\u0438\u0442\u0430 kubeadm \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u043e \u0441\u0440\u043e\u043a\u043e\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f 1 \u0433\u043e\u0434: \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0434\u043b\u0438\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438 \u0432\u0430\u0448 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441\u043c\u043e\u0433 \u043f\u0440\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u043e\u043b\u044c\u0448\u0435 \u0433\u043e\u0434\u0430.<\/em><\/p>\n<p><strong>\u0422\u0435\u043c\u0430 \u211612. Deploy<br \/>\u0422\u0435\u043c\u0430 \u211613. Service Mesh<\/strong><\/p>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0434\u0435\u043f\u043b\u043e\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0441 \u0442\u0435\u043c \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Service mesh \u0438 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d, \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 Istio.<\/p>\n<\/div>\n<\/details>\n<p>\u0423\u0437\u043d\u0430\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435: <a href=\"https:\/\/slurm.club\/3iXUi0l\">https:\/\/slurm.club\/3iXUi0l<\/a><\/p>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \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\/southbridge\/blog\/658451\/\"> https:\/\/habr.com\/ru\/company\/southbridge\/blog\/658451\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043a \u0432\u0435\u0431\u0438\u043d\u0430\u0440\u0443 <a href=\"https:\/\/www.youtube.com\/watch?v=tFzM-2pwL8A\">\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 Kubernetes \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0437\u0430 \u0447\u0430\u0441<\/a>.<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6245ab807637ad1287cbf6ca\" data-style=\"\" id=\"6245ab807637ad1287cbf6ca\" width=\"\"><\/div>\n<h2>\u041f\u0440\u0435\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u044b<\/h2>\n<ul>\n<li>\n<p>\u041a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes (\u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f\u00a0<a href=\"https:\/\/minikube.sigs.k8s.io\/docs\/start\/\">minikube<\/a>)<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/kubernetes.io\/docs\/reference\/kubectl\/\">kubectl<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/sdk.operatorframework.io\/docs\/installation\/\">Operator SDK<\/a><\/p>\n<\/li>\n<\/ul>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <\/h2>\n<ul>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">mkdir k8s-operator-in-an-hour<\/code><\/pre>\n<ul>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">cd k8s-operator-in-an-hour<\/code><\/pre>\n<ul>\n<li>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">operator-sdk init --domain mcs.mail.ru --plugins ansible<\/code><\/pre>\n<ul>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0430\u043f\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">opetator-sdk create api \\     --groups ops \\     --version v1alpha1 \\     --kind Project \\     --generate-role<\/code><\/pre>\n<ul>\n<li>\n<p>\u0412\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0444\u0430\u0439\u043b\u00a0<code>config\/samples\/ops_v1alpha1_project.yaml<\/code>\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0442\u0438\u043f\u0430 Project<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">apiVersion: ops.mcs.mail.ru\/v1alpha1 kind: Project metadata:   name: test spec:   members:     - p.petrov     - i.ivanov   environments:     - name: prod       resources:         requests:           cpu: 4           memory: 4Gi         limits:           cpu: 4           memory: 4Gi<\/code><\/pre>\n<ul>\n<li>\n<p>\u0412 \u0444\u0430\u0439\u043b\u0435\u00a0<code>config\/crd\/bases\/ops.mcs.mail.ru_projects.yaml<\/code>\u00a0\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">plural: projects      singular: project -  scope: Namespaced +  scope: Cluster    versions:    - name: v1alpha1<\/code><\/pre>\n<ul>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u044f\u043c \u0442\u0430\u0441\u043a\u0438 \u0432 Ansible \u0440\u043e\u043b\u044c. \u0412 \u0444\u0430\u0439\u043b\u00a0<code>roles\/project\/tasks\/main.yml<\/code>\u00a0\u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">--- - name: Create a namespace   kubernetes.core.k8s:     state: present     definition:       apiVersion: v1       kind: Namespace       metadata:         name: \"{{ ansible_operator_meta.name }}-{{ item.name }}\"         labels:           app.kubernetes.io\/managed-by: \"projects-operator\"   loop: \"{{ environments }}\"  - name: Create a resource quota   kubernetes.core.k8s:     state: present     definition:       apiVersion: v1       kind: ResourceQuota       metadata:         namespace: \"{{ ansible_operator_meta.name }}-{{ item.name }}\"         name: resource-quota         labels:           app.kubernetes.io\/managed-by: \"projects-operator\"       spec:         hard:           limits.cpu: \"{{item.resources.limits.cpu}}\"           limits.memory: \"{{item.resources.limits.memory}}\"           requests.cpu: \"{{item.resources.requests.cpu}}\"           requests.memory: \"{{item.resources.requests.memory}}\"   loop: \"{{ environments }}\"  - name: Create a member role building   kubernetes.core.k8s:     state: present     definition:       apiVersion: rbac.authorization.k8s.io\/v1       kind: RoleBinding       metadata:         name: \"{{ item[1] }}\"         namespace: \"{{ ansible_operator_meta.name }}-{{ item[0].name }}\"         labels:           app.kubernetes.io\/managed-by: \"projects-operator\"       roleRef:         apiGroup: rbac.authorization.k8s.io         kind: ClusterRole         name: edit       subjects:         - kind: ServiceAccount           name: \"{{ item[1] }}\"           namespace: users   with_nested:     - \"{{ environments }}\"     - \"{{ members }}\"<\/code><\/pre>\n<ul>\n<li>\n<p>\u041a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c RBAC \u043f\u0440\u0430\u0432\u0430 \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430. \u0424\u0430\u0439\u043b\u00a0<code>config\/rbac\/role.yaml<\/code>\u00a0\u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043c \u043a \u0442\u0430\u043a\u043e\u043c\u0443 \u0432\u0438\u0434\u0443<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">--- apiVersion: rbac.authorization.k8s.io\/v1 kind: ClusterRole metadata:   name: manager-role rules:   ##   ## Base operator rules   ##   ##   - apiGroups:       - \"\"     resources:       - namespaces       - resourcequotas     verbs:       - create       - delete       - get       - list       - patch       - update       - watch   - apiGroups:       - rbac.authorization.k8s.io     resources:       - rolebindings     verbs:       - create       - delete       - get       - list       - patch       - update       - watch   - apiGroups:        - rbac.authorization.k8s.io     resources:       - clusterroles     verbs:       - bind     resourceNames:       - edit   ## Rules for ops.mcs.mail.ru\/v1alpha1, Kind: Project   ##   - apiGroups:       - ops.mcs.mail.ru     resources:       - projects       - projects\/status       - projects\/finalizers     verbs:       - create       - delete       - get       - list       - patch       - update       - watch #+kubebuilder:scaffold:rules<\/code><\/pre>\n<ul>\n<li>\n<p>\u0412 \u0444\u0430\u0439\u043b\u00a0<code>watches.yaml<\/code>\u00a0\u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u043b\u044e\u0447 \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0436\u0435\u043d\u0438\u044f \u0437\u0430 cluster wide \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">  watchClusterScopedResources: true<\/code><\/pre>\n<h2>\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0434\u0435\u043f\u043b\u043e\u0439 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440<\/h2>\n<ul>\n<li>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0437 \u0441 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">make docker-build IMG=&lt;your dockerhub username>\/k8s-operator-in-an-hour:v0.0.1<\/code><\/pre>\n<ul>\n<li>\n<p>\u041f\u0443\u0448\u0438\u043c \u043e\u0431\u0440\u0430\u0437 \u0432 \u0440\u0435\u0434\u0436\u0438\u0441\u0442\u0440\u0438<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">make docker-push IMG=&lt;your dockerhub username>\/k8s-operator-in-an-hour:v0.0.1<\/code><\/pre>\n<ul>\n<li>\n<p>\u0414\u0435\u043f\u043b\u043e\u0438\u043c \u0432\u0441\u0435 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">make deploy IMG=&lt;your dockerhub username>\/k8s-operator-in-an-hour:v0.0.1<\/code><\/pre>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e Project \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430<\/h2>\n<ul>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0438\u043f\u0430 Project \u0438\u0437 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u043d\u0435\u0435 \u0444\u0430\u0439\u043b\u0430\u00a0<code>config\/samples\/ops_v1alpha1_project.yaml<\/code><\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">kubectl apply -f config\/samples\/ops_v1alpha1_project.yaml<\/code><\/pre>\n<ul>\n<li>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0442\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043d\u044d\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u00a0<code>test-prod<\/code>, \u0440\u0435\u0441\u0443\u0440\u0441 \u043a\u0432\u043e\u0442\u044b \u0432 \u043d\u0435\u043c \u043e\u043e\u0441\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u0434\u0430\u0432\u0430\u043b\u0438 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438\u0435 Project \u0438 \u0438\u043c\u0435\u044e\u0442\u0441\u044f \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0440\u043e\u043b\u044c\u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">$ kubectl get ns  NAME                 STATUS   AGE default              Active   12d kube-node-lease      Active   12d kube-public          Active   12d kube-system          Active   12d test-prod            Active   10m<\/code><\/pre>\n<pre><code class=\"go\">kubectl get rolebinding -n test-prod kubectl get resourcequota -n test-prod<\/code><\/pre>\n<h2>\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/h2>\n<ul>\n<li>\n<p>\u0414\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0432\u0441\u0435\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 crd \u0438\u0437 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"go\">make undeploy IMG=&lt;your dockerhub username>\/k8s-operator-in-an-hour:v0.0.1<\/code><\/pre>\n<p><strong>\u0413\u043e\u0442\u043e\u0432\u043e, \u0432\u044b \u0432\u0435\u043b\u0438\u043a\u043e\u043b\u0435\u043f\u043d\u044b!<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>\u0415\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0435\u043e\u0440\u0438\u0438 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u043f\u043e Kubernetes <\/summary>\n<div class=\"spoiler__content\">\n<p>\u0417\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442 Kubernetes \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u043a\u0443\u0440\u0441\u0435 <a href=\"https:\/\/slurm.club\/3iXUi0l\">Kubernetes: \u041c\u0435\u0433\u0430-\u043f\u043e\u0442\u043e\u043a<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0443\u0436\u0435 12 \u0430\u043f\u0440\u0435\u043b\u044f. <\/p>\n<p>\u041d\u0430 \u043a\u0443\u0440\u0441\u0435 \u0432\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 Kubernetes \u0432\u043d\u0443\u0442\u0440\u0438: \u0438\u0437\u0443\u0447\u0438\u0442\u0435 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 production-ready \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 (\u00abthe-not-so-easy-way\u00bb), \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u043a\u0430\u0441\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043a\u0443\u0440\u0441\u0430<\/summary>\n<div class=\"spoiler__content\">\n<p><strong>\u0422\u0435\u043c\u0430 \u21161. \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<br \/>\u0422\u0435\u043c\u0430 \u21162. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438\u0437\u043d\u0443\u0442\u0440\u0438<\/strong><\/p>\n<p><em>\u0420\u0430\u0437\u0431\u043e\u0440 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b Kubernetes, \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438.\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u044b kubeadm.<\/em><\/p>\n<p><strong>\u0422\u0435\u043c\u0430 \u21163. \u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435<\/strong><\/p>\n<p><em>\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 k8s, \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 Active Directory \u0438 Kubernetes.<\/em><\/p>\n<p><strong>\u0422\u0435\u043c\u0430 \u21164. Network Policy<\/strong><\/p>\n<p><em>\u041e\u0431\u0437\u043e\u0440 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0434\u043b\u044f Kubernetes. \u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u043e\u0433\u043e \u0444\u0430\u0435\u0440\u0432\u043e\u043b\u0430 \u0432 Kubernetes.<\/em><\/p>\n<p><strong>\u0422\u0435\u043c\u0430 \u21165. \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435<\/strong><\/p>\n<p><em>\u041f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 Kubernetes, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0432 Kubernetes \u0431\u043e\u043b\u0435\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439, \u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u043c. \u0423\u0437\u043d\u0430\u0435\u043c, \u043a\u0430\u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 Limits\/Requests \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438, \u043a\u0430\u043a \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 root-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0432 Namespace.<\/em><\/p>\n<p><strong>\u0422\u0435\u043c\u0430 \u21166. Kubernetes \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c<\/strong><\/p>\n<p><em>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 scheduler, API Server, Controller manager, \u0443\u0447\u0438\u043c\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f Kubernetes.<\/em><\/p>\n<p><strong>\u0422\u0435\u043c\u0430 \u21167. Stateful \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435<\/strong><\/p>\n<p><em>\u041f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Kubernetes \u0438 \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c. \u041e\u0431\u0441\u0443\u0434\u0438\u043c, \u043a\u0430\u043a\u0438\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0443\u0442 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u0430 \u043a\u0430\u043a\u0438\u0435 \u043c\u0435\u043d\u0435\u0435. \u041e\u0431\u0441\u0443\u0434\u0438\u043c \u043a\u0430\u043a\u0438\u0435 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043c\u043d\u0438 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Kubernetes.<\/em><\/p>\n<p><strong>\u0422\u0435\u043c\u0430 \u21168. \u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432<\/strong><\/p>\n<p><em>\u041f\u0440\u0438\u0435\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438 \u0432 \u043a\u0443\u0431\u0435\u0440\u043d\u0435\u0442\u0435\u0441. \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f Hashicorp Vault, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0438\u0437 Vault \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0435\u0431-\u0445\u0443\u043a\u0430 \u043e\u0442 Banzai Clod.<\/em><\/p>\n<p><strong>\u0422\u0435\u043c\u0430 \u21169. Horisontal Pod Autoscaler<\/strong><\/p>\n<p><em>\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0441 \u0430\u0432\u0442\u043e\u0441\u043a\u0435\u0439\u043b\u0438\u043d\u0433\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043a \u0430\u0432\u0442\u043e\u0441\u043a\u0435\u0439\u043b\u0435\u0440\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.<\/em><\/p>\n<p><strong>\u0422\u0435\u043c\u0430 \u2116 10. \u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/strong><\/p>\n<p><em>\u041c\u0435\u0442\u043e\u0434\u044b \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u0432 \u043d\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0431\u0435\u043a\u0430\u043f\u0430 \u043d\u0430 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 Velero.<\/em><\/p>\n<p><strong>\u0422\u0435\u043c\u0430 \u211611. \u0420\u043e\u0442\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435<\/strong><\/p>\n<p><em>\u0421\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0434\u043b\u044f Control Plane \u0443\u0442\u0438\u043b\u0438\u0442\u0430 kubeadm \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u043e \u0441\u0440\u043e\u043a\u043e\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f 1 \u0433\u043e\u0434: \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0434\u043b\u0438\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0438 \u0432\u0430\u0448 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441\u043c\u043e\u0433 \u043f\u0440\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u043e\u043b\u044c\u0448\u0435 \u0433\u043e\u0434\u0430.<\/em><\/p>\n<p><strong>\u0422\u0435\u043c\u0430 \u211612. Deploy<br \/>\u0422\u0435\u043c\u0430 \u211613. Service Mesh<\/strong><\/p>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0434\u0435\u043f\u043b\u043e\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0441 \u0442\u0435\u043c \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Service mesh \u0438 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d, \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 Istio.<\/p>\n<\/div>\n<\/details>\n<p>\u0423\u0437\u043d\u0430\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435: <a href=\"https:\/\/slurm.club\/3iXUi0l\">https:\/\/slurm.club\/3iXUi0l<\/a><\/p>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \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\/southbridge\/blog\/658451\/\"> https:\/\/habr.com\/ru\/company\/southbridge\/blog\/658451\/<\/a><br \/><\/br><\/br><\/p>\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-331314","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/331314","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=331314"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/331314\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=331314"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=331314"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=331314"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}