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
OWASP Broken Web Applications Project をVirtualBox にインストールして接続
VirtualBox のインストール
https://www.oracle.com/jp/
OWASP Broken Web Applications Project ダウンロード(VirtualBoxにインポートして接続)
https://sourceforge.net/
参考YouTube動画はこちら >>>
VirtualBoxを起動し、新規作成
ダウンロードした解凍済みの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 タイプを選択
場所の指定し、その次の画面でログイン名とパスワードを指定
Kubernetes CORE CONCEPTS - NAMESPACES
Namespaceとは
Kubernetesでは同一の物理クラスター上で複数の仮想クラスターの動作をサポート(DNSのネットワークのソリューション等)しており、この仮想クラスターをNamespaceと呼ぶ。
Podのセット、クラスターを作ると自動でデフォルトのNamespaceが作成される。
Kubernetesの起動時には4つの初期Namespaceが作成される。
default
他にNamespaceを持っていないオブジェクトのためのデフォルトNamespacekube-system
Kubernetesシステムによって作成されたオブジェクトのためのNamespacekube-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の指定はフルパスを使用。
教材はこちら>>>
Kubernetes CORE CONCEPTS - SERVICES
Serviceとは
ServiceはPodの集合で実行されているアプリケーションをネットワークサービスとして公開する為に使われる。ReplicaSetにより複数のPodのReplicaが存在する場合等、Podの前面Serviceを設置する事により自動のロードバランスを設定する事が出来る。
Serviceのタイプ達
種類は色々あるが、ClusterIPとNodePortは試験に出るそうな。
クライアントが自分のクラスタ内にいるのか、自分のクラスタの外からアクセスするかによってClusterIPかNodePortを選ぶ。
ClusterIP
NodePort
- 外部に対してサービスを公開(例 Webサーバーの)
- クラスタノードのポートを外部に公開しそのポートをNATでサービスに割当
- 各NodeのIPにて、静的なポート(
NodePort
)上でServiceを公開する - その
NodePort
のServiceが転送する先のClusterIP
Serviceが自動的に作成れる - 外部から
<NodeIP>:<NodePort>
でアクセスし、NodePort
Serviceにアクセスできるようになる
LoadBalancer
- クラウドプロバイダーのロードバランサーを使用して、Serviceを外部に公開
- クラスター外部にあるロードバランサーが転送する先の
NodePort
とClusterIP
Serviceは自動的に作成される
公式サイトでチェック >>> 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-serviceType:
NodePorttargetPort:
8080port:
8080nodePort:
30080selector:
name:
simple-webapp
YAMLファイルをvi等で編集
編集後
kubectl create -f <service-file-name> Serviceを作成
教材はこちら>>>
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つのレプリカが稼働している事を確認