Spring BootアプリをAzure Kubernetes Serviceで動かす(2)- YAMLファイルを使わずにデプロイする -

はじめに

先日からAzure Kubernetes Serviceを検証しています。まだまだKubernetesがあまりよくわかっていないのですが、一個ずつ学べていけたらと。

過去のものは以下。

YAMLファイルを書くのが面倒だと言っていたら、同僚から「簡単なものならkubectlコマンドでデプロイするのが一般的ですよ」と言われたのでちょっとやってみました。

コマンドの調査

コマンドを調査してみると以下のページがヒットしました。

kubernetes.io

ここに、以下のコマンドがあるのでこれを実行してみます。

kubectl create deployment nginx --image=nginx

また、kubecl create -hを実行してみるとcreateの次のコマンドはdeployment以外に以下のものが取れるようです。

Create a resource from a file or from stdin.

 JSON and YAML formats are accepted.

Examples:
  # Create a pod using the data in pod.json
  kubectl create -f ./pod.json
  
  # Create a pod based on the JSON passed into stdin
  cat pod.json | kubectl create -f -
  
  # Edit the data in registry.yaml in JSON then create the resource using the edited data
  kubectl create -f registry.yaml --edit -o json

Available Commands:
  clusterrole           Create a cluster role
  clusterrolebinding    Create a cluster role binding for a particular cluster role
  configmap             Create a config map from a local file, directory or literal value
  cronjob               Create a cron job with the specified name
  deployment            Create a deployment with the specified name
  ingress               Create an ingress with the specified name
  job                   Create a job with the specified name
  namespace             Create a namespace with the specified name
  poddisruptionbudget   Create a pod disruption budget with the specified name
  priorityclass         Create a priority class with the specified name
  quota                 Create a quota with the specified name
  role                  Create a role with single rule
  rolebinding           Create a role binding for a particular role or cluster role
  secret                Create a secret using specified subcommand
  service               Create a service using a specified subcommand
  serviceaccount        Create a service account with the specified name
  token                 Request a service account token

serviceを作るためにはkubectl create serviceを実行すればよさそうです。例によってkubectl create service-hをつけてコマンドの使い方を見てみます。

miyohide [ ~ ]$ kubectl create service -h
Create a service using a specified subcommand.

Aliases:
service, svc

Available Commands:
  clusterip      Create a ClusterIP service
  externalname   Create an ExternalName service
  loadbalancer   Create a LoadBalancer service
  nodeport       Create a NodePort service

Usage:
  kubectl create service [flags] [options]

Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).

今回はloadbalancerを作るので、さらにkubectl create service loadbalancer-hをつけてコマンドの使い方を見てみます。

miyohide [ ~ ]$ kubectl create service loadbalancer -h
Create a LoadBalancer service with the specified name.

Examples:
  # Create a new LoadBalancer service named my-lbs
  kubectl create service loadbalancer my-lbs --tcp=5678:8080

Options:
    --allow-missing-template-keys=true:
        If true, ignore any errors in templates when a field or map key is missing in the template. Only applies to
        golang and jsonpath output formats.

    --dry-run='none':
        Must be "none", "server", or "client". If client strategy, only print the object that would be sent, without
        sending it. If server strategy, submit server-side request without persisting the resource.

    --field-manager='kubectl-create':
        Name of the manager used to track field ownership.

    -o, --output='':
        Output format. One of: (json, yaml, name, go-template, go-template-file, template, templatefile, jsonpath,
        jsonpath-as-json, jsonpath-file).

    --save-config=false:
        If true, the configuration of current object will be saved in its annotation. Otherwise, the annotation will
        be unchanged. This flag is useful when you want to perform kubectl apply on this object in the future.

    --show-managed-fields=false:
        If true, keep the managedFields when printing objects in JSON or YAML format.

    --tcp=[]:
        Port pairs can be specified as '<port>:<targetPort>'.

    --template='':
        Template string or path to template file to use when -o=go-template, -o=go-template-file. The template format
        is golang templates [http://golang.org/pkg/text/template/#pkg-overview].

    --validate='strict':
        Must be one of: strict (or true), warn, ignore (or false).              "true" or "strict" will use a schema to validate
        the input and fail the request if invalid. It will perform server side validation if ServerSideFieldValidation
        is enabled on the api-server, but will fall back to less reliable client-side validation if not.                "warn" will
        warn about unknown or duplicate fields without blocking the request if server-side field validation is enabled
        on the API server, and behave as "ignore" otherwise.            "false" or "ignore" will not perform any schema
        validation, silently dropping any unknown or duplicate fields.

Usage:
  kubectl create service loadbalancer NAME [--tcp=port:targetPort] [--dry-run=server|client|none] [options]

Use "kubectl options" for a list of global command-line options (applies to all commands).

これで使い方が大体理解できたので、実際に実行してみます。

実行

まずはnginx Deploymentを作成します。

miyohide [ ~ ]$ kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
miyohide [ ~ ]$ 

あっけなくサクッとできます。Azure Portal上でも作成されていることが確認できます。

その後、Serviceを作成します。最初、loadbalancerの次に指定するNAMEを適当なものに指定してしまい、nginxのページが表示されなかったのですが、Deploymentで指定したものと同じもの(nginx)にしたら無事動きました。

miyohide [ ~ ]$ kubectl create service loadbalancer nginx --tcp=80:80
service/nginx created
miyohide [ ~ ]$ 

これもサクッとできました。Azure Portal上でも作成されていることが確認できます。

これで外部IPに表示されているアドレスにアクセスすると、nginxのページが表示されます。

YAMLを出力したい

今回はYAMLを使わずにデプロイすることをやったのですが、細かいカスタマイズをするためにYAMLファイルを生成することもできるようです。--dry-run=client -o yamlを指定してあげれば良いようです。

Deploymentの場合、以下の結果となりました。

miyohide [ ~ ]$ kubectl create deployment nginx --image=nginx --dry-run=client -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}
miyohide [ ~ ]$ 

Serviceの場合は以下の結果となりました。

miyohide [ ~ ]$ kubectl create service loadbalancer nginx --tcp=80:80 --dry-run=client -o yaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  ports:
  - name: 80-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
status:
  loadBalancer: {}
miyohide [ ~ ]$