kubernetes学习之创建k8s应用
kubernetes创建资源的方式有两种:
1、用kubectl命令直接创建,在命令行中通过参数指定资源的属性。此方式简单直观,比较适合临时测试或实验使用
kubectl run nginx-test --image=nginx
[root@localhost opt]# kubectl run -h Create and run a particular image in a pod. Examples: # Start a nginx pod. kubectl run nginx --image=nginx # Start a hazelcast pod and let the container expose port 5701. kubectl run hazelcast --image=hazelcast/hazelcast --port=5701 # Start a hazelcast pod and set environment variables "DNS_DOMAIN=cluster" and "POD_NAMESPACE=default" in the container. kubectl run hazelcast --image=hazelcast/hazelcast --env="DNS_DOMAIN=cluster" --env="POD_NAMESPACE=default" # Start a hazelcast pod and set labels "app=hazelcast" and "env=prod" in the container. kubectl run hazelcast --image=hazelcast/hazelcast --labels="app=hazelcast,env=prod" # Dry run. Print the corresponding API objects without creating them. kubectl run nginx --image=nginx --dry-run=client # Start a nginx pod, but overload the spec with a partial set of values parsed from JSON. kubectl run nginx --image=nginx --overrides='{ "apiVersion": "v1", "spec": { ... } }' # Start a busybox pod and keep it in the foreground, don't restart it if it exits. kubectl run -i -t busybox --image=busybox --restart=Never # Start the nginx pod using the default command, but use custom arguments (arg1 .. argN) for that command. kubectl run nginx --image=nginx -- <arg1> <arg2> ... <argN> # Start the nginx pod using a different command and custom arguments. kubectl run nginx --image=nginx --command -- <cmd> <arg1> ... <argN> 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. --attach=false: If true, wait for the Pod to start running, and then attach to the Pod as if 'kubectl attach ...' were called. Default false, unless '-i/--stdin' is set, in which case the default is true. With '--restart=Never' the exit code of the container process is returned. --cascade=true: If true, cascade the deletion of the resources managed by this resource (e.g. Pods created by a ReplicationController). Default true. --command=false: If true and extra arguments are present, use them as the 'command' field in the container, rather than the 'args' field which is the default. --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. --env=[]: Environment variables to set in the container. --expose=false: If true, service is created for the container(s) which are run -f, --filename=[]: to use to replace the resource. --force=false: If true, immediately remove resources from API and bypass graceful deletion. Note that immediate deletion of some resources may result in inconsistency or data loss and requires confirmation. --grace-period=-1: Period of time in seconds given to the resource to terminate gracefully. Ignored if negative. Set to 1 for immediate shutdown. Can only be set to 0 when --force is true (force deletion). --hostport=-1: The host port mapping for the container port. To demonstrate a single-machine container. --image='': The image for the container to run. --image-pull-policy='': The image pull policy for the container. If left empty, this value will not be specified by the client and defaulted by the server -k, --kustomize='': Process a kustomization directory. This flag can't be used together with -f or -R. -l, --labels='': Comma separated labels to apply to the pod(s). Will override previous values. --leave-stdin-open=false: If the pod is started in interactive mode or with stdin, leave stdin open after the first attach completes. By default, stdin will be closed after the first attach completes. --limits='': The resource requirement limits for this container. For example, 'cpu=200m,memory=512Mi'. Note that server side components may assign limits depending on the server configuration, such as limit ranges. -o, --output='': Output format. One of: json|yaml|name|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-file. --overrides='': An inline JSON override for the generated object. If this is non-empty, it is used to override the generated object. Requires that the object supply a valid apiVersion field. --pod-running-timeout=1m0s: The length of time (like 5s, 2m, or 3h, higher than zero) to wait until at least one pod is running --port='': The port that this container exposes. --quiet=false: If true, suppress prompt messages. --record=false: Record current kubectl command in the resource annotation. If set to false, do not record the command. If set to true, record the command. If not set, default to updating the existing annotation value only if one already exists. -R, --recursive=false: Process the directory used in -f, --filename recursively. Useful when you want to manage related manifests organized within the same directory. --requests='': The resource requirement requests for this container. For example, 'cpu=100m,memory=256Mi'. Note that server side components may assign requests depending on the server configuration, such as limit ranges. --restart='Always': The restart policy for this Pod. Legal values [Always, OnFailure, Never]. If set to 'Always' a deployment is created, if set to 'OnFailure' a job is created, if set to 'Never', a regular pod is created. For the latter two --replicas must be 1. Default 'Always', for CronJobs `Never`. --rm=false: If true, delete resources created in this command for attached containers. --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. --serviceaccount='': Service account to set in the pod spec. -i, --stdin=false: Keep stdin open on the container(s) in the pod, even if nothing is attached. --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]. --timeout=0s: The length of time to wait before giving up on a delete, zero means determine a timeout from the size of the object -t, --tty=false: Allocated a TTY for each container in the pod. --wait=false: If true, wait for resources to be gone before returning. This waits for finalizers. Usage: kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dry-run=server|client] [--overrides=inline-json] [--command] -- [COMMAND] [args...] [options] Use "kubectl options" for a list of global command-line options (applies to all commands).
2、通过配置文件和kubectl create创建。在配置文件中描述了应用的信息和需要达到的预期状态。
kubectl create -f nginx-deployment.yaml
一、用命令kubectl run创建应用
创建nginx应用 [root@localhost opt]# kubectl run nginx-deploy --image=nginx:1.14 --port=80 pod/nginx-deploy created
#查看pod的状态信息,此时是API Server从etcd中读取这些数据 [root@master opt]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deploy 1/1 Running 0 24m 10.244.0.4 master <none> <none>
通过kubectl describe pod pod-name查看pod详细信息
[root@master opt]# kubectl describe pod nginx-deploy Name: nginx-deploy Namespace: default Priority: 0 Node: master/192.168.149.144 Start Time: Wed, 26 Aug 2020 01:50:23 -0700 Labels: run=nginx-deploy Annotations: <none> Status: Running IP: 10.244.0.4 IPs: IP: 10.244.0.4 Containers: nginx-deploy: Container ID: docker://edc1219ad4d28eae49293602b5584e4fe05583d257210fe0c83a778c8f82e073 Image: nginx:1.14 Image ID: docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d Port: 80/TCP Host Port: 0/TCP State: Running Started: Wed, 26 Aug 2020 01:50:24 -0700 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-qlztc (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: default-token-qlztc: Type: Secret (a volume populated by a Secret) SecretName: default-token-qlztc Optional: false QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s node.kubernetes.io/unreachable:NoExecute for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 24m (x4 over 27m) default-scheduler 0/1 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate. Normal Scheduled 23m default-scheduler Successfully assigned default/nginx-deploy to master Normal Pulled 23m kubelet, master Container image "nginx:1.14" already present on machine Normal Created 23m kubelet, master Created container nginx-deploy Normal Started 23m kubelet, master Started container nginx-deploy
二、以YML方式创建
1、创建文件
apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: nginx name: nginx spec: replicas: 2 selector: matchLabels: app: nginx strategy: {} template: metadata: creationTimestamp: null labels: app: nginx spec: containers: - image: nginx:1.14 name: nginx resources: {} status: {}
2、通过kubectl create 创建
[root@master opt]# kubectl create -f my.deploy.yaml deployment.apps/nginx created
3、查看deployment
[root@master opt]# kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE nginx 2/2 2 2 24s #查看deployment详情 [root@master opt]# kubectl describe deployment nginx Name: nginx Namespace: default CreationTimestamp: Wed, 26 Aug 2020 02:21:58 -0700 Labels: app=nginx Annotations: deployment.kubernetes.io/revision: 1 Selector: app=nginx Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=nginx Containers: nginx: Image: nginx:1.14 Port: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: <none> NewReplicaSet: nginx-7b76bcc675 (2/2 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 2m deployment-controller Scaled up replica set nginx-7b76bcc675 to 2
4、更新deployment升级nginx版本
#更新前查看 [root@master opt]# kubectl get deployment nginx -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR nginx 2/2 2 2 4m11s nginx nginx:1.14 app=nginx #升级 [root@master opt]# kubectl set image deployment/nginx nginx=nginx:1.15 --record deployment.apps/nginx image updated #升级后查看 [root@master opt]# kubectl get deployment nginx -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR nginx 2/2 2 2 5m58s nginx nginx:1.15 app=nginx #查看更新历史 [root@master opt]# kubectl rollout history deployment/nginx deployment.apps/nginx REVISION CHANGE-CAUSE 1 <none> 2 kubectl set image deployment/nginx nginx=nginx:1.15 --record=true #查看某一个版本升级历史 [root@master opt]# kubectl rollout history deployment/nginx --revision=1 deployment.apps/nginx with revision #1 Pod Template: Labels: app=nginx pod-template-hash=7b76bcc675 Containers: nginx: Image: nginx:1.14 Port: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none>
5、快速回滚到上一个版本
[root@master opt]# kubectl rollout undo deployment/nginx deployment.apps/nginx rolled back #查看是否回滚成功 [root@master opt]# kubectl get deployment nginx -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR nginx 2/2 2 2 12m nginx nginx:1.14 app=nginx
6、扩容副本数
[root@master opt]# kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE nginx 2/2 2 2 15m [root@master opt]# kubectl scale deployment nginx --replicas 5 deployment.apps/nginx scaled [root@master opt]# kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE nginx 5/5 5 5 15m [root@master opt]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-7b76bcc675-4dxfc 1/1 Running 0 4m47s nginx-7b76bcc675-c4wlr 1/1 Running 0 58s nginx-7b76bcc675-dlrsp 1/1 Running 0 58s nginx-7b76bcc675-pnlqx 1/1 Running 0 4m46s nginx-7b76bcc675-xr4f7 1/1 Running 0 58s