Slide 1

Slide 1 text

0 初めてのKubernetes (ハンズオン) 2023-05-26 第45回NearMe技術勉強会 Kenji Hosoda

Slide 2

Slide 2 text

1 Kubernetes(クバネティス)とは? “デプロイやスケーリングを自動化したり、コンテナ化されたアプリケーションを管理したり するための、オープンソースのシステム” https://kubernetes.io/ 私のイメージ インフラに関わる様々なツールが揃っていて、かつ、オープンソー スで利用できるので、これ一つ覚えればインフラで出来ることの幅 が広がる。ただし、運用は面倒なところもあるので、小規模のサー ビスだと割に合わない場合もある。

Slide 3

Slide 3 text

2 古き良きWebサービスのホスティング ロードバランサ ノード1 ノード2 SSHログイン Webサービス コード 設定 Webサービス コード 設定 これはこれでいい部分もある

Slide 4

Slide 4 text

3 KubernetesによるWebサービスのホスティング ワーカーノード1 設定ファイル ロードバランサ Pod Pod Pod Pod Pod Pod Pod Service ワーカーノード2 Pod Container Container コントロールプレーン ワーカーノードを管理 Container Registry イメージをダウンロード だいぶ省略して書いてます

Slide 5

Slide 5 text

4 Kindを利用してローカルにクラスタを作成してみよう (他のOSの場合:https://kind.sigs.k8s.io/docs/user/quick-start#installation) kind create cluster kind get clusters docker ps Docker上で動いていることを確認 kindのインストール brew install kind # For mac クラスタの作成

Slide 6

Slide 6 text

5 kubectlを利用してみよう brew install kubectl # For mac kubectl version --client kubectl 他のOS: https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/install-kubectl.html kubectlのインストール kubectl cluster-info --context kind-kind kubectl config use-context kind-kind コンテキストをkindのクラスタに設定 kubectl get node ノードの取得 → kindのデフォルトはワーカーノードとコントロールプレーンまとめて 1台で動作

Slide 7

Slide 7 text

6 Deploymentを利用して、Podをスケールさせよう apiVersion: apps/v1 kind: Deployment metadata: labels: app: web-nginx name: web-nginx spec: replicas: 3 selector: matchLabels : app: web-nginx template: metadata: labels: app: web-nginx spec: containers: - image: nginx name: nginx ports: - containerPort : 80 web-nginx.yaml Podの定義 3つにスケール kubectl apply -f web-nginx.yaml web-nginx.yamlマニフェストの適用 kubectl get pod Podが3つにスケールしていることを確認

Slide 8

Slide 8 text

7 7 DeploymentのPodを削除してみよう kubectl get pod Podの一覧を取得 kubectl delete pod web-nginx-694c7647c-7d9rk 一つのPodを削除 kubectl get pod Podの一覧を取得 → しばらくすると新たな Podが構築される ※Deploymentで管理されたPodなので再構築される。  Pod単体で構築した場合は再構築されない。

Slide 9

Slide 9 text

8 8 Podの数を変更してみよう apiVersion: apps/v1 kind: Deployment metadata: labels: app: web-nginx name: web-nginx spec: replicas: 2 selector: matchLabels : app: web-nginx template: metadata: labels: app: web-nginx spec: containers: - image: nginx name: nginx ports: - containerPort : 80 web-nginx.yaml 2つに変更 kubectl apply -f web-nginx.yaml 変更したweb-nginx.yamlマニフェストの適用 kubectl get pod Podが2つになっていることを確認 また3つに戻してみよう

Slide 10

Slide 10 text

9 9 Kubernetesは宣言的 設定ファイル 状態A 設定ファイル 状態B 障害が起こっても自律的に復帰する 次の状態への変化は自動的に行う (Reconcile処理)

Slide 11

Slide 11 text

10 10 ノードを増やしてみよう 1/3 kind delete cluster kind create cluster --config=my-cluster.yaml クラスタを再構築して、 Ingress用のcluster設定を適用 kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane - role: worker - role: worker kubeadmConfigPatches: - | kind: JoinConfiguration nodeRegistration: kubeletExtraArgs: node-labels: "my-label=true" my-cluster.yaml (kindのIngress用のcluster設定) kubectl get node ワーカーノードが2つ、コントロールプレーンのノードが 1つあることを確認 ラベルをつける ことができる my-label=true

Slide 12

Slide 12 text

11 11 ノードを増やしてみよう 2/3 kubectl apply -f web-nginx.yaml web-nginx.yamlマニフェストの適用 kubectl get pod -o wide 2つのノードにPodが展開されていることを確認 my-label=true

Slide 13

Slide 13 text

12 12 特定のノードでPodを動かしてみよう apiVersion: apps/v1 kind: Deployment … spec: containers: - image: nginx name: nginx ports: - containerPort: 80 nodeSelector: my-label: "true" web-nginx.yaml my-label=true kubectl apply -f web-nginx.yaml web-nginx.yamlマニフェストの適用 kubectl get pod -o wide 2特定のラベルがついたノードにのみ Podが配置されていることを確認 特定ラベルがついたノードを選択 (Affinityを用いてもっと細かい制御が可能 )

Slide 14

Slide 14 text

13 13 特定のPodのログを見てみよう kubectl get pod Podの一覧を取得 kubectl logs web-nginx-f5bb6cbf5-b299w 一つのPodのログを取得 ※1つのPod内に複数のContainerがある場合は、Container名も指定する

Slide 15

Slide 15 text

14 14 特定のPodにログインしてみよう kubectl get pod Podの一覧を取得 kubectl exec -it web-nginx-694c7647c-kj7kr /bin/bash 一つのPodにログイン ※1つのPod内に複数のContainerがある場合は、Container名も指定する

Slide 16

Slide 16 text

15 マニフェストからリソースを削除してみよう kubectl delete -f web-nginx.yaml web-nginx.yamlマニフェストのリソースを削除 kubectl get pod Podが削除されていることを確認

Slide 17

Slide 17 text

16 16 namespaceを利用してみよう kubectl get namespace namespaceの一覧を取得 kubectl create namespace sandbox namespaceを作成 kubectl apply -f web-nginx.yaml -n sandbox web-nginx.yamlマニフェストをnamespaceを指定して適用 kubectl get pod 指定なしだとnamespaceは”default”なのでpodは表示されない kubectl get pod -n sandbox namespaceを指定するとpodが表示される kubectl delete -f web-nginx.yaml -n sandbox namespaceを指定してリソースを削除

Slide 18

Slide 18 text

17 Serviceを利用して”Webサービス”にアクセス # 先のDeploymentの定義に追記 --- apiVersion: v1 kind: Service metadata: name: web-nginx spec: selector: app: web-nginx ports: - port: 8080 targetPort: 80 web-nginx.yaml kubectl apply -f web-nginx.yaml web-nginx.yamlマニフェストを適用 kubectl get svc Serviceの確認 kubectl port-forward svc/web-nginx 8888:8080 Serviceをポートフォワードして外出しする curl localhost:8888 “Webサービス”のレスポンスを確認 ※3つのPod内のどれかにアクセスしている “- - -”は区切りで必要

Slide 19

Slide 19 text

18 Ingressを利用して”Webサービス”をホスティング 1/2 kind delete cluster kind create cluster --config=my-cluster.yaml クラスタを再構築して、 Ingress用のcluster設定を適用 kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane kubeadmConfigPatches : - | kind: InitConfiguration nodeRegistration: kubeletExtraArgs: node-labels: "ingress-ready=true" extraPortMappings : - containerPort: 80 hostPort: 80 protocol: TCP my-cluster.yaml (kindのIngress用のcluster設定) kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress -nginx/main/deploy/static/provider/kind/deploy.yaml nginx-ingress-controllerの構築

Slide 20

Slide 20 text

19 Ingressを利用して”Webサービス”をホスティング 1/2 # 先のServiceの定義に追記 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: a.example.com http: paths: - pathType: Prefix path: "/" backend: service: name: web-nginx port: number: 8080 web-nginx.yaml kubectl apply -f web-nginx.yaml web-nginx.yamlマニフェストを適用 # /etc/hostsに以下を追記 127.0.0.1 a.example.com /etc/hostsの編集 curl http://a.example.com/ a.example.comにアクセス

Slide 21

Slide 21 text

20 20 Lensを利用してクラスタ全体を見てみよう https://k8slens.dev/ からデスクトップアプリをダウンロード ・各種リソースを俯瞰して見れる ・直接Podのログが見れる ・直接Podにログインできる ・ポートフォワードを構築して内部にアクセ スできる ・(Prometheusと組み合わせてモニタリン グできる)

Slide 22

Slide 22 text

21 21 最後に kind delete cluster 今回、ストレージ周りや、定期実行周りは紹介しきれなかったですが、これらもよく利用される のでぜひキャッチアップしてみてください。 最後に、kindは地味にCPUやメモリを喰うので不要ならクラスタは削除しておいてください (他 のツールと比べて軽い方ではあるのですが)。

Slide 23

Slide 23 text

22 Thank you