はじめに
先日からAzure Kubernetes Serviceを検証しています。まだまだKubernetesがあまりよくわかっていないのですが、一個ずつ学べていけたらと。
過去のものは以下。
YAMLファイルを書くのが面倒だと言っていたら、同僚から「簡単なものならkubectlコマンドでデプロイするのが一般的ですよ」と言われたのでちょっとやってみました。
コマンドの調査
コマンドを調査してみると以下のページがヒットしました。
ここに、以下のコマンドがあるのでこれを実行してみます。
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 [ ~ ]$