Open16

k8s 素振りログ

KatsukiniwaKatsukiniwa

hello-world-deployment-1.yaml を写経していて分からなかったこと

  • metadataで指定できるプロパティ
    • namespaceやnameを指定できるのは知っている
    • 他にもあった気がするけど覚えていない...
  • spec.selectorの意味
    • どのpod?にリクエストを流すかを指定できるプロパティだった気がするような...という超あやふやな理解なので絶対に調べる
  • templateの意味
    • これは完全に分からないので0から調べる
KatsukiniwaKatsukiniwa

今回のtutorialを個別のnamespaceに分離して実行したいが、各ワークロードのyamlでnamespaceを指定するのが面倒だったのでkustomizeを導入してkustomization.yamlでnamespaceを指定する方式で対応。
tutorialではdefault namespaceで行われていたのでちょっとアレンジを加える。
kustomizationでnamespaceを指定する方法は以下のkustomizationの公式ドキュメントを参照。

https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/namespace/

KatsukiniwaKatsukiniwa

namespace作成するの忘れてた...

kubectl create namespace load-balance-ingress でもいいんだけどマニフェストで管理したいので以下の公式ドキュメントを参照して作成する。

https://kubernetes.io/docs/tasks/administer-cluster/namespaces/

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
KatsukiniwaKatsukiniwa

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}')"
KatsukiniwaKatsukiniwa

ingressのIPを yq を使ってワンライナーで取得する

$ kubectl get ingress hello-world-ingress --output yaml | yq ".status.loadBalancer.ingress[0].ip"
"35.241.53.237"
KatsukiniwaKatsukiniwa
$ curl -s "http://${GATEWAY_URL}/productpage" | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>

いけた。