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 による迅速なマルチリージョン展開

推薦する

SEO は本当に古いのでしょうか? どう思いますか?

昨夜、石頭は林希歌の有名人とのインタビューに参加しました。今回のゲストはZAC先生です。皆さんはZA...

企業はクラウドに近づく

クラウド サービス プロバイダー (CSP) の提供が成熟するにつれて、クラウドベースのワークロード...

20% オフ: tmzvps - $8/8 コア/2g メモリ/100g ハード ドライブ/無制限トラフィック/1000M ポート

中級から上級の VPS 販売業者である tmzvps.com は、ロサンゼルスを拠点とする webn...

セルフメディア後半は換金に失敗してアカウントがブロックされまくってた!

2018年5月、上場企業Hanye Co., Ltd.はQuantum Cloudを買収するために3...

#blackfriday# a2hosting - 最大 33% オフ/仮想ホスト/VPS/リセラー/4 つのデータセンター利用可能

毎年恒例のブラックフライデーは、ホスティング業界のスーパープロモーションです。2003年に設立された...

年末レビュー: 2011 年の草の根ウェブマスターのニュース トップ 10

2011 年のクリスマスが過ぎ、2012 年の新年を迎えようとしています。火薬のない戦場であるインタ...

#おすすめ# hosteons: 30% オフ - 無制限トラフィック VPS、KVM+Windows/ロサンゼルス データセンター

Hosteons は、これまでで最高の 30% 割引のマジック コードをリリースしました。ロサンゼル...

究極の予測: 2018 年にウェブサイトはどの程度の収益を上げるでしょうか?

編集者注: Murthy Nukala 氏は、多くの有名ブランドに広告テクノロジーを提供する企業、A...

SEOデータ分析スキル4:ウェブサイトトラフィック分析

みなさんこんにちは。私は徐子宇です。ウェブサイトのデータ分析に関しては、キーワードランキング、コンテ...

Sveltos による Kubernetes アドオン ライフサイクル管理

Sveltos は、クラスター全体にわたる Kubernetes アドオンの展開を簡素化し、クラスタ...

仮想化ソリューションとソフトウェアを選択するにはどうすればよいでしょうか?

皆さん、こんにちは。今日は、仮想化を実装するためのソリューションとソフトウェア、そして自分に合った仮...

エッジコンピューティング、人工知能、サーマルイメージング - スマートセキュリティの未来

スマート セキュリティ業界は急速に進化しており、AI と 4K がスマート カメラで普及するにつれて...

ASO とリテンションの双方にメリットのある状況を実現するためにアプリを更新するにはどうすればよいでしょうか?

開発者として最も望まないことは、忠実なユーザーがアプリを放棄してしまうことです。ユーザーエクスペリエ...

投稿した外部リンクを理解していますか?

ウェブマスターは、毎日 50、100 以上の外部リンクを投稿するために熱心に取り組んでいます。しかし...

Facebook が HTML5 を放棄してネイティブ アプリに切り替えた 4 つの理由

少し前にFacebookはネイティブiOSアプリケーションをリリースしましたが、これは旧バージョンに...