{"id":527,"date":"2022-08-22T16:13:08","date_gmt":"2022-08-22T16:13:08","guid":{"rendered":"https:\/\/cloudspert.com\/?p=527"},"modified":"2025-03-13T00:33:13","modified_gmt":"2025-03-13T00:33:13","slug":"les-conteneurs-deep-dive-1ere-partie","status":"publish","type":"post","link":"https:\/\/cloudspert.com\/?p=527","title":{"rendered":"Les conteneurs\u00a0: Deep Dive 1\u00e8re partie"},"content":{"rendered":"<figure><img decoding=\"async\" alt=\"\" src=\"https:\/\/cdn-images-1.medium.com\/max\/900\/0*-BWWxt7hbLk7r1tI.jpg\"\/><\/figure>\n<h3>Les conteneurs\u00a0: Deep Dive 1\u00e8re\u00a0partie<\/h3>\n<p>Conteneurs, conteneurs, conteneurs, conteneurs. J\u2019entends ce mot plus que mon nom ces jours-ci, qu\u2019est-ce qu\u2019ils ont de si sp\u00e9cial, est-ce de la magie, un savoir ou juste une boule\u00a0?<\/p>\n<p>C\u2019est ce \u00e0 quoi je vais essayer de r\u00e9pondre dans cette s\u00e9rie d\u2019articles.<\/p>\n<h3>Ce qui est\u00a0attendu<\/h3>\n<p>Pour rendre le sujet plus simple et moins ennuyeux, il sera divis\u00e9 en plusieurs articles, dont les principaux sujets sont\u00a0:<\/p>\n<ul>\n<li><strong>Qu\u2019est-ce qu\u2019un conteneur: <\/strong>dans cette section, vous d\u00e9couvrirez les fonctionnalit\u00e9s utilis\u00e9s pour cr\u00e9er un conteneur et ce qu\u2019est simplement un conteneur.<\/li>\n<li><strong>R\u00e9seau de conteneurs: <\/strong>cette section sera consacr\u00e9e au r\u00e9seau de conteneurs, nous d\u00e9couvrirons comment un conteneur peut se connecter \u00e0 un autre conteneur ou \u00e0 l\u2019internet.<\/li>\n<li><strong>CNI(Container Network Interface)\u00a0:<\/strong> nous comprendrons ensemble comment fonctionne CNI en\u00a0d\u00e9tail.<\/li>\n<\/ul>\n<p>Dans tous les articles, nous ne nous en tiendrons pas \u00e0 l\u2019aspect th\u00e9orique de chaque th\u00e8me, je crois que pour bien comprendre un sujet, il faut aller sous le capot et tout faire soi-m\u00eame, et c\u2019est ce que nous allons essayer de faire dans chaque section. De quoi ai-je besoin\u00a0?<\/p>\n<h3>Besoin<\/h3>\n<p>Dans cette s\u00e9rie d\u2019article vous aurez besoin de 2 VMs Linux avec une distribution de votre choix, je vais utiliser une distribution Ubuntu\u00a020.04.<\/p>\n<p>C\u2019est parti\u00a0!<\/p>\n<h3>Qu\u2019est-ce qu\u2019un conteneur\u00a0?<\/h3>\n<p>Un conteneur est un processus, attendez, o\u00f9 allez-vous, nous n\u2019avons pas encore fini. O\u00f9 en \u00e9tions-nous, ah oui, un conteneur est un processus mais un processus sp\u00e9cial, pourquoi sp\u00e9cial, nous allons le d\u00e9couvrir. Mais avant de comprendre ce qui le rend si sp\u00e9cial, allons faire un tour au Kernel\u00a0Land.<\/p>\n<h4>Kernel Land<\/h4>\n<p>Comme vous le savez bien ou pas. Dans la m\u00e9moire Linux, nous avons deux espaces o\u00f9 les applications s\u2019ex\u00e9cutent g\u00e9n\u00e9ralement, l\u2019espace noyau et l\u2019espace utilisateur. L\u2019espace noyau est prot\u00e9g\u00e9 et seul le code noyau est autoris\u00e9 \u00e0 y acc\u00e9der. D\u2019autre part, l\u2019espace utilisateur peut \u00eatre utilis\u00e9 par des applications non privil\u00e9gi\u00e9es, comme un navigateur ou un \u00e9diteur de\u00a0texte.<\/p>\n<figure><img decoding=\"async\" alt=\"\" src=\"https:\/\/cdn-images-1.medium.com\/max\/767\/1*k5lOYVxcedbo711HkzCAOQ.png\"\/><figcaption>Espace utilisateur et espace\u00a0noyau<\/figcaption><\/figure>\n<p>Donc si l\u2019espace utilisateur ne peut pas acc\u00e9der \u00e0 l\u2019espace noyau, comment une application de l\u2019espace utilisateur peut-elle ouvrir un fichier situ\u00e9 sur un disque ou envoyer un ping\u00a0?<\/p>\n<p>La r\u00e9ponse est les appels syst\u00e8me. Les appels syst\u00e8me sont utilis\u00e9s par les applications de l\u2019espace utilisateur pour demander au noyau de faire quelque chose, comme ouvrir un fichier, envoyer un paquet r\u00e9seau ou cr\u00e9er un nouveau processus.<\/p>\n<figure><img decoding=\"async\" alt=\"\" src=\"https:\/\/cdn-images-1.medium.com\/max\/1024\/1*tcKoxUP_O6Prs8_oQPKNsg.png\"\/><figcaption>Appels syst\u00e8me<\/figcaption><\/figure>\n<p>Ainsi, comme nous pouvons le voir, un processus s\u2019ex\u00e9cutant en espace utilisateur demande au noyau de multiples actions pendant son ex\u00e9cution, mais cela n\u2019explique pas comment un processus peut \u00eatre\u00a0cr\u00e9\u00e9.<\/p>\n<p>Comment les processus sont-ils cr\u00e9\u00e9s\u00a0?<\/p>\n<p>Chaque processus est un fork d\u2019un autre processus, pour ceux qui ne savent pas ce qu\u2019est un fork. Fork est encore un autre appel syst\u00e8me, ce appel syst\u00e8me peut \u00eatre appel\u00e9 par des processus (parents) qui s\u2019ex\u00e9cutent dans l\u2019espace utilisateur pour cr\u00e9er de nouveaux processus (enfants).<\/p>\n<figure><img decoding=\"async\" alt=\"\" src=\"https:\/\/cdn-images-1.medium.com\/max\/543\/1*NtLqY22La2N_mtUb2dwj5w.png\"\/><figcaption>Cr\u00e9ation d\u2019un processus<\/figcaption><\/figure>\n<p>Chaque processus est cr\u00e9\u00e9 comme dans le diagramme ci-dessus\u00a0:<\/p>\n<p>1. Le processus parent appelle le clone syscal, avec quelques flags le kernel va copier la zone m\u00e9moire de <strong>app1<\/strong>, \u00e0 cet \u00e9tat l\u2019enfant et le p\u00e8re auront le m\u00eame code \u00e0 ex\u00e9cuter. Par exemple lorsque vous ex\u00e9cutez dans votre bash la commande <strong><em>ls<\/em><\/strong>, \u00e0 cette phase l\u2019enfant pointe toujours vers le code\u00a0bash.<\/p>\n<p>2. Pour charger le code de l\u2019app2, l\u2019appel syst\u00e8me exec va charger le code de l\u2019app2. Si nous continuons avec le m\u00eame exemple que dans la phase 1, avec ce appel syst\u00e8me le code <strong><em>ls<\/em><\/strong> est\u00a0charg\u00e9.<\/p>\n<blockquote><p><strong>Note:<\/strong><\/p><\/blockquote>\n<blockquote><p>Certains d\u2019entre vous connaissent l\u2019appel syst\u00e8me fork comme le moyen de cr\u00e9er de nouveaux processus. Pour clarifier, l\u2019appel syst\u00e8me clone est le nouveau fork, il fait le m\u00eame travail mais permet plus de contr\u00f4le sur le contexte d\u2019ex\u00e9cution d\u2019un processus. Maintenant, la fonction forks de la glibc appelle l\u2019appel syst\u00e8me clone avec des drapeaux qui fournissent le m\u00eame effet que l\u2019appel syst\u00e8me fork traditionnel. Mais vous n\u2019avez pas besoin de conna\u00eetre ces d\u00e9tails ennuyeux.<\/p><\/blockquote>\n<p>Nous savons maintenant comment un processus est cr\u00e9\u00e9, mais qu\u2019est-ce qui rend un conteneur si sp\u00e9cial par rapport \u00e0 un processus normal La diff\u00e9rence est qu\u2019un conteneur est un processus isol\u00e9 du reste des autres processus, cette isolation peut \u00eatre \u00e0 un ou plusieurs niveaux, certaines des isolations bien connues sont au niveau r\u00e9seau, montage des fichiers, l\u2019IPC (Inter Process Communication), PID et ainsi de suite. Mais qu\u2019est-ce qui rend cette isolation possible\u00a0? La r\u00e9ponse est le noyau, qui utilise la fonctionnalit\u00e9 Namespace.<\/p>\n<p>Donc, qu\u2019est-ce qui va changer si on refait le m\u00eame\u00a0sch\u00e9ma<\/p>\n<figure><img decoding=\"async\" alt=\"\" src=\"https:\/\/cdn-images-1.medium.com\/max\/607\/1*gHGOVBC6NUsiPzJkDrTBug.png\"\/><figcaption>Cr\u00e9ation d\u2019un conteneur<\/figcaption><\/figure>\n<p>Comme nous pouvons le voir, la proc\u00e9dure est la m\u00eame, la diff\u00e9rence r\u00e9side dans les flags pass\u00e9s \u00e0 l\u2019appel syst\u00e8me clone, certains de ces flags sont utilis\u00e9s pour cr\u00e9er de nouveaux espaces de noms\u00a0:<\/p>\n<ul>\n<li><strong><em>CLONE_NEWIPC<\/em><\/strong>\u00a0<strong><em>: <\/em><\/strong>cr\u00e9e le processus dans un nouveau namespace IPC, ce qui signifie que le processus ne peut pas envoyer de signaux comme kill \u00e0 d\u2019autres processus dans le namespace de l\u2019h\u00f4te ou d\u2019autres namespaces.<\/li>\n<li><strong><em>CLONE_NEWNET\u00a0:<\/em><\/strong> cr\u00e9e le processus dans un nouveau namespace r\u00e9seau, en faisant cela le processus aura ses propres tables r\u00e9seau (routage, arp), ses propres interfaces r\u00e9seau, sa propre configuration r\u00e9seau.<\/li>\n<li><strong>CLONE_NEWNS\u00a0:<\/strong> cr\u00e9e le processus dans un nouveau namespace de montage, ceci cachera les montages d\u2019h\u00f4tes au processus.<\/li>\n<li><strong><em>CLONE_NEWPID\u00a0:<\/em><\/strong> cr\u00e9e le processus dans un nouveau namespace PID, ceci emp\u00eachera le processus de voir d\u2019autres processus, et permet de r\u00e9utiliser les ID de processus d\u00e9j\u00e0 utilis\u00e9s sur l\u2019h\u00f4te ou d\u2019autres namespaces.<\/li>\n<li><strong><em>CLONE_NEWUSER\u00a0:<\/em><\/strong> cr\u00e9e le processus dans un nouveau namespace utilisateur, avec cela un utilisateur <strong><em>user1<\/em><\/strong> sur le conteneur n\u2019est pas le m\u00eame que un utilisateur <strong><em>user1<\/em><\/strong> sur\u00a0l\u2019h\u00f4te.<\/li>\n<\/ul>\n<p>Clone n\u2019est pas le seul appel syst\u00e8me utilis\u00e9 pour isoler un processus, il y a d\u2019autres appels syst\u00e8me aussi\u00a0:<\/p>\n<ul>\n<li><strong><em>unshare\u00a0:<\/em><\/strong> Cet appel syst\u00e8me est en fait le m\u00eame que clone mais la diff\u00e9rence est que cet appel syst\u00e8me va cr\u00e9er et d\u00e9placer le processus actuel vers un nouveau namespaces alors que clone va cr\u00e9er un nouveau processus avec de nouveaux namespaces.<\/li>\n<li><strong><em>setns\u00a0: <\/em><\/strong>Cet appel syst\u00e8me permet au processus en cours d\u2019ex\u00e9cution de rejoindre un namespace existant.<\/li>\n<\/ul>\n<p>Maintenant, le diable qui se cache derri\u00e8re les conteneurs est d\u00e9voil\u00e9, pour le noyau les conteneurs n\u2019existent pas, c\u2019est tout un tas de namespaces qui isolent le processus comme dans le film inception o\u00f9 l\u2019acteur pense qu\u2019il est dans le monde r\u00e9el mais au lieu de cela il est dans un r\u00eave, et nous n\u2019allons pas parler du niveau deux inception (conteneurs dans un conteneur), ce qui est possible aussi avec les namespaces.<\/p>\n<p>En fin de compte, je pense que le tweet de <strong><em>J\u00e9r\u00f4me Petazzoni<\/em><\/strong> r\u00e9sume bien la situation.<\/p>\n<h3>J\u00e9r\u00f4me Petazzoni on Twitter: \u00ab\u00a0\u00a0\u00bbContainers are processes,born from tarballs,anchored to namespaces,controlled by cgroups\u00a0\u00bb\ud83d\udcaf@alicegoldfuss #VelocityConf \/ Twitter\u00a0\u00bb<\/h3>\n<p>\u00ab\u00a0Containers are processes,born from tarballs,anchored to namespaces,controlled by cgroups\u00a0\u00bb\ud83d\udcaf@alicegoldfuss #VelocityConf<\/p>\n<h3><strong>Next<\/strong><\/h3>\n<p>Dans le prochain article, nous utiliserons les notions que nous avons vues aujourd\u2019hui pour cr\u00e9er un conteneur \u00e0 partir de rien, ce n\u2019est pas si difficile, vous verrez, \u00e0 la prochaine fois.<\/p>\n<h3>Bey\u00a0!!!!!<\/h3>\n<h3>Ressources<\/h3>\n<ul>\n<li><a href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/setns.2.html\">setns(2) &#8211; Linux manual page<\/a><\/li>\n<li><a href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/clone.2.html\">clone(2) &#8211; Linux manual page<\/a><\/li>\n<li><a href=\"https:\/\/man7.org\/linux\/man-pages\/man7\/namespaces.7.html\">namespaces(7) &#8211; Linux manual page<\/a><\/li>\n<li><a href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/unshare.2.html\">unshare(2) &#8211; Linux manual page<\/a><\/li>\n<li><a href=\"https:\/\/man7.org\/linux\/man-pages\/man3\/exec.3.html\">exec(3) &#8211; Linux manual page<\/a><\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/medium.com\/_\/stat?event=post.clientViewed&amp;referrerSource=full_rss&amp;postId=237484441139\" width=\"1\" height=\"1\" alt=\"\"\/><\/p>","protected":false},"excerpt":{"rendered":"<p>Les conteneurs\u00a0: Deep Dive 1\u00e8re\u00a0partie Conteneurs, conteneurs, conteneurs, conteneurs. J\u2019entends ce mot plus que mon nom ces jours-ci, qu\u2019est-ce qu\u2019ils ont de si sp\u00e9cial, est-ce de la magie, un savoir ou juste une boule\u00a0? C\u2019est ce \u00e0 quoi je vais essayer de r\u00e9pondre dans cette s\u00e9rie d\u2019articles. Ce qui est\u00a0attendu Pour rendre le sujet plus simple et moins ennuyeux, il sera divis\u00e9 en plusieurs articles, dont les principaux sujets sont\u00a0: Qu\u2019est-ce qu\u2019un conteneur: dans cette section, vous d\u00e9couvrirez les fonctionnalit\u00e9s utilis\u00e9s pour cr\u00e9er un conteneur et ce qu\u2019est simplement un conteneur. R\u00e9seau de conteneurs: cette section sera consacr\u00e9e au r\u00e9seau de conteneurs, nous d\u00e9couvrirons comment un conteneur peut se connecter \u00e0 un autre conteneur ou \u00e0 l\u2019internet. CNI(Container Network Interface)\u00a0: nous comprendrons ensemble comment fonctionne CNI en\u00a0d\u00e9tail. Dans tous les articles, nous ne nous en tiendrons pas \u00e0 l\u2019aspect th\u00e9orique de chaque th\u00e8me, je crois que pour bien comprendre un sujet, il faut aller sous le capot et tout faire soi-m\u00eame, et c\u2019est ce que nous allons essayer de faire dans chaque section. De quoi ai-je besoin\u00a0? Besoin Dans cette s\u00e9rie d\u2019article vous aurez besoin de 2 VMs Linux avec une distribution de votre choix, je vais utiliser une distribution Ubuntu\u00a020.04. C\u2019est parti\u00a0! Qu\u2019est-ce qu\u2019un conteneur\u00a0? Un conteneur est un processus, attendez, o\u00f9 allez-vous, nous n\u2019avons pas encore fini. O\u00f9 en \u00e9tions-nous, ah oui, un conteneur est un processus mais un processus sp\u00e9cial, pourquoi sp\u00e9cial, nous allons le d\u00e9couvrir. Mais avant de comprendre ce qui le rend si sp\u00e9cial, allons faire un tour au Kernel\u00a0Land. Kernel Land Comme vous le savez bien ou pas. Dans la m\u00e9moire Linux, nous avons deux espaces o\u00f9 les applications s\u2019ex\u00e9cutent g\u00e9n\u00e9ralement, l\u2019espace noyau et l\u2019espace utilisateur. L\u2019espace noyau est prot\u00e9g\u00e9 et seul le code noyau est autoris\u00e9 \u00e0 y acc\u00e9der. D\u2019autre part, l\u2019espace utilisateur peut \u00eatre utilis\u00e9 par des applications non privil\u00e9gi\u00e9es, comme un navigateur ou un \u00e9diteur de\u00a0texte. Espace utilisateur et espace\u00a0noyau Donc si l\u2019espace utilisateur ne peut pas acc\u00e9der \u00e0 l\u2019espace noyau, comment une application de l\u2019espace utilisateur peut-elle ouvrir un fichier situ\u00e9 sur un disque ou envoyer un ping\u00a0? La r\u00e9ponse est les appels syst\u00e8me. Les appels syst\u00e8me sont utilis\u00e9s par les applications de l\u2019espace utilisateur pour demander au noyau de faire quelque chose, comme ouvrir un fichier, envoyer un paquet r\u00e9seau ou cr\u00e9er un nouveau processus. Appels syst\u00e8me Ainsi, comme nous pouvons le voir, un processus s\u2019ex\u00e9cutant en espace utilisateur demande au noyau de multiples actions pendant son ex\u00e9cution, mais cela n\u2019explique pas comment un processus peut \u00eatre\u00a0cr\u00e9\u00e9. Comment les processus sont-ils cr\u00e9\u00e9s\u00a0? Chaque processus est un fork d\u2019un autre processus, pour ceux qui ne savent pas ce qu\u2019est un fork. Fork est encore un autre appel syst\u00e8me, ce appel syst\u00e8me peut \u00eatre appel\u00e9 par des processus (parents) qui s\u2019ex\u00e9cutent dans l\u2019espace utilisateur pour cr\u00e9er de nouveaux processus (enfants). Cr\u00e9ation d\u2019un processus Chaque processus est cr\u00e9\u00e9 comme dans le diagramme ci-dessus\u00a0: 1. Le processus parent appelle le clone syscal, avec quelques flags le kernel va copier la zone m\u00e9moire de app1, \u00e0 cet \u00e9tat l\u2019enfant et le p\u00e8re auront le m\u00eame code \u00e0 ex\u00e9cuter. Par exemple lorsque vous ex\u00e9cutez dans votre bash la commande ls, \u00e0 cette phase l\u2019enfant pointe toujours vers le code\u00a0bash. 2. Pour charger le code de l\u2019app2, l\u2019appel syst\u00e8me exec va charger le code de l\u2019app2. Si nous continuons avec le m\u00eame exemple que dans la phase 1, avec ce appel syst\u00e8me le code ls est\u00a0charg\u00e9. Note: Certains d\u2019entre vous connaissent l\u2019appel syst\u00e8me fork comme le moyen de cr\u00e9er de nouveaux processus. Pour clarifier, l\u2019appel syst\u00e8me clone est le nouveau fork, il fait le m\u00eame travail mais permet plus de contr\u00f4le sur le contexte d\u2019ex\u00e9cution d\u2019un processus. Maintenant, la fonction forks de la glibc appelle l\u2019appel syst\u00e8me clone avec des drapeaux qui fournissent le m\u00eame effet que l\u2019appel syst\u00e8me fork traditionnel. Mais vous n\u2019avez pas besoin de conna\u00eetre ces d\u00e9tails ennuyeux. Nous savons maintenant comment un processus est cr\u00e9\u00e9, mais qu\u2019est-ce qui rend un conteneur si sp\u00e9cial par rapport \u00e0 un processus normal La diff\u00e9rence est qu\u2019un conteneur est un processus isol\u00e9 du reste des autres processus, cette isolation peut \u00eatre \u00e0 un ou plusieurs niveaux, certaines des isolations bien connues sont au niveau r\u00e9seau, montage des fichiers, l\u2019IPC (Inter Process Communication), PID et ainsi de suite. Mais qu\u2019est-ce qui rend cette isolation possible\u00a0? La r\u00e9ponse est le noyau, qui utilise la fonctionnalit\u00e9 Namespace. Donc, qu\u2019est-ce qui va changer si on refait le m\u00eame\u00a0sch\u00e9ma Cr\u00e9ation d\u2019un conteneur Comme nous pouvons le voir, la proc\u00e9dure est la m\u00eame, la diff\u00e9rence r\u00e9side dans les flags pass\u00e9s \u00e0 l\u2019appel syst\u00e8me clone, certains de ces flags sont utilis\u00e9s pour cr\u00e9er de nouveaux espaces de noms\u00a0: CLONE_NEWIPC\u00a0: cr\u00e9e le processus dans un nouveau namespace IPC, ce qui signifie que le processus ne peut pas envoyer de signaux comme kill \u00e0 d\u2019autres processus dans le namespace de l\u2019h\u00f4te ou d\u2019autres namespaces. CLONE_NEWNET\u00a0: cr\u00e9e le processus dans un nouveau namespace r\u00e9seau, en faisant cela le processus aura ses propres tables r\u00e9seau (routage, arp), ses propres interfaces r\u00e9seau, sa propre configuration r\u00e9seau. CLONE_NEWNS\u00a0: cr\u00e9e le processus dans un nouveau namespace de montage, ceci cachera les montages d\u2019h\u00f4tes au processus. CLONE_NEWPID\u00a0: cr\u00e9e le processus dans un nouveau namespace PID, ceci emp\u00eachera le processus de voir d\u2019autres processus, et permet de r\u00e9utiliser les ID de processus d\u00e9j\u00e0 utilis\u00e9s sur l\u2019h\u00f4te ou d\u2019autres namespaces. CLONE_NEWUSER\u00a0: cr\u00e9e le processus dans un nouveau namespace utilisateur, avec cela un utilisateur user1 sur le conteneur n\u2019est pas le m\u00eame que un utilisateur user1 sur\u00a0l\u2019h\u00f4te. Clone n\u2019est pas le seul appel syst\u00e8me utilis\u00e9 pour isoler un processus, il y a d\u2019autres appels syst\u00e8me aussi\u00a0: unshare\u00a0: Cet appel syst\u00e8me est en fait le m\u00eame que clone mais la diff\u00e9rence est que cet appel syst\u00e8me va cr\u00e9er et d\u00e9placer le processus actuel vers un nouveau namespaces alors que clone va cr\u00e9er un nouveau processus avec de nouveaux namespaces. setns\u00a0: Cet appel syst\u00e8me permet au processus en cours d\u2019ex\u00e9cution de rejoindre un namespace existant. Maintenant, le diable qui se cache derri\u00e8re les conteneurs est<\/p>\n","protected":false},"author":3,"featured_media":632,"comment_status":"open","ping_status":"open","sticky":false,"template":"elementor_canvas","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[14],"tags":[],"class_list":["post-527","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-containers","entry","has-media"],"jetpack_featured_media_url":"https:\/\/cloudspert.com\/wp-content\/uploads\/2022\/08\/1.webp","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/cloudspert.com\/index.php?rest_route=\/wp\/v2\/posts\/527","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudspert.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudspert.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudspert.com\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudspert.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=527"}],"version-history":[{"count":1,"href":"https:\/\/cloudspert.com\/index.php?rest_route=\/wp\/v2\/posts\/527\/revisions"}],"predecessor-version":[{"id":634,"href":"https:\/\/cloudspert.com\/index.php?rest_route=\/wp\/v2\/posts\/527\/revisions\/634"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudspert.com\/index.php?rest_route=\/wp\/v2\/media\/632"}],"wp:attachment":[{"href":"https:\/\/cloudspert.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=527"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudspert.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=527"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudspert.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=527"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}