Kubernetes CORE CONCEPTS – IMPERATIVE COMMANDS(ハンズオン)

■ kubectl run  <pod-name> --image=<image-name>

以下のPodをデプロイ

Name: nginx-pod

Image: nginx:alpine

 

■ kubectl run <pod-name> --image=<image-name> --labels="<key-value-pairs>"

以下を指定してredis podをデプロイ

Pod Name: redis

Image: redis:alpine

Labels: tier=db

 

■ kubectl create service --help でコマンドを確認

 

■ kubectl create service clusterip --help

 

■ kubectl expose --help

クラスター内でポート6379でredisアプリケーションを公開するサービスredis-serviceを作成する場合。

Service: redis-service

Port: 6379

Type: ClusterIP

kubectl expose pod <pod-name> --port 6379 --name <service-name>

kubectl get svc <service-name> 

 

■3つのレプリカを持つイメージkodekloud/webapp-colorを使用して、webappという名前のデプロイメントを作成する場合。(Imperativeコマンドのみを使用、定義ファイルを作成しない。)

Name: webapp

Image: kodekloud/webapp-color

Replicas: 3

 

■nginxイメージを使用してcustom-nginxという新しいポッドを作成し、コンテナポート8080で公開

 kubectl run <pod-name> --image=nginx --port=<port-num>


■Imperativeコマンドを使用してev-nsという名前の新しいNamespaceを作成。

kubectl create namespace <namespace-name>

 

■Imperativeコマンドを使用して、redisイメージを使用してdev-ns NameSpaceにredis-deployという新しいデプロイメントを作成し。 2つのレプリカを指定。

kubectl create deployment redis-deploy --image=redis --replicas=2 -n dev-ns

kubectl get deployment -n <namespace-name>

redis-deploy Deploymentが特定のNamespace, dev-nsにある事を確認

 

■デフォルトの名前空間でイメージhttpd:alpineを使用して、httpdというポッドを作成。次に、同じ名前(httpd)でタイプClusterIPのサービスを作成。サービスのターゲットポートは80。

 --expose=true は ポッドに関連付けられたClusterIPサービスを作成する`--port`が必須

 

 

Kubernetes CORE CONCEPTS – IMPERATIVE COMMANDS

Kubectlを使用したImperativeコマンド

 

--dry-run

デフォルトでは、コマンドが実行されるとすぐにリソースが作成されます。

 

--dry-run=client

コマンドをテストしたいだけの場合に使用

これはリソースを作成しませんが、代わりに、リソースを作成できるかどうか、およびコマンドが正しいかどうかを示します。

 

-o yaml

リソース定義がYAML形式で画面に出力される

 

POD

 

Create an NGINX Pod NGINX でのPodの作成

kubectl run nginx --image=nginx

 

Generate POD Manifest YAML file (-o yaml). Don't create it(--dry-run)

PODマニフェストYAMLファイルの生成 (作成しない場合--dry-run)

kubectl run nginx --image=nginx --dry-run=client -o yaml

 

Deployment

 

Create a deployment  デプロイメントの作

kubectl create deployment --image=nginx nginx

 

Generate Deployment YAML file (-o yaml). Don't create it(--dry-run)

DeploymentYAMLファイルの生成 (作成しない場合--dry-run)

kubectl create deployment --image=nginx nginx --dry-run=client -o yaml

 

Generate Deployment with 4 Replicas

4Replicas でDeploymentを生成する場合

kubectl create deployment nginx --image=nginx --replicas=4

 kubectl scale を使用して展開をスケーリングすることもできる

kubectl scale deployment nginx --replicas=4

 

Another way to do this is to save the YAML definition to a file and modify

YAML定義をファイルに保存して変更する事ににより生成する場合

kubectl create deployment nginx --image=nginx --dry-run=client -o yaml > nginx-deployment.yaml

デプロイを作成する前に、レプリカまたはその他のフィールドでYAMLファイルを更新可能。

 

Service

 

Create a Service named redis-service of type ClusterIP to expose pod redis on port 6379

ClusterIPの種類で「redis-service」と言う名前、Serviceを作成し、Port6379でポッド redisを公開する場合

kubectl expose pod redis --port=6379 --name redis-service --dry-run=client -o yaml

ポッドのラベルがセレクターとして自動的に使用されり

Or

kubectl create service clusterip redis --tcp=6379:6379 --dry-run=client -o yaml

セクターとしてpod ラベル使用されなく、セクターをapp=redis として認識する

オプションとしてセレクターを渡すことはできない。なので、ポッドに別のラベルセットがある場合は、うまく機能しません。したがって、サービスを作成する前に、ファイルを生成してセレクターを変更すること。

 

Create a Service named nginx of type NodePort to expose pod nginx's port 80 on port 30080 on the nodes:

NodePortタイプのnginxという名前のサービスを作成して、ノードのPort 30080にポnginxのポート80を公開する場合

kubectl expose pod nginx --type=NodePort --port=80 --name=nginx-service --dry-run=client -o yaml

ポッドのラベルがセレクターとして自動的に使用されますが、ノードポートを指定することはできません。ポッドを使用してサービスを作成する前に、定義ファイルを生成してから、ノードポートを手動で追加する必要がある。

Or

kubectl create service nodeport nginx --tcp=80:80 --node-port=30080 --dry-run=client -o yaml

ポッドラベルをセレクターとして使用されない

上記の両方のコマンドには課題がある。
一方はセレクターを受け入れることができませんが、もう一方はノードポートを受け入れることができない。
kubectl exposeコマンドを使用することをお勧め。ノードポートを指定する必要がある場合は、同じコマンドを使用して定義ファイルを生成し、サービスを作成する前にノードポートを手動で入力。

 

レファレンス:

https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

https://kubernetes.io/docs/reference/kubectl/conventions/

OWASP Broken Web Applications Project をVirtualBox にインストールして接続

VirtualBox のインストール
https://www.oracle.com/jp/virtualization/technologies/vm/downloads/virtualbox-downloads.html

OWASP Broken Web Applications Project ダウンロードVirtualBoxにインポートして接続)
https://sourceforge.net/projects/owaspbwa/files/1.2/OWASP_Broken_Web_Apps_VM_1.2.ova/download

 

参考YouTube動画はこちら >>> 

Install OWASP Broken Web Application Project (BWAP) on VirtualBox in 2022

 

VirtualBoxを起動し、新規作成

 

仮想マシンの作成画面で、LINUX、LINUX2.6を選択

 

ダウンロードした解凍済みのOWASP Broken Web Applications Project フォルダの「OWASP Broken Web Apps-cl1.vmdk」を選択

開いて以下エラーが出た場合

Failed to get device handle and/or partition ID for 00000000017a3ff0 (hPartitionDevice=0000000000000ca9, Last=0xc0000002/1) (VERR_NEM_VM_CREATE_FAILED).

 

Windowsの機能の仮想マシンプラットフォーム」を無効に

 

Virtual Boxの設定でネットワークの「割り当て」の「ホストオンリーアダプター」を選択

 

作成したowaspを起動

ログイン情報 name/pass=root/owaspbwa

以下アクセスが記載されてある

Web App  http://192.168.56.101

データベース http://192.168.56.101/phpmyadmin

接続完了! Voila (じゃじゃ~ん)!!

Ubuntu 22.04 Jammy Jellyfish を VirtualBox にインストール <Window編>

参考YouTube >>>

How to Install Ubuntu 22.04 LTS Linux on VirtualBox using Windows 10 - YouTube

 

Ubuntuをダウンロード >>> Ubuntu 22.04 Jammy Jellyfish

 

Virtual Boxを開いて、仮想マシンの作成

適当に使用したいメモリーサイズを指定

 

仮想ハードディスクの作成

フォルダ箇所とサイズを指定

デフォルトのVDIを指定

可変サイズを指定して作成

作成後にEFIを有効に

仮想環境を起動して、ダウンロードしたUbuntuのイメージを指定

Install開始

お試しかInstallを選択

Installation タイプを選択

場所の指定し、その次の画面でログイン名とパスワードを指定

 

Ubuntu 22.04 Jammy Jellyfish の インストール 完了 !

Kubernetes CORE CONCEPTS - NAMESPACES

Namespaceとは

Kubernetesでは同一の物理クラスター上で複数の仮想クラスターの動作をサポート(DNSのネットワークのソリューション等)しており、この仮想クラスターをNamespaceと呼ぶ。

Podのセット、クラスターを作ると自動でデフォルトのNamespaceが作成される。

 

Kubernetesの起動時には4つの初期Namespaceが作成される。

  • default 他にNamespaceを持っていないオブジェクトのためのデフォルトNamespace
  • kube-system Kubernetesシステムによって作成されたオブジェクトのためのNamespace
  • kube-public このNamespaceは自動的に作成され、全てのユーザーから読み取り可能です。(認証されていないユーザーも含みます。) このNamespaceは、リソースをクラスター全体を通じてパブリックに表示・読み取り可能にするため、ほとんどクラスターによって使用される用途で予約される。 このNamespaceのパブリックな側面は単なる慣例であり、要件ではない。
  • kube-node-lease クラスターのスケールに応じたノードハートビートのパフォーマンスを向上させる各ノードに関連したLeaseオブジェクトのためのNamespace。

 

公式サイトでチェック>>> Namespace(名前空間)

 

Namespaceをデフォルトではなく名前を指定して作成する事も出来る。

たとえば、開発環境(例dev)と本番環境の両方で同じクラスターを使用したいが、 同時にそれらの間のリソースを分離し、それらごとに異なるNamespaceを作成できる。

 

どのタイミングでNamespaceが作成されるか?

 

Kubectl create -f pod-definition.yml でpodを作成したらデフォルトのNamespaceにpodが作成される。

 

Namespaceを指定してpodを作成する場合は

Kubectl create -f pod-definition.yml --namespace=dev

 

Podを毎回作成する場合にNamespaceを指定しない場合はpodのdefinitionファイルで、"metadata:"配下に"namespace:"を記入。

 

接続方法は?

 

デフォルトのWeb podから同じクラスタ内のデータベースに接続する場合mysql.connect(“db-service”)

デフォルトのWeb podからdevのデータベースに接続する場合

mysql.connect(“db-service.dev.svc.cluster.local”)

 

Namespaceに関するコマンド

 

kubectl get namespaces/ns 幾つNamespaceがあるか

以下の場合10個ある

 

kubectl get pods

kubectl get pods --namespace/-n=<namespace-name>

特定のNamespaceにPodが幾つあるか

デフォルトではデフォルトのNamespaceに入っている為、他のNamespaceのpod一覧を取得するにはその表示したいデフォルト以外のNamespace名を指定する必要がある。

 

デフォルトで入るNamespaceを変えたい場合(例dev)は以下でコンフィグを修正

kubectl config set-context $(kubectl config current-context) --namespace=dev

このコマンドは、最初に現在のコンテキストを識別し($のカッコ内)てから変更内容を識別して設定する。 コンテキストとは、同じ管理から複数の環境で複数のクラスターを管理するために使用される。

 

デフォルトで入るNamespaceを他に変えた場合、デフォルトのpod一覧を取得する為には、もちろんdefaultを指定。

kubectl get pods -n=default

 

kubectl run <name> --image=<image-name> -n=<namespace-name>
以下名前を指定してPodを作成する場合

  • Namespace: finance
  • Name: redis
  • Image Name: redis

 

kubectl get pods --all-namespaces 

kubectl get pods -A

NamespaceとPodが紐づけられた一覧を表示(すべてのpodが表示される)

 

blueアプリケーションがdatabase "db-service"にアクセスするにはどのDNS名とPortを使用すれば良いか?

→ "db-service.dev.svc.cluster.local" とport 6379 

 

以下の場合、db-serviceはmarketing とdevのNamespaceに使われているので、Namespaceの指定はフルパスを使用。

 

 

教材はこちら>>>

www.udemy.com

 

Kubernetes CORE CONCEPTS - SERVICES

Serviceとは

ServiceはPodの集合で実行されているアプリケーションをネットワークサービスとして公開する為に使われる。ReplicaSetにより複数のPodのReplicaが存在する場合等、Podの前面Serviceを設置する事により自動のロードバランスを設定する事が出来る。

Serviceのタイプ達

種類は色々あるが、ClusterIPとNodePortは試験に出るそうな。

クライアントが自分のクラスタ内にいるのか、自分のクラスタの外からアクセスするかによってClusterIPかNodePortを選ぶ。

ClusterIP

  • クラスター内部のIPでServiceを公開
  • Serviceはクラスター内部からのみ疎通性がある
  • デフォルトのServiceType

NodePort

  • 外部に対してサービスを公開(例 Webサーバーの)
  • クラスタノードのポートを外部に公開しそのポートをNATでサービスに割当
  • 各NodeのIPにて、静的なポート(NodePort)上でServiceを公開する
  • そのNodePort のServiceが転送する先のClusterIP Serviceが自動的に作成れる
  • 外部から<NodeIP>:<NodePort>でアクセスし、NodePort Serviceにアクセスできるようになる

LoadBalancer

 

公式サイトでチェック >>> Service

 

NodePortの詳細

以下の場合同じネットワーク環境内からはアプリが置かれたPodにアクセス可能だが

PCから直接アクセス出来ない為、Serviceが必要となる。

ServiceのDefinition ファイルでは3つのポートの指定し設定を記入。

上記ポート番号を記入するだけではリンクはしなく、Service とPodのリンクはPodのlabelsをService のselectorに記入が必要である。

 

Service に関するコマンド例達

kubectl get service/svc 幾つのService が存在するか

kubectl describe service <service-name> serviceの詳細表示

この場合、TargetPortは6443

2つのLabelが設定されている

Endpointsは10.34.134.6:6443(Service に紐づけられたPodのこと)で1つ存在

 

Deploymentでポッドを作成するために使用されるイメージの調べ方

kubectl get deploy deploymentの名前を取得

kubectl describe deploy <deploy-name> deploymentの名前を使用して詳細を表示

 

既存のファイルを使用し、以下を指定して新しいサービスを作成するには

Name: webapp-service
Type: NodePort
targetPort: 8080
port: 8080
nodePort: 30080
selector:
  name: simple-webapp

YAMLファイルをvi等で編集

編集後

kubectl create -f <service-file-name> Serviceを作成

 

教材はこちら>>>

www.udemy.com



 

Kubernetes CORE CONCEPTS – DEPLOYMENTS

Deployment はPodとReplicaSetの宣言的なアップデート機能を提供する。

公式サイトでチェック >>> Deployment

 

kubectl get deployments 

システム上Deployments が幾つあるかの確認

以下0と1つの結果表示

 

kubectl create -f <file-name>

deploymentを既存のファイルで作成したら以下エラーが表示

kind が無いとのエラーで、deployment の頭文字の「d」を大文字にviで修正

 

以下を指定して新しいDeploymentを作成する場合

Name: httpd-frontend
Replicas: 3
Image: httpd:2.4-alpine

 

kubectl create deployment --help 

helpコマンドで作成したい内容のコマンドをチェック

 

今回は名前とimage名を指定して、Replicasetを3で指定するので以下を使用

kubectl create deployment <name> --image=<image-name> --replicas=<number-of-rs>

 

kubectl get deploy

Deployment内で3つのレプリカが稼働している事を確認