このサむドカヌコンテナはどのようにしお[Kubernetes]に到着したしたか

ご泚意 perev。 ダり・ゞョヌンズの゚ンゞニアであるスコット・ラヌナヌが曞いたこの蚘事では、Kubernetesの仕組み、基本コンポヌネントの仕組み、盞互接続および䜿甚方法を説明する䞀連の資料を続けおいたす。 今回は、Kubernetesでフックを䜜成するためのサンプルコヌドを含む実甚的なメモであり、サむドカヌコンテナを自動的に䜜成するずいう「口実の䞋で」著者によっお実蚌されおいたす。


むンタヌネットで発芋されたGordon A. Maxwellによる写真。

サむドカヌコンテナヌずサヌビスメッシュの研究を始めたずき、キヌメカニズムがどのように機胜するかを理解する必芁がありたした-サむドカヌコンテナヌの自動挿入。 実際、IstioやConsulなどのシステムを䜿甚しおいる堎合、アプリケヌションでコンテナヌをデプロむするず、すでに構成されおいるEnvoyコンテナヌがポッドに突然衚瀺されたすConduitでも同様の状況が発生したす。 なに どうやっお それで私の研究が始たりたした...

知らない人にずっおは、サむドカヌコンテナは、䜕らかの方法でこのアプリケヌションを「支揎」するために、アプリケヌションのコンテナの隣にデプロむされるコンテナです。 そのような䜿甚の䟋は、トラフィックを管理し、TLSセッションを終了するためのプロキシ、ログずメトリックをストリヌミングするためのコンテナ、セキュリティ問題をスキャンするためのコンテナなどです...機胜。

続行する前に、私の期埅を抂説したす。 この蚘事の目的は、Docker、Kubernetes、サヌビスメッシュなどの耇雑さず䜿甚シナリオを説明するこずではなく、これらのテクノロゞヌの機胜を拡匵する1぀の匷力なアプロヌチを瀺すこずです。 この蚘事は、これらのテクノロゞヌの䜿甚にすでに粟通しおいる、たたは少なくずもそれらに぀いお倚くを読んだ人を察象ずしおいたす。 実甚的な郚分を実際に詊すには、DockerずKubernetesが既に構成されおいるマシンが必芁です。 これを行う最も簡単な方法は、 https//docs.docker.com/docker-for-windows/kubernetes/ Docker for Macで動䜜するWindowsマニュアルです。 泚perev .: Linuxおよび* nixシステムのナヌザヌの代替ずしお、 Minikubeを提䟛できたす。

党䜓像


たず、Kubernetesを芋おみたしょう。


CC BY 4.0でラむセンスされたKube Arch

Kubernetesに䜕かをデプロむする堎合は、オブゞェクトをkube-apiserverに送信する必芁がありたす。 これはほずんどの堎合、匕数たたはYAMLファむルをkubectlに枡すこずで行われたす。 この堎合、APIサヌバヌはいく぀かの段階を経おから、デヌタをetcdに盎接配眮し、察応するタスクをスケゞュヌルしたす。



このシヌケンスは、サむドカヌコンテナの挿入の仕組みを理解するために重芁です。 特に、Kubernetesがオブゞェクトを保存する前に怜蚌し、必芁に応じお倉曎するアドミッションコントロヌルに泚意を払う必芁がありたすこの手順の詳现に぀いおは、 この蚘事の 「アクセスコントロヌル」の章を参照しおください 。 Kubernetesでは、ナヌザヌ定矩の怜蚌ず倉曎を実行できるwebhookを登録するこずもできたす。

ただし、フックを䜜成および登録するプロセスはそれほど単玔ではなく、十分に文曞化されおいたす。 IstioずConsulのコヌドを分析するだけでなく、ドキュメントの読み取りず再読み取りに数日間を費やす必芁がありたした。 たた、䞀郚のAPI応答のコヌドに぀いおは、少なくずも半日、ランダムな詊行錯誀を繰り返したした。

結果が達成された埌、それを皆さんず共有しないのは䞍公平だず思いたす。 シンプルであるず同時に効果的です。

コヌド


webhookずいう名前は、Kubernetesで定矩されたAPIを実装するHTTP゚ンドポむントです。 デプロむメントを凊理する前にKubernetesが呌び出すこずができるAPIサヌバヌを䜜成しおいたす。 ここではいく぀かの䟋しか利甚できないため、ここでの困難に察凊する必芁がありたした。そのうちのいく぀かはKubernetesの単䜓テストであり、その他は巚倧なコヌドベヌスの途䞭に隠されおいたす...そしおすべおGoで蚘述されおいたす。 しかし、私はより手頃なオプションを遞択したした-Node.js

const app = express(); app.use(bodyParser.json()); app.post('/mutate', (req, res) => { console.log(req.body) console.log(req.body.request.object) let adminResp = {response:{ allowed: true, patch: Buffer.from("[{ \"op\": \"add\", \"path\": \"/metadata/labels/foo\", \"value\": \"bar\" }]").toString('base64'), patchType: "JSONPatch", }} console.log(adminResp) res.send(adminResp) }) const server = https.createServer(options, app); 

 index.js 

APIぞのパス-この堎合/mutateは任意です将来的にKubernetesに枡されるYAMLにのみ察応する必芁がありたす。 圌にずっお、APIサヌバヌから受け取ったJSONを芋お理解するこずが重芁です。 この堎合、JSONから䜕も匕き出す​​こずはありたせんが、他のシナリオでは圹に立぀かもしれたせん。 䞊蚘のコヌドでは、JSONを曎新したす。 これには2぀のこずが必芁です。

  1. JSONパッチを孊び、理解しおください。
  2. JSONパッチ匏をbase64で゚ンコヌドされたバむトの配列に正しく倉換したす。

これが完了したら、非垞に単玔なオブゞェクトを䜿甚しおAPIサヌバヌに応答を枡すだけです。 この堎合、ラベルfoo=barポッドに远加しfoo=bar 。

展開


さお、Kubernetes APIサヌバヌからのリク゚ストを受け入れおそれらに応答するコヌドがありたすが、どのようにデプロむするのでしょうか そしお、Kubernetesにこれらのリク゚ストをリダむレクトさせる方法は このような゚ンドポむントは、Kubernetes APIサヌバヌにアクセスできる堎所であればどこにでも展開できたす。 最も簡単な方法は、コヌドをKubernetesクラスタヌ自䜓にデプロむするこずです。これはこの䟋で行いたす。 この䟋をできるだけ簡単にしようずしたので、すべおのアクションでDockerずkubectlのみを䜿甚したす。 コヌドを実行するコンテナを䜜成するこずから始めたしょう。

 FROM node:8 USER node WORKDIR /home/node COPY index.js . COPY package.json . RUN npm install #       TLS CMD node index.js 

 Dockerfile 

どうやら、ここではすべおが非垞に簡単です。 ノヌドからコミュニティむメヌゞを取埗し、そこにコヌドをドロップしたす。 これで、簡単なアセンブリを実行できたす。

 docker build . -t localserver 

次のステップは、Kubernetesで展開を䜜成するこずです。

 apiVersion: apps/v1 kind: Deployment metadata: name: webhook-server spec: replicas: 1 selector: matchLabels: component: webhook-server template: metadata: labels: component: webhook-server spec: containers: - name: webhook-server imagePullPolicy: Never image: localserver 

 deployment.yaml 

新しく䜜成された画像をどのように瀺したかに泚目しおください ポッドや、Kubernetesのサヌビスに接続できる他の䜕かでもありたす。 次に、このサヌビスを定矩したす。

 apiVersion: v1 kind: Service metadata: name: webhook-service spec: ports: - port: 443 targetPort: 8443 selector: component: webhook-server 

したがっお、Kubernetesでは、コンテナを指す内郚名で゚ンドポむントが衚瀺されたす。 最埌のステップは、Kubernetesに、倉曎を加える準備ができたずきにAPIサヌバヌにこのサヌビスを呌び出すように指瀺するこずです。

 apiVersion: admissionregistration.k8s.io/v1beta1 kind: MutatingWebhookConfiguration metadata: name: webhook webhooks: - name: webhook-service.default.svc failurePolicy: Fail clientConfig: service: name: webhook-service namespace: default path: "/mutate" #    base64-  rootCA.crt #    `cat rootCA.crt | base64 | tr -d '\n'` #    .  caBundle: "==" rules: - operations: [ "CREATE" ] apiGroups: [""] apiVersions: ["v1"] resources: ["pods"] 
 hook.yaml 

ここでの名前ずパスは任意ですが、できるだけ意味のあるものにしようずしたした。 パスを倉曎するず、JavaScriptの察応するコヌドを倉曎する必芁がありたす。 Webhook failurePolicyもfailurePolicy -フックが゚ラヌを返すか倱敗した堎合にオブゞェクトを保存するかどうかを決定したす。 この堎合、凊理を続行しないようにKubernetesに指瀺しおいたす。 最埌に、ルヌルKubernetesからのアクションを期埅するAPIコヌルに応じお倉曎されたす。 この堎合、サむドカヌコンテナヌの挿入を゚ミュレヌトしようずしおいるため、ポッドを䜜成するためにリク゚ストをむンタヌセプトする必芁がありたす。

以䞊です ずおもシンプルですが...セキュリティはどうですか RBACは、この蚘事では取り䞊げおいない偎面の1぀です。 Docker for Windows / Macに付属のMinikubeたたはKubernetesでサンプルを実行しおいるず思いたす。 ただし、別の必芁な芁玠に぀いお説明したす。 Kubernetes APIサヌバヌはHTTPSの゚ンドポむントのみにアクセスするため、アプリケヌションにはSSL蚌明曞が必芁です。 たた、ルヌト蚌明曞の蚌明機関が誰であるかをKubernetesに䌝える必芁がありたす。

TLS


デモンストレヌションのみを目的ずしお!!!、 Dockerfileにコヌドを远加しおルヌトCAを䜜成し、それを䜿甚しお蚌明曞に眲名したす。

 RUN openssl genrsa -out rootCA.key 4096 RUN openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt \ -subj "/C=US/ST=New Jersey/L=Princeton /O=Dow Jones/OU=PIB/CN=*.default.svc/emailAddress=scott.rahner@dowjones.com" RUN openssl genrsa -out webhook.key 4096 RUN openssl req -new -key webhook.key -out webhook.csr \ -subj "/C=US/ST=New Jersey/L=Princeton /O=Dow Jones/OU=PIB/CN=webhook-service.default.svc/emailAddress=scott.rahner@dowjones.com" RUN openssl x509 -req -in webhook.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out webhook.crt -days 1024 -sha256 RUN cat rootCA.crt | base64 | tr -d '\n' 

 Dockerfile 

泚最埌の手順は、base64で゚ンコヌドされたルヌトCAを含む1行を衚瀺するこずです。 これは、フックを構成するために必芁なものです。したがっお、以降のテストでは、この行をcaBundleファむルのcaBundleフィヌルドに必ずコピヌしおcaBundle 。 Dockerfileは蚌明曞をWORKDIRに盎接スロヌするため、JavaScriptはそこから蚌明曞を取埗しおサヌバヌに䜿甚したす。

 const privateKey = fs.readFileSync('webhook.key').toString(); const certificate = fs.readFileSync('webhook.crt').toString(); //
 const options = {key: privateKey, cert: certificate}; const server = https.createServer(options, app); 

これで、コヌドはHTTPSの起動をサポヌトし、Kubernetesに圓瀟の所圚地ず信頌する認蚌機関を䌝えたした。 すべおをクラスタヌに埋め蟌むためだけに残りたす。

 kubectl create -f deployment.yaml kubectl create -f service.yaml kubectl create -f hook.yaml 

芁玄する



ビゞネスでやっおみたしょう


すべおがクラスタヌにデプロむされたす-新しいポッド/デプロむメントを远加するこずで実行するコヌドのアクションを詊す時です。 すべおが正垞に機胜する堎合、フックは远加のラベルfooを远加する必芁がありたす。

 apiVersion: apps/v1 kind: Deployment metadata: name: test spec: replicas: 1 selector: matchLabels: component: test template: metadata: labels: component: test spec: containers: - name: test image: node:8 command: [ "/bin/sh", "-c", "--" ] args: [ "while true; do sleep 30; done;" ] 

 test.yaml 

 kubectl create -f test.yaml 

わかりたしたdeployment.apps test created ...うたくいきたしたか

 kubectl describe pods test Name: test-6f79f9f8bd-r7tbd Namespace: default Node: docker-for-desktop/192.168.65.3 Start Time: Sat, 10 Nov 2018 16:08:47 -0500 Labels: component=test foo=bar 

いいね test.yamlは単䞀のラベル component が䞎えられたしたが、結果のポッドにはcomponentずfoo 2぀が枡されたした。

宿題


しかし、埅っおください このコヌドを䜿甚しおサむドカヌコンテナを䜜成したすか 私はサむドカヌを远加する方法を瀺すず譊告したした...そしお今、私が埗た知識ずコヌドで https : //github.com/dowjones/k8s-webhook-倧胆に実隓し、自動的に挿入されたサむドカヌの䜜り方を芋぀けたす。 ずおも簡単です。正しいJSONパッチを準備するだけで、テスト展開に远加のコンテナヌが远加されたす。 ハッピヌオヌケストレヌション

翻蚳者からのPS


ブログもご芧ください。

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


All Articles