Upgrade to Pro — share decks privately, control downloads, hide ads and more …

初めてのKubernetes (ハンズオン)

初めてのKubernetes (ハンズオン)

More Decks by NearMeの技術発表資料です

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  5. 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
    クラスタの作成

    View Slide

  6. 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台で動作

    View Slide

  7. 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つにスケールしていることを確認

    View Slide

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

    View Slide

  9. 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つに戻してみよう

    View Slide

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

    View Slide

  11. 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

    View Slide

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

    View Slide

  13. 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を用いてもっと細かい制御が可能 )

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  17. 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を指定してリソースを削除

    View Slide

  18. 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内のどれかにアクセスしている
    “- - -”は区切りで必要

    View Slide

  19. 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の構築

    View Slide

  20. 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にアクセス

    View Slide

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

    View Slide

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

    View Slide

  23. 22
    Thank you

    View Slide