K8S基本命令操作

kubectl 是一个命令行接口,用于对 Kubernetes 集群运行命令。kubectl 在 $HOME/.kube 目录中寻找一个名为 config 的文件。您可以通过设置环境变量 KUBECONFIG 或设置 --kubeconfig 参数指定其它 kubeconfig 文件。

kubectl官方使用文档:https://kubernetes.io/docs/reference/kubectl/overview/

一. 使用 kubectl 操作集群

1.1 语法

kubectl [command] [TYPE] [NAME] [flags]
  • command:指定要对一个或多个资源执行的操作,例如 create、get、describe、delete;
  • TYPE:指定资源类型。资源类型不区分大小写,可以指定单数、复数或缩写形式。例如,以下命令输出相同的结果:
kubectl get pod pod1
kubectl get pods pod1
kubectl get po pod1
  • NAME:指定资源的名称。名称区分大小写。如果省略名称,则显示所有资源的详细信息kubectl get pods
  • flags: 指定可选的参数。例如,可以使用 -s-server 参数指定 Kubernetes API 服务器的地址和端口。

注意:从命令行指定的参数会覆盖默认值和任何相应的环境变量。

  • 在对多个资源执行操作时,您可以按类型和名称指定每个资源,或指定一个或多个文件:
    • 要按类型和名称指定资源:
      • 要对所有类型相同的资源进行分组,请执行以下操作:TYPE1 name1 name2 name<#>例子:kubectl get pod example-pod1 example-pod2
      • 分别指定多个资源类型:TYPE1/name1 TYPE1/name2 TYPE2/name3 TYPE<#>/name<#>例子:kubectl get pod/example-pod1 replicationcontroller/example-rc1
    • 用一个或多个文件指定资源:-f file1 -f file2 -f file<#>
      • 使用 YAML 而不是 JSON 因为 YAML 更容易使用,特别是用于配置文件时。例子:kubectl get pod -f ./pod.yaml

1.2 查看命令帮助

[root@k8s-master ~]# kubectl -h
kubectl controls the Kubernetes cluster manager.

 Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/

##基本命令集,适合新手
Basic Commands (Beginner):  
  create         Create a resource from a file or from stdin.
  expose         使用 replication controller, service, deployment 或者 pod 并暴露它作为一个 新的
Kubernetes Service
  run            在集群中运行一个指定的镜像
  set            为 objects 设置一个指定的特征

##基本命令集,适合有一定基础的人
Basic Commands (Intermediate):
  explain        查看资源的文档
  get            显示一个或更多 resources
  edit           在服务器上编辑一个资源
  delete         Delete resources by filenames, stdin, resources and names, or by resources and label selector

##部署相关命令
Deploy Commands:
  rollout        Manage the rollout of a resource
  scale          Set a new size for a Deployment, ReplicaSet or Replication Controller
  autoscale      自动调整一个 Deployment, ReplicaSet, 或者 ReplicationController 的副本数量

## 集群管理者命令集
Cluster Management Commands:
  certificate    修改 certificate 资源.
  cluster-info   显示集群信息
  top            Display Resource (CPU/Memory/Storage) usage.
  cordon         标记 node 为 unschedulable
  uncordon       标记 node 为 schedulable
  drain          Drain node in preparation for maintenance
  taint          更新一个或者多个 node 上的 taints

##故障检测及调试相关命令集
Troubleshooting and Debugging Commands:
  describe       显示一个指定 resource 或者 group 的 resources 详情
  logs           输出容器在 pod 中的日志
  attach         Attach 到一个运行中的 container
  exec           在一个 container 中执行一个命令
  port-forward   Forward one or more local ports to a pod
  proxy          运行一个 proxy 到 Kubernetes API server
  cp             复制 files 和 directories 到 containers 和从容器中复制 files 和 directories.
  auth           Inspect authorization

##高级命令集
Advanced Commands:
  diff           Diff live version against would-be applied version
  apply          通过文件名或标准输入流(stdin)对资源进行配置
  patch          使用 strategic merge patch 更新一个资源的 field(s)
  replace        通过 filename 或者 stdin替换一个资源
  wait           Experimental: Wait for a specific condition on one or many resources.
  convert        在不同的 API versions 转换配置文件
  kustomize      Build a kustomization target from a directory or a remote url.

##设置相关命令集
Settings Commands:
  label          更新在这个资源上的 labels
  annotate       更新一个资源的注解
  completion     Output shell completion code for the specified shell (bash or zsh)

##其他命令集
Other Commands:
  api-resources  Print the supported API resources on the server
  api-versions   Print the supported API versions on the server, in the form of "group/version"
  config         修改 kubeconfig 文件
  plugin         Provides utilities for interacting with plugins.
  version        输出 client 和 server 的版本信息

Usage:
  kubectl [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).

1.3 常用操作解释

  • annotate : 添加或更新一个或多个资源的注解。
kubectl annotate (-f FILENAME | TYPE NAME | TYPE/NAME) KEY_1=VAL_1 … KEY_N=VAL_N [–overwrite] [–all] [–resource-version=version] [flags]
  • api-versions: 列出可用的 API 版本。
kubectl api-versions [flags]
  • apply:从文件或 stdin 对资源应用配置更改。
kubectl apply -f FILENAME [flags]
  • attach:附加到正在运行的容器,查看输出流或与容器(stdin)交互。
kubectl attach POD -c CONTAINER [-i] [-t] [flags]
  • autoscale:自动伸缩由副本控制器管理的一组 pod。
kubectl autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [–min=MINPODS] –max=MAXPODS [–cpu-percent=CPU] [flags]
  • cluster-info:显示有关集群中主服务器和服务的端口信息。
kubectl cluster-info [flags]
  • config:修改 kubeconfig 文件。有关详细信息,请参阅各个子命令。
kubectl config SUBCOMMAND [flags]
  • create:从文件或 stdin 创建一个或多个资源。
kubectl create -f FILENAME [flags]
  • delete:从文件、标准输入或指定标签选择器、名称、资源选择器或资源中删除资源。
kubectl delete (-f FILENAME | TYPE [NAME | /NAME | -l label | –all]) [flags]
  • describe:显示一个或多个资源的详细状态。
kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | /NAME | -l label]) [flags]
  • diff:将 live 配置和文件或标准输入做对比 (BETA)
kubectl diff -f FILENAME [flags]
  • edit:使用默认编辑器编辑和更新服务器上一个或多个资源的定义。
kubectl edit (-f FILENAME | TYPE NAME | TYPE/NAME) [flags]
  • exec:对 pod 中的容器执行命令。
kubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [-- COMMAND [args...]]
  • explain:获取多种资源的文档。例如 pod, node, service 等。
kubectl explain [--recursive=false] [flags]
  • expose:将副本控制器、服务或 pod 作为新的 Kubernetes 服务暴露。
kubectl expose (-f FILENAME | TYPE NAME | TYPE/NAME) [–port=port] [–protocol=TCP|UDP] [–target-port=number-or-name] [–name=name] [–external-ip=external-ip-of-service] [–type=type] [flags]
  • get:列出一个或多个资源。
kubectl get (-f FILENAME | TYPE [NAME | /NAME | -l label]) [–watch] [–sort-by=FIELD] [[-o | –output]=OUTPUT_FORMAT] [flags]
  • label:添加或更新一个或多个资源的标签。
kubectl label (-f FILENAME | TYPE NAME | TYPE/NAME) KEY_1=VAL_1 … KEY_N=VAL_N [–overwrite] [–all] [–resource-version=version] [flags]
  • logs:在 pod 中打印容器的日志。
kubectl logs POD [-c CONTAINER] [--follow] [flags]
  • patch:使用策略合并 patch 程序更新资源的一个或多个字段。
kubectl patch (-f FILENAME | TYPE NAME | TYPE/NAME) –patch PATCH [flags]
  • port-forward:将一个或多个本地端口转发到一个 pod。
kubectl port-forward POD [LOCAL_PORT:]REMOTE_PORT [...[LOCAL_PORT_N:]REMOTE_PORT_N] [flags]
  • proxy:运行 Kubernetes API 服务器的代理。
kubectl proxy [--port=PORT] [--www=static-dir] [--www-prefix=prefix] [--api-prefix=prefix] [flags]
  • replace:从文件或标准输入中替换资源。
kubectl replace -f FILENAME
  • rolling-update:通过逐步替换指定的副本控制器及其 pod 来执行滚动更新。
kubectl rolling-update OLD_CONTROLLER_NAME ([NEW_CONTROLLER_NAME] –image=NEW_CONTAINER_IMAGE | -f NEW_CONTROLLER_SPEC) [flags]
  • run:在集群上运行指定的镜像。
kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [flags]
  • scale:更新指定副本控制器的大小。
kubectl scale (-f FILENAME | TYPE NAME | TYPE/NAME) –replicas=COUNT [–resource-version=version] [–current-replicas=count] [flags]
  • stop:不推荐:相反,请参阅 kubectl delete。
kubectl stop
  • version:显示运行在客户端和服务器上的 Kubernetes 版本。
kubectl version [--client] [flags]

1.4 资源类型

通过 kubectl api-resources 获取资源类型

[root@k8s-master ~]# kubectl api-resources
NAME                              SHORTNAMES   APIGROUP                       NAMESPACED   KIND
bindings                                                                      true         Binding
componentstatuses                 cs                                          false        ComponentStatus
configmaps                        cm                                          true         ConfigMap
endpoints                         ep                                          true         Endpoints
events                            ev                                          true         Event
limitranges                       limits                                      true         LimitRange
namespaces                        ns                                          false        Namespace
nodes                             no                                          false        Node
persistentvolumeclaims            pvc                                         true         PersistentVolumeClaim
persistentvolumes                 pv                                          false        PersistentVolume
pods                              po                                          true         Pod
podtemplates                                                                  true         PodTemplate
replicationcontrollers            rc                                          true         ReplicationController
resourcequotas                    quota                                       true         ResourceQuota
secrets                                                                       true         Secret
serviceaccounts                   sa                                          true         ServiceAccount
services                          svc                                         true         Service
mutatingwebhookconfigurations                  admissionregistration.k8s.io   false        MutatingWebhookConfiguration
validatingwebhookconfigurations                admissionregistration.k8s.io   false        ValidatingWebhookConfiguration
customresourcedefinitions         crd,crds     apiextensions.k8s.io           false        CustomResourceDefinition
apiservices                                    apiregistration.k8s.io         false        APIService
controllerrevisions                            apps                           true         ControllerRevision
daemonsets                        ds           apps                           true         DaemonSet
deployments                       deploy       apps                           true         Deployment
replicasets                       rs           apps                           true         ReplicaSet
statefulsets                      sts          apps                           true         StatefulSet
tokenreviews                                   authentication.k8s.io          false        TokenReview
localsubjectaccessreviews                      authorization.k8s.io           true         LocalSubjectAccessReview
selfsubjectaccessreviews                       authorization.k8s.io           false        SelfSubjectAccessReview
selfsubjectrulesreviews                        authorization.k8s.io           false        SelfSubjectRulesReview
subjectaccessreviews                           authorization.k8s.io           false        SubjectAccessReview
horizontalpodautoscalers          hpa          autoscaling                    true         HorizontalPodAutoscaler
cronjobs                          cj           batch                          true         CronJob
jobs                                           batch                          true         Job
certificatesigningrequests        csr          certificates.k8s.io            false        CertificateSigningRequest
leases                                         coordination.k8s.io            true         Lease
endpointslices                                 discovery.k8s.io               true         EndpointSlice
events                            ev           events.k8s.io                  true         Event
ingresses                         ing          extensions                     true         Ingress
ingresses                         ing          networking.k8s.io              true         Ingress
networkpolicies                   netpol       networking.k8s.io              true         NetworkPolicy
runtimeclasses                                 node.k8s.io                    false        RuntimeClass
poddisruptionbudgets              pdb          policy                         true         PodDisruptionBudget
podsecuritypolicies               psp          policy                         false        PodSecurityPolicy
clusterrolebindings                            rbac.authorization.k8s.io      false        ClusterRoleBinding
clusterroles                                   rbac.authorization.k8s.io      false        ClusterRole
rolebindings                                   rbac.authorization.k8s.io      true         RoleBinding
roles                                          rbac.authorization.k8s.io      true         Role
priorityclasses                   pc           scheduling.k8s.io              false        PriorityClass
csidrivers                                     storage.k8s.io                 false        CSIDriver
csinodes                                       storage.k8s.io                 false        CSINode
storageclasses                    sc           storage.k8s.io                 false        StorageClass
volumeattachments                              storage.k8s.io                 false        VolumeAttachment

1.5 格式化输出

所有 kubectl 命令的默认输出格式都是人类可读的纯文本格式。要以特定格式向终端窗口输出详细信息,可以将 -o--output 参数添加到受支持的 kubectl 命令中。

kubectl [command] [TYPE] [NAME] -o=<output_format>

根据 kubectl 操作,支持以下输出格式:

Output format Description
-o custom-columns= 使用逗号分隔的自定义列列表打印表。
-o custom-columns-file= 使用 文件中的自定义列模板打印表。
-o json 输出 JSON 格式的 API 对象
-o jsonpath= 打印 jsonpath 表达式定义的字段
-o jsonpath-file= 打印 文件中 jsonpath 表达式定义的字段。
-o name 仅打印资源名称而不打印任何其他内容。
-o wide 以纯文本格式输出,包含任何附加信息。对于 pod 包含节点名。
-o yaml 输出 YAML 格式的 API 对象。

示例:

##在此示例中,以下命令将单个 pod 的详细信息输出为 YAML 格式的对象:
kubectl get pod web-pod-13je7 -o yaml

##自定义输出列
[root@k8s-master ~]# kubectl get pods curl-69c656fd45-26jv2 -o custom-columns=NAME:.metadata.name,RSRC:.metadata.resourceVersion
NAME                    RSRC
curl-69c656fd45-26jv2   1175127

## 自定义输出列,使用模板文件定义列
[root@k8s-master ~]# cat template.txt 
NAME          RSRC
metadata.name metadata.resourceVersion

[root@k8s-master ~]# kubectl get pods curl-69c656fd45-26jv2 -o custom-columns-file=template.txt
NAME                    RSRC
curl-69c656fd45-26jv2   1175127

##通过使用 --sort-by 参数指定任何数字或字符串字段来对对象进行排序
[root@k8s-master ~]# kubectl get pods --sort-by=.metadata.name
NAME                                     READY   STATUS    RESTARTS   AGE
curl-69c656fd45-26jv2                    1/1     Running   12         32d
debug-agent-d7jwj                        1/1     Running   0          6h4m
debug-agent-kl9np                        1/1     Running   0          6h4m
debug-agent-v598k                        1/1     Running   0          6h4m
my-service-gb45b                         1/1     Running   7          12d
my-service-sxz97                         1/1     Running   7          12d
nfs-client-provisioner-c7b986bf7-hgs7h   1/1     Running   6          9d
nginx-86c57db685-hdwr8                   1/1     Running   11         32d
secret-pod3                              1/1     Running   6          10d

1.6 常用操作示例

kubectl apply - 以文件或标准输入为准应用或更新资源。
## 使用 example-service.yaml 中的定义创建服务。
kubectl apply -f example-service.yaml

## 使用 example-controller.yaml 中的定义创建 replication controller。
kubectl apply -f example-controller.yaml

## 使用 <directory> 路径下的任意 .yaml, .yml, 或 .json 文件 创建对象。
kubectl apply -f <directory>
kubectl get - 列出一个或多个资源。
## 以纯文本输出格式列出所有 pod。
kubectl get pods

## 以纯文本输出格式列出所有 pod,并包含附加信息(如节点名)。
kubectl get pods -o wide

## 以纯文本输出格式列出具有指定名称的副本控制器。提示:您可以使用别名 'rc' 缩短和替换 'replicationcontroller' 资源类型。
kubectl get replicationcontroller <rc-name>

## 以纯文本输出格式列出所有副本控制器和服务。
kubectl get rc,services

## 以纯文本输出格式列出所有守护程序集,包括未初始化的守护程序集。
kubectl get ds --include-uninitialized

## 列出在节点 server01 上运行的所有 pod
kubectl get pods --field-selector=spec.nodeName=server01
kubectl describe - 显示一个或多个资源的详细状态,默认情况下包括未初始化的资源。
## 显示名称为 <node-name> 的节点的详细信息。
kubectl describe nodes <node-name>

## 显示名为 <pod-name> 的 pod 的详细信息。
kubectl describe pods/<pod-name>

## 显示由名为 <rc-name> 的副本控制器管理的所有 pod 的详细信息。
## 记住:副本控制器创建的任何 pod 都以复制控制器的名称为前缀。
kubectl describe pods <rc-name>

## 描述所有的 pod,不包括未初始化的 pod
kubectl describe pods --include-uninitialized=false

注意:kubectl get 命令通常用于检索同一资源类型的一个或多个资源。 它具有丰富的参数,允许您使用 -o 或 –output 参数自定义输出格式。您可以指定 -w 或 –watch 参数以开始观察特定对象的更新。 kubectl describe 命令更侧重于描述指定资源的许多相关方面。它可以调用对 API 服务器 的多个 API 调用来为用户构建视图。 例如,该 kubectl describe node 命令不仅检索有关节点的信息,还检索在其上运行的 pod 的摘要,为节点生成的事件等。

kubectl delete - 从文件、stdin 或指定标签选择器、名称、资源选择器或资源中删除资源。
## 使用 pod.yaml 文件中指定的类型和名称删除 pod。
kubectl delete -f pod.yaml

## 删除标签名= <label-name> 的所有 pod 和服务。
kubectl delete pods,services -l name=<label-name>

## 删除所有具有标签名称= <label-name> 的 pod 和服务,包括未初始化的那些。
kubectl delete pods,services -l name=<label-name> --include-uninitialized

## 删除所有 pod,包括未初始化的 pod。
kubectl delete pods --all
kubectl exec - 对 pod 中的容器执行命令。
## 从 pod <pod-name> 中获取运行 'date' 的输出。默认情况下,输出来自第一个容器。
kubectl exec <pod-name> date
  
## 运行输出 'date' 获取在容器的 <container-name> 中 pod <pod-name> 的输出。
kubectl exec <pod-name> -c <container-name> date

## 获取一个交互 TTY 并运行 /bin/bash <pod-name >。默认情况下,输出来自第一个容器。
kubectl exec -ti <pod-name> /bin/bash
kubectl logs - 打印 Pod 中容器的日志。
## 从 pod 返回日志快照。
kubectl logs <pod-name>

## 从 pod <pod-name> 开始流式传输日志。这类似于 'tail -f' Linux 命令。
kubectl logs -f <pod-name>

官方kubectl参考:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

二. 调试工具利器 kubectl-debug

kubectl-debug 是一个简单的 kubectl 插件, 能够帮助你便捷地进行 Kubernetes 上的 Pod 排障诊断. 背后做的事情很简单: 在运行中的 Pod 上额外起一个新容器, 并将新容器加入到目标容器的 pid, network, user 以及 ipc namespace 中, 这时我们就可以在新容器中直接用 netstat, tcpdump 这些熟悉的工具来解决问题了, 而旧容器可以保持最小化, 不需要预装任何额外的排障工具。

kubectl-debug 包含两部分, 一部分是用户侧的 kubectl 插件, 另一部分是部署在所有 k8s 节点上的 agent(用于启动"新容器", 同时也作为 SPDY 连接的中继). 在 agentless 中, kubectl-debug 会在 debug 开始时创建 debug-agent Pod, 并在结束后自动清理.(默认开启agentless模式)

步骤分别是:

  • 插件查询 ApiServer:demo-pod 是否存在,所在节点是什么
  • ApiServer 返回 demo-pod 所在所在节点
  • 插件请求在目标节点上创建 Debug Agent Pod
  • Kubelet 创建 Debug Agent Pod
  • 插件发现 Debug Agent 已经 Ready,发起 debug 请求(长连接)
  • Debug Agent 收到 debug 请求,创建 Debug 容器并加入目标容器的各个 Namespace 中,创建完成后,与 Debug 容器的 tty 建立连接
  • 接下来,客户端就可以开始通过 5,6 这两个连接开始 debug 操作。操作结束后,Debug Agent 清理 Debug 容器,插件清理 Debug Agent,一次 Debug 完成。

2.1 安装

1. 安装 kubectl debug 插件

# export PLUGIN_VERSION=0.1.1
# linux x86_64
# curl -Lo kubectl-debug.tar.gz \
#> https://github.com/aylei/kubectl-debug/releases/download/v${PLUGIN_VERSION}/kubectl-debug_${PLUGIN_VERSION}_linux_amd64.tar.gz

# tar -zxvf kubectl-debug.tar.gz kubectl-debug
# sudo mv kubectl-debug /usr/local/bin/

2. 安装 debug-agent DaemonSet

## 如果你的kubernetes版本为v1.16或更高
# kubectl apply -f \
#> https://raw.githubusercontent.com/aylei/kubectl-debug/master/scripts/agent_daemonset.yml

# 使用daemonset agent模式(关闭agentless模式)
kubectl debug --agentless=false POD_NAME

2.2 基本使用

##查询有哪些Pod
[root@k8s-master ~]# kubectl get pods 
NAME                                     READY   STATUS    RESTARTS   AGE
curl-69c656fd45-26jv2                    1/1     Running   12         32d
debug-agent-d7jwj                        1/1     Running   0          3h7m
debug-agent-kl9np                        1/1     Running   0          3h7m
debug-agent-v598k                        1/1     Running   0          3h7m
my-service-gb45b                         1/1     Running   7          12d
my-service-sxz97                         1/1     Running   7          12d
nfs-client-provisioner-c7b986bf7-hgs7h   1/1     Running   6          9d
nginx-86c57db685-hdwr8                   1/1     Running   11         32d
secret-pod3                              1/1     Running   6          9d

##开始调试目标Pod nginx-86c57db685-hdwr8
[root@k8s-master ~]# kubectl debug  nginx-86c57db685-hdwr8
pulling image nicolaka/netshoot:latest... 
latest: Pulling from nicolaka/netshoot
Digest: sha256:99d15e34efe1e3c791b0898e05be676084638811b1403fae59120da4109368d4
Status: Image is up to date for nicolaka/netshoot:latest
starting debug container...
container created, open tty...

## 使用工具进行调试
bash-5.0# netstat -antp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1/nginx: master pro
bash-5.0# ip addr show 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
3: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default 
    link/ether b6:5e:e6:da:0a:2e brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.244.2.80/24 scope global eth0
       valid_lft forever preferred_lft forever
bash-5.0# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=127 time=51.3 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=127 time=60.5 ms
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 51.297/55.906/60.516/4.609 ms
bash-5.0# ps aux
PID   USER     TIME  COMMAND
    1 root      0:00 nginx: master process nginx -g daemon off;
    6 101       0:00 nginx: worker process
   16 root      0:00 bash
   24 root      0:00 ps aux

## 退出调试
bash-5.0# exit
exit

项目地址:https://github.com/aylei/kubectl-debug/blob/master/docs/zh-cn.md

三. 操作案例

3.1 创建一个应用程序

使用kubectl run命令,可以通过kubectl run -h查看命令使用帮助,命令说明告诉我们这个命令可以创建一个deployment或者job的容器。

##--dry-run=true:表示测试,不真正执行命令
[root@k8s-master ~]# kubectl run nginx-deploy  --image=nginx:1.16 --port=80 --replicas=2 --dry-run=true
pod/nginx-deploy created (dry run)

##真正开始创建(不建议)
[root@k8s-master ~]# kubectl run nginx-deploy --image=nginx:1.16 --port=80 --replicas=2
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx-deploy created
#创建deployment
[root@k8s-master ~]# kubectl create deployment nginx --image=nginx:1.17.1 --port=80 --replicas=3 

##查看创建的deployment
[root@k8s-master ~]# kubectl get deployment 
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
curl                     1/1     1            1           33d
nfs-client-provisioner   1/1     1            1           9d
nginx                    1/1     1            1           32d
nginx-deploy             2/2     2            2           61s

##查看其生成的pod
[root@k8s-master ~]# kubectl get pod -o wide
NAME                                     READY   STATUS    RESTARTS   AGE    IP            NODE         NOMINATED NODE   READINESS GATES
curl-69c656fd45-26jv2                    1/1     Running   12         33d    10.244.1.76   k8s-node1    <none>           <none>
debug-agent-d7jwj                        1/1     Running   0          9h     10.244.1.80   k8s-node1    <none>           <none>
debug-agent-kl9np                        1/1     Running   0          9h     10.244.2.82   k8s-node2    <none>           <none>
debug-agent-v598k                        1/1     Running   0          9h     10.244.0.28   k8s-master   <none>           <none>
my-service-gb45b                         1/1     Running   7          12d    10.244.1.79   k8s-node1    <none>           <none>
my-service-sxz97                         1/1     Running   7          12d    10.244.2.77   k8s-node2    <none>           <none>
nfs-client-provisioner-c7b986bf7-hgs7h   1/1     Running   6          9d     10.244.2.76   k8s-node2    <none>           <none>
nginx-86c57db685-hdwr8                   1/1     Running   11         32d    10.244.2.80   k8s-node2    <none>           <none>
nginx-deploy-5779bd8444-299sg            1/1     Running   0          118s   10.244.1.84   k8s-node1    <none>           <none>
nginx-deploy-5779bd8444-7k7pd            1/1     Running   0          118s   10.244.2.83   k8s-node2    <none>           <none>
secret-pod3                              1/1     Running   6          10d    10.244.2.78   k8s-node2    <none>           <none>

3.2 访问一下具体Pod地址

##可以成功看到默认界面,没有问题
[root@k8s-master ~]# curl http://10.244.2.83
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

集群外部访问:

3.3 如何让集群外部可以访问呢?

这需要创建service,然后暴露端口

##创建service,它的端口为8100,对应Pod的端口80,并使用NodePort方式暴露到集群外部
[root@k8s-master ~]# kubectl expose deployment nginx-deploy  --name=nginx   --port=8100 --target-port=80 --type=NodePort
service/nginx exposed

##查看创建的service,可以看到暴露到集群外的端口为32402
[root@k8s-master ~]# kubectl get svc 
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.1.0.1      <none>        443/TCP          33d
my-service   ClusterIP   10.1.251.21   <none>        80/TCP           12d
nginx        NodePort    10.1.92.244   <none>        8100:32402/TCP   32s

在集群外部进行访问:

3.4 扩容及缩减Pod数量

##扩容前先查看
[root@k8s-master ~]# kubectl get deployment nginx-deploy
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   2/2     2            2           28m

##扩容到5个副本
[root@k8s-master ~]# kubectl scale --replicas=5 deployment nginx-deploy
deployment.apps/nginx-deploy scaled
[root@k8s-master ~]# kubectl get deployment nginx-deploy
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   5/5     5            5           30m

##缩减到3个副本
[root@k8s-master ~]# kubectl scale --replicas=3 deployment nginx-deploy
deployment.apps/nginx-deploy scaled
[root@k8s-master ~]# kubectl get deployment nginx-deploy
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   3/3     3            3           32m

3.5 滚动升级

##升级镜像版本到nginx:1.17
[root@k8s-master ~]# kubectl set image deployment nginx-deploy nginx-deploy=nginx:1.17 --record
deployment.apps/nginx-deploy image updated

##观察滚动升级情况
[root@k8s-master ~]# kubectl get pod --watch
NAME                                     READY   STATUS              RESTARTS   AGE
curl-69c656fd45-26jv2                    1/1     Running             12         33d
debug-agent-d7jwj                        1/1     Running             0          10h
debug-agent-kl9np                        1/1     Running             0          10h
debug-agent-v598k                        1/1     Running             0          10h
my-service-gb45b                         1/1     Running             7          12d
my-service-sxz97                         1/1     Running             7          12d
nfs-client-provisioner-c7b986bf7-hgs7h   1/1     Running             6          9d
nginx-86c57db685-hdwr8                   1/1     Running             11         33d
nginx-deploy-5779bd8444-299sg            1/1     Running             0          36m
nginx-deploy-5779bd8444-7k7pd            1/1     Running             0          36m
nginx-deploy-5779bd8444-ljmb2            1/1     Running             0          6m14s
nginx-deploy-7f6b545f87-xfnhx            0/1     ContainerCreating   0          10s
secret-pod3                              1/1     Running             6          10d
nginx-deploy-7f6b545f87-xfnhx            1/1     Running             0          11s
nginx-deploy-5779bd8444-ljmb2            1/1     Terminating         0          6m15s
nginx-deploy-7f6b545f87-xbnwk            0/1     Pending             0          0s
nginx-deploy-7f6b545f87-xbnwk            0/1     Pending             0          0s
nginx-deploy-7f6b545f87-xbnwk            0/1     ContainerCreating   0          0s
nginx-deploy-5779bd8444-ljmb2            0/1     Terminating         0          6m16s
nginx-deploy-5779bd8444-ljmb2            0/1     Terminating         0          6m17s
nginx-deploy-5779bd8444-ljmb2            0/1     Terminating         0          6m17s
nginx-deploy-5779bd8444-ljmb2            0/1     Terminating         0          6m17s
nginx-deploy-7f6b545f87-xbnwk            1/1     Running             0          4s
nginx-deploy-5779bd8444-7k7pd            1/1     Terminating         0          36m
nginx-deploy-7f6b545f87-rn6jn            0/1     Pending             0          0s
nginx-deploy-7f6b545f87-rn6jn            0/1     Pending             0          0s
nginx-deploy-7f6b545f87-rn6jn            0/1     ContainerCreating   0          0s
nginx-deploy-5779bd8444-7k7pd            0/1     Terminating         0          36m
nginx-deploy-7f6b545f87-rn6jn            1/1     Running             0          1s
nginx-deploy-5779bd8444-299sg            1/1     Terminating         0          36m
nginx-deploy-5779bd8444-299sg            0/1     Terminating         0          36m
nginx-deploy-5779bd8444-299sg            0/1     Terminating         0          36m
nginx-deploy-5779bd8444-299sg            0/1     Terminating         0          36m
nginx-deploy-5779bd8444-7k7pd            0/1     Terminating         0          37m
nginx-deploy-5779bd8444-7k7pd            0/1     Terminating         0          37m

## 查看新创建的Pod
[root@k8s-master ~]# kubectl get pod -l run=nginx-deploy
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-7f6b545f87-rn6jn   1/1     Running   0          8m31s
nginx-deploy-7f6b545f87-xbnwk   1/1     Running   0          8m35s
nginx-deploy-7f6b545f87-xfnhx   1/1     Running   0          8m46s

##查看任意一个Pod详细信息
[root@k8s-master ~]# kubectl describe pod nginx-deploy-7f6b545f87-rn6jn 
Name:         nginx-deploy-7f6b545f87-rn6jn
Namespace:    default
Priority:     0
Node:         k8s-node1/192.168.154.210
Start Time:   Wed, 15 Apr 2020 22:07:36 +0800
Labels:       pod-template-hash=7f6b545f87
              run=nginx-deploy
Annotations:  <none>
Status:       Running
IP:           10.244.1.88
IPs:
  IP:           10.244.1.88
Controlled By:  ReplicaSet/nginx-deploy-7f6b545f87
Containers:
  nginx-deploy:
    Container ID:   docker://6829170d05c81d292444b824a721ae47af38a4b397ed527f582e15c6652265bc
##可以看到,已经是新镜像
    Image:          nginx:1.17 
    Image ID:       docker-pullable://nginx@sha256:282530fcb7cd19f3848c7b611043f82ae4be3781cb00105a1d593d7e6286b596
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 15 Apr 2020 22:07:37 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-4bqzd (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-4bqzd:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-4bqzd
    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
  ----    ------     ----   ----                -------
  Normal  Scheduled  9m53s  default-scheduler   Successfully assigned default/nginx-deploy-7f6b545f87-rn6jn to k8s-node1
  Normal  Pulled     9m52s  kubelet, k8s-node1  Container image "nginx:1.17" already present on machine
  Normal  Created    9m52s  kubelet, k8s-node1  Created container nginx-deploy
  Normal  Started    9m52s  kubelet, k8s-node1  Started container nginx-deploy

3.6 回滚到以前版本

##回滚前查看历史版本
[root@k8s-master ~]# kubectl rollout history deployment/nginx-deploy
deployment.apps/nginx-deploy 
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deployment nginx-deploy nginx-deploy=nginx:1.17 --record=true

##回滚到上一个版本,--to-revision 参数可以指定回退的版本
[root@k8s-master ~]# kubectl rollout undo deployment nginx-deploy 
deployment.apps/nginx-deploy rolled back

##查看Pod,发现名字变了,实际上是新创建的
[root@k8s-master ~]# kubectl get pod -l run=nginx-deploy
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-7f6b545f87-lbj2d   1/1     Running   0          58s
nginx-deploy-7f6b545f87-lmrlq   1/1     Running   0          56s
nginx-deploy-7f6b545f87-sm5zh   1/1     Running   0          57s

3.7 删除以上创建的server及deployment

[root@k8s-master ~]# kubectl delete svc nginx
service "nginx" deleted

[root@k8s-master ~]# kubectl delete deployment nginx-deploy
deployment.apps "nginx-deploy" deleted

##deployment控制的Pod也被删除了
[root@k8s-master ~]# kubectl get pods 
NAME                                     READY   STATUS    RESTARTS   AGE
curl-69c656fd45-26jv2                    1/1     Running   12         33d
debug-agent-d7jwj                        1/1     Running   0          11h
debug-agent-kl9np                        1/1     Running   0          11h
debug-agent-v598k                        1/1     Running   0          11h
my-service-gb45b                         1/1     Running   7          12d
my-service-sxz97                         1/1     Running   7          12d
nfs-client-provisioner-c7b986bf7-hgs7h   1/1     Running   6          9d
nginx-86c57db685-hdwr8                   1/1     Running   11         33d
secret-pod3                              1/1     Running   6          10d