K8S基本命令操作
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
- 使用 YAML 而不是 JSON 因为 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
- 原文作者:老鱼干🦈
- 原文链接://www.tinyfish.top:80/post/kubernets/3.-Kubernetes%E5%9F%BA%E6%9C%AC%E5%91%BD%E4%BB%A4%E4%BD%BF%E7%94%A8/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. 进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。