k8s 素振りログ
GKE触るならGKEのチュートリアルやるのが良さそうなのでもう一回なぞってみる。
使用されているリポジトリはこちら
hello-world-deployment-1.yaml
を写経していて分からなかったこと
- metadataで指定できるプロパティ
- namespaceやnameを指定できるのは知っている
- 他にもあった気がするけど覚えていない...
- spec.selectorの意味
- どのpod?にリクエストを流すかを指定できるプロパティだった気がするような...という超あやふやな理解なので絶対に調べる
- templateの意味
- これは完全に分からないので0から調べる
deploymentの公式ドキュメントはこちら。
日本語版も存在するけど更新が遅れている可能性があるのでなるべく英語版で読む。(DeepLは必須...)
今回のtutorialを個別のnamespaceに分離して実行したいが、各ワークロードのyamlでnamespaceを指定するのが面倒だったのでkustomizeを導入してkustomization.yamlでnamespaceを指定する方式で対応。
tutorialではdefault namespaceで行われていたのでちょっとアレンジを加える。
kustomizationでnamespaceを指定する方法は以下のkustomizationの公式ドキュメントを参照。
脱線するけどGKEの公式サンプルがここに転がっているのでどっかで試しにapplyしてみたい。
namespace作成するの忘れてた...
kubectl create namespace load-balance-ingress
でもいいんだけどマニフェストで管理したいので以下の公式ドキュメントを参照して作成する。
namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: load-balance-ingress
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world-deployment-1
spec:
selector:
matchLabels:
greeting: hello
Version: one
replicas: 1
template:
metadata:
labels:
greeting: hello
Version: one
spec:
containers:
- name: hello-app-1
image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0"
resources:
requests:
memory: "64Mi"
cpu: "128m"
limits:
memory: "64Mi"
cpu: "128m"
env:
- name: "PORT"
value: "50000"
kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: "load-balance-ingress"
resources:
- namespace.yaml
- deployment.yaml
applyコマンドは
$ kustomize build . | kubectl apply -f -
$ kubectl get pods -n load-balance-ingress
NAME READY STATUS RESTARTS AGE
hello-world-deployment-1-76cd5f6486-g2lqm 1/1 Running 0 4m42s
resourcesの設定がないとVS Code上で警告が出ていたので適当に追加した。
resourcesについてはこちら。
deployment.yaml
~~~
selector:
matchLabels:
greeting: hello
Version: one
~~~
これが何で指定されているのか理解できなかったんだけど
template:
metadata:
labels:
greeting: hello
Version: one
でpodにselectorで指定されているlabelが追加されてる。
これによりdeploymentが持つReplicaSetが管理対象のPodを発見できる。
The .spec.selector field defines how the created ReplicaSet finds which Pods to manage. In this case, you select a label that is defined in the Pod template (app: nginx). However, more sophisticated selection rules are possible, as long as the Pod template itself satisfies the rule.
作成したpodを一発でdescribeするコマンドは以下。
$ kubectl describe pod "$(kubectl get pod -o jsonpath='{.items[0].metadata.name}')"
日本語で便利ツールが紹介されている記事。
serviceの公式ドキュメントはこちら
良さげな記事
k8sで提供されているAPIのドキュメント
ingressのIPを yq を使ってワンライナーで取得する
$ kubectl get ingress hello-world-ingress --output yaml | yq ".status.loadBalancer.ingress[0].ip"
"35.241.53.237"
ingressを使ってアクセスできるようになったのでチュートリアルはひとまず完了。
次はistioのチュートリアルを触る。
$ kubectl label namespace default istio-injection=enabled
これをマニフェストで管理する方法は以下
今回も個別にnamespace resourceを作成するのでそこに設定を追加する。
apiVersion: v1
kind: Namespace
metadata:
name: "book-info"
labels:
"istio-injection": "enabled"
$ curl -s "http://${GATEWAY_URL}/productpage" | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
いけた。