kubectlを利用してクラスタにアクセスする(1)
ここからは作成したKubernetes環境にアクセスして、コンテナを起動したり色々触ってみたりします。
筆者の動作環境は以下の通りです。基本的にどの方法でも同じような操作はできると思いますが、「port-forwardでNginxのページにアクセスする」「Serviceを作成してNginxのページにアクセスする」はクラスタのネットワーク環境によって必要な操作が変わってくる可能性があります。
- OS:mac OS Montrey(12.1)
- Kubernetes バージョン:v1.21.5
- Kubernetesクラスタ構築環境:Docker Desktop
全てのPodを参照してみる
まずは全てのPodを参照してみましょう。
$ kubectl get pod -A
実行すると以下の結果が返ってくると思います(以下はDocker Desktopでクラスタを構築した場合の実行結果です)。
❯ kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-558bd4d5db-jjpx4 0/1 Running 1 17h kube-system coredns-558bd4d5db-r5plp 0/1 Running 1 17h kube-system etcd-docker-desktop 1/1 Running 1 17h kube-system kube-apiserver-docker-desktop 1/1 Running 1 17h kube-system kube-controller-manager-docker-desktop 1/1 Running 1 17h kube-system kube-proxy-pwphr 1/1 Running 1 17h kube-system kube-scheduler-docker-desktop 1/1 Running 1 17h kube-system storage-provisioner 1/1 Running 1 17h kube-system vpnkit-controller 1/1 Running 8 17h ❯
「まだ何も作っていないのになぜ?」と思われるかもしれません。連載の第2回に書いたコンポーネントの名前がついていることから分かる通り、kube-system namespaceにKubernetesクラスタを動かすためのPodが作成されています。
Podを作成する:その1
kubectl run nginx --image=nginx -n mynamespace
実はこの1行だけでPodを作成し、コンテナを起動できます。この方法はデバッグ用Pod※のように暫定的な利用用途であれば良いですが、本番環境の運用においてPodを直接作成することはオススメしません。
※補足
コンテナには障害調査などに必要なツールが入っていないことが多いため、ツールを入れたデバッグ用Podを立ち上げて調査することが多いです。ただしKubernetes v1.22からはエフェメラルコンテナというデバッグ用コンテナを起動する機能がbeta版(Kubernetesでは機能をalpha/beta/GAの三段階にわけており、beta版になると安全な機能であることが保証されます。詳しくはこちら)に昇格したため、今後デバッグ用Podが必要なケースは減っていくことでしょう。
Podを作成する:その2
ではマニフェストを利用してPodを作成してNGINXのコンテナを起動してみましょう。
1. manifestを作成する
第2回で説明した通り、以下の通りPodを作成するためのマニフェストを作成します。
cat << EOF > pod.yaml apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 EOF
2. Podを作成する
以下のコマンドでKubernetes APIサーバに先ほど作成したマニフェストを送りましょう。
$ kubectl apply -f pod.yaml
以下の実行結果が返ってくると思います。
❯ kubectl apply -f pod.yaml pod/nginx unchanged ❯
3. 指定したPodが作成できていることを確認する
Runningになっていれば成功です。
❯ kubectl get po NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 10s ❯
Podを削除する
ではPodを削除してみましょう。
$ kubectl delete -f pod.yaml
以下を実行して消すこともできます。
$ kubectl delete pod nginx
結果は以下のようになるはずです。
❯ kubectl delete -f pod.yaml pod "nginx" deleted ❯
綺麗に消えていることも確認できます。
❯ kubectl get po No resources found in default namespace. ❯
ここではじめて「default namespace」とNamespaceの話が出てきましたが、実は今までkubectlでNamespaceを指定しなかったため自動的にdefault namespaceにリソースが作成されていました。
Namespaceを指定してリソースを作成する場合、kubectl -n <namespace>
を利用するか、マニフェスト内にNamespaceを指定します。
特にリソースを削除する際にはNamespace指定に気をつけましょう。筆者はマニフェスト内にNamespace指定があることに気づかず間違えて試験環境を破壊してしまったことがあります。
ではここから実際にアプリケーションをブラウザで表示するところまで動かしていきましょう。