K8S 入門から実践まで - K8S へのアプリケーションのデプロイ

K8S 入門から実践まで - K8S へのアプリケーションのデプロイ

背景

最近、k8s 関連のブログやビデオをいくつか更新したところ、いくつかのフィードバックをいただきました。フィードバックは、おおよそ次のカテゴリに分けられます。

  • 同社はサービス指向の変革を遂げていますが、クラウドネイティブにはまだ触れていません。
  • 同社のアプリケーションの一部はクラウドネイティブへの変革を遂げていますが、作業の大部分はインフラストラクチャ部門と運用保守部門によって推進されています。私は単なる開発者なので、詳細は理解していませんし、k8s へのアクセス権もありません。
  • 依然として、主に仮想マシンの展開に基づく従来の運用と保守に基づいています。

2番目のタイプが大部分を占めます。同社はクラウドネイティブ化を進めているものの、純粋なビジネスR&Dの同僚とはあまり関係がないようで、自身の仕事に変化はない。

ちょうどそのとき、私はビジネスR&Dの視点からインフラ部門に異動したばかりでした。私は両方の役割に携わっており、ビジネス R&D スタッフが会社のクラウド ネイティブ アーキテクチャを理解できるよう支援してきました。

そのため、研究開発の観点からk8sを実践できるよう、体系的に皆さんを導いていきたいと考えています。

k8s の一部の機能は実際には運用と保守を重視しており、R&D の優先度はそれほど高くないためです。そのため、インストール、コンポーネント、その他のモジュールなど、k8s の運用と保守に関するいくつかの知識ポイントについては説明しません。主に日々の開発で使うコンポーネントについてお話します。

プラン

はじめる

  • アプリケーションをk8sにデプロイする
  • クロスサービス呼び出し
  • クラスターへの外部アクセス

高度な

  • 設定の使用方法
  • サービスメッシュの実践

アプリケーションを操作する

  • アプリケーションプローブ
  • ローリングアップデートとロールバック
  • エレガントなログコレクション
  • アプリケーションの可観測性
  • 指標の視覚化

k8sは共通のミドルウェアを導入する

  • Helmワンクリックデプロイ
  • アプリケーションライフサイクルを自動化するオペレータの作成

ここでディレクトリを整理しました。各章には、一緒に視聴できるブログとビデオがあります。お好みに合わせてお選びいただけます。

動画も関係するので、週2回の更新を目標に、2か月以内にすべての更新を完了したいと考えています。

私の経験によれば、上記の内容をすべてマスターすれば、k8s をより深く理解できるようになります。

アプリケーションをk8sにデプロイする

まず、第 1 章 [アプリケーションを k8s にデプロイする] から始めて、Go を使用して簡単な Web アプリケーションを作成し、それを Docker イメージにパッケージ化してから、k8s にデプロイしてインターフェース呼び出しを完了します。

アプリケーションの作成

func main() { http.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) { log.Println("ping") fmt.Fprint(w, "pong") }) http.ListenAndServe(":8081", nil) }

アプリケーションは非常にシンプルで、ping インターフェイスを提供し、pong を返します。

Dockerファイル

# 第一阶段:编译Go 程序FROM golang:1.19 AS dependencies ENV GOPROXY=https://goproxy.cn,direct WORKDIR /go/src/app COPY go.mod . #COPY ../../go.sum . RUN --mount=type=ssh go mod download # 第二阶段:构建可执行文件FROM golang:1.19 AS builder WORKDIR /go/src/app COPY . . #COPY --from=dependencies /go/pkg /go/pkg RUN go build # 第三阶段:部署FROM debian:stable-slim RUN apt-get update && apt-get install -y curl COPY --from=builder /go/src/app/k8s-combat /go/bin/k8s-combat ENV PATH="/go/bin:${PATH}" # 启动Go 程序CMD ["k8s-combat"]

その後、docker イメージを構築するための dockerfile が作成されました。

 docker: @echo "Docker Build..." docker build . -t crossoverjie/k8s-combat:v1 && docker image push crossoverjie/k8s-combat:v1

make docker を使用すると、イメージがローカルでビルドされ、dockerhub にアップロードされます。

デプロイメントの作成

次のステップは、プロセス全体の中で最も重要な部分であり、デプロイメントを記述する k8s を扱う唯一の場所でもあります。

前回のビデオ「1 分で k8s を理解する」では、一般的なコンポーネントについて説明しました。

最も一般的なものはデプロイメントであり、通常はステートレス アプリケーションをデプロイするために使用されます。他のコンポーネントについてはまだあまり知る必要はありません。デプロイメントの記述方法を見てみましょう。

 apiVersion: apps/v1 kind: Deployment metadata: labels: app: k8s-combat name: k8s-combat spec: replicas: 1 selector: matchLabels: app: k8s-combat template: metadata: labels: app: k8s-combat spec: containers: - name: k8s-combat image: crossoverjie/k8s-combat:v1 imagePullPolicy: Always resources: limits: cpu: "1" memory: 300Mi requests: cpu: "0.1" memory: 30Mi

今のところ、最初の 2 行の apiVersion と kind に注意を払う必要はありません。これらは、デプロイメントを記述するための固定された方法であると考えてください。

メタデータ: 名前が示すように、メタデータが定義され、デプロイメントの名前をポッドに伝える場所です。ここでは次のように定義されています: k8s-combat

真ん中:

 metadata: labels: app: k8s-combat

分かりやすいです。デプロイメントにラベルを付けることです。通常、このラベルを他のコンポーネントに関連付けることは理にかなっています。そうでなければ、それは単なるラベルです。

タグはキーと値のペアの形式であり、キーと値の両方をカスタマイズできます。

ここでの app: k8s-combat は、以下の仕様の下のセレクターと一致しており、両方とも app: k8s-combat に関連付けられていることを示しています。

テンプレートで定義されたラベルは、セレクターをテンプレートで定義された Pod に関連付けるためにも使用されます。

Pod は、k8s で同じ機能を持つコンテナのグループです。 Pod は複数のコンテナにバインドできます。ここではアプリケーション コンテナーが 1 つだけあります。他のコンテナについては、後で istio とログ収集について説明するときに説明します。

テンプレートで定義された内容はわかりやすいです。コンテナのプル アドレスと占有されているリソース (CPU/メモリ) を指定します。

replicas: 1: は、レプリカが 1 つだけデプロイされていること、つまりノードが 1 つだけであることを意味します。

アプリケーションをデプロイする

次に、次のコマンドを使用します。

 kubectl apply -f deployment/deployment.yaml

クラウドベンダーが提供する k8s 環境は、本番環境でよく使用されます。 https://minikube.sigs.k8s.io/docs/start/minikube を使用してローカルでシミュレートできます。

このデプロイメントが適用され、コンテナが同時に k8s にデプロイされて使用されます。

 kubectl get pod

バックグラウンドでは、k8s は入力したリソースに基づいて適切なノードを選択し、そこに現在の Pod をデプロイします。

先ほどデプロイした Pod がリストされます。

 ❯ kubectl get pod NAME READY STATUS RESTARTS AGE k8s-combat-57f794c59b-7k58n 1/1 Running 0 17h

次のコマンドを使用します:

 kubectl exec -it k8s-combat-57f794c59b-7k58n bash

docker を使用する場合と同様に、コンテナーに入ります。

次に、curl コマンドを実行してインターフェースにアクセスします。

 root@k8s-combat-57f794c59b-7k58n:/# curl http://127.0.0.1:8081/ping pong root@k8s-combat-57f794c59b-7k58n:/#

この時点で別のターミナルを開いて実行します。

 ❯ kubectl logs -f k8s-combat-57f794c59b-7k58n 2023/09/03 09:28:07 ping

もちろん、コンテナ内のログを印刷できますが、前提として、アプリケーション ログは標準出力に書き込まれます。

要約する

以上がこの章の主な内容です。重点は、アプリケーション プログラマーを Docker イメージにパッケージ化してイメージ ウェアハウスにアップロードし、k8s によるスケジュール設定と実行のためにデプロイメントを構成することです。

関連するソース コードと yaml リソース ファイルは次のとおりです。

https://github.com/crossoverJie/k8s-combat。

<<:  OpenTelemetry Operator を使用して観測可能なデータを SigNoz に送信する

>>:  マルチリージョン展開が簡単に: Linode VLAN による迅速なマルチリージョン展開

推薦する

2022 年に注目を集めるクラウド テクノロジーはどれでしょうか?

クラウドネイティブが主役にデジタルエンジニアリングサービス企業InfostretchのCTOであるマ...

レンタカー旅行プラットフォームユーザー操作システム(1):チャネルプロモーション

この記事では、レンタカー プラットフォームである EasiestCarRental の完全なユーザー...

ダブル11マーケティングのヒント:Weiboが2つの典型的な電子商取引の事例を公開

月給5,000~50,000のこれらのプロジェクトはあなたの将来ですもうすぐダブルイレブンがやってき...

vpscheap-年間$10/256MBメモリ/3GB SSD/30MB無制限/シカゴ

vpscheap.net ではプロモーションを行っています。ブラックフライデーのプロモーションとは呼...

知っておくべき電子商取引マーケティングの10の暗黙のルール

今日、ネットの記事で、月給2万元の電子商取引業者が仕事を辞めてWeChat Momentsで商品を販...

シングルテナント クラウドとマルチテナント クラウド、どちらが適していますか?

マルチテナント クラウド プラットフォームとシングルテナント クラウド プラットフォームに関する議論...

百度の掲載と外部リンクの浮き沈みの理由が明らかに

先月、バイドゥはデータまたは外部のリンクを含めていますあなたはまだ静かで快適な年を過ごしていません。...

faconhostはどうですか?ロサンゼルス トリプル ネットワーク AS9929 シリーズ VPS レビュー

Faconhost は最近、ロサンゼルスのデータセンターに新しい VPS シリーズを追加しました。A...

ブームが過ぎて、マイクロブログは静かになった。メディアへの転換が打開策かもしれない。

海外のミニブログの元祖であるTumblrの月間ページビューが200億を突破する一方で、国内の模倣サイ...

ウェブサイトの重みとランキングが低いのはなぜですか?

1. 外部リンクの品質が低い一部のウェブサイトでは外部リンクを大量に掲載していますが、その品質は非常...

タオバオストアにおける悪質な競争を防ぐための戦略の分析

競争は常にライバル関係にあり、それはオンラインストア経営の世界に鮮明に反映されています。この言葉は伝...

教育関連「タオバオ」の問題点:技術は良いが教育業界への理解がない

インターネット教育のスタートアップが突然人気を集めています。オンライン言語学習コミュニティ Shen...

クラウドネイティブ時代にアプリケーションを安全に保つために自動化が重要な理由

過去 1 年間で、長年にわたり実装されてきたテクノロジー ロードマップの実現が加速し、デジタル変革を...