k8s 常用命令
namespace
通过kubectl 接上 -n namespaceName 来查看对应ns上面的资源信息
kubectl -n kube-system get pod
pods的资源使用情况 top pod 注需要安装metrics的服务
kubectl -n kube-systemc top pod
查看目前集群上有哪些ns
kubectl get ns
我们通过不接-n 的情况下,都是在默认命令空间default下进行操作,在生产中,通过测试一些资源就在这里进行
kubectl get pod == kubectl -n default get pod
创建命名空间
kubectl create ns test
导出yaml文件
kubectl -n kube-system get deploy nginx -o yaml > nginx.yaml
删除ns
kubectl delete ns test
一直terminating强制删除pod
kubectl delete pod [pod name] --force --grace-period=0 -n [namespace]
强制删除pv,pvc
kubectl patch pv pvname -p '{"metadata":{"finalizers":null}}'
kubectl patch pvc xxx -p '{"metadata":{"finalizers":null}}'
强制删除NAMESPACE
kubectl delete namespace NAMESPACENAME --force --grace-period=0
生产中的小技巧:k8s删除namespaces状态一直为terminating问题处理
1、新开一个窗口运行命令 kubectl proxy
> 此命令启动了一个代理服务来接收来自你本机的HTTP连接并转发至API服务器,同时处理身份认证
2、新开一个终端窗口,将下面shell脚本整理到文本内`1.sh`并执行,$1参数即为删除不了的ns名称
#!/bin/bash
set -eo pipefail
die() { echo "$*" 1>&2 ; exit 1; }
need() {
which "$1" &>/dev/null || die "Binary '$1' is missing but required"
}
# checking pre-reqs
need "jq"
need "curl"
need "kubectl"
PROJECT="$1"
shift
test -n "$PROJECT" || die "Missing arguments: kill-ns <namespace>"
kubectl proxy &>/dev/null &
PROXY_PID=$!
killproxy () {
kill $PROXY_PID
}
trap killproxy EXIT
sleep 1 # give the proxy a second
kubectl get namespace "$PROJECT" -o json | jq 'del(.spec.finalizers[] | select("kubernetes"))' | curl -s -k -H "Content-Type: application/json" -X PUT -o /dev/null --data-binary @- http://localhost:8001/api/v1/namespaces/$PROJECT/finalize && echo "Killed namespace: $PROJECT"
#------------------------------------------------------------------------------------
3\. 执行脚本删除
# bash 1.sh kubevirt
Killed namespace: kubevirt
1.sh: line 23: kill: (9098) - No such process
5、查看结果
# kubectl get ns
擅用-h 帮助参数
kubectl run -h #run 的帮助
Create and run a particular image in a pod.
Examples:
# Start a nginx pod.
kubectl run nginx --image=nginx
......
kubectl run nginx --image=nginx #创建nginx pod
kubectl -it exec nginx -- sh #进入pod里面
# kubectl describe pod nginx # 这里显示内容较多,目前我只把当前关键的信息列出来
kubectl get pod -o wide #pod 详细信息
但我们在生产中是不建议直接用来创建pod,先直接演示下:
kubectl delete pod nginx # 我们删除掉这个nginx的pod
k8s补全命令
yum -y install bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
deployment
扩容pod的数量
# kubectl scale deployment nginx --replicas=2
升级nginx的版本
kubectl set image deployment/nginx nginx=nginx:1.9.9 --record # 注意命令最后面的
--record 参数,这个在生产中作为资源创建更新用来回滚的重要标记,强烈建议在生产中操作时都加上这个参数
查看详细信息
kubectl describe deployments.apps nginx
查看当前历史版本情况
# kubectl rollout history deployment nginx
回滚
根据历史发布版本前面的阿拉伯数字序号来选择回滚版本,这里我们回到上个版本号,也就是选择2 ,执行命令如下:# kubectl rollout undo deployment nginx --to-revision=2
我们先来创建一个nginx的deployment资源
kubectl create deployment nginx --image=nginx --replicas=3
我们再来基于这个nginx的deployment来创建一个service服务
kubectl expose deployment nginx --port=80 --target-port=80 --name=nginx
加上--dry-run -o yaml
,--dry-run代表这条命令不会实际在K8s执行,
-o yaml是会将试运行结果以yaml的格式打印出来,这样我们就能轻松获得yaml配置了kubectl create deployment nginx --image=nginx --dry-run -o yaml
ingress
查看创建的ingress资源
kubectl get ingress
这些离线镜像包都导入 docker load -i xxx.tar
HPA
为deployment资源web创建hpa,pod数量上限3个,最低1个,在pod平均CPU达到50%后开始扩容kubectl autoscale deployment web --max=3 --min=1 --cpu-percent=50
label
查看标签kubectl get po --show-labels
列出包含env标签的所有pod, 无论其值如何:$ kubectl get po -l env
在更改现有标签时, 需要使用--overwrite选项。$ kubectl label po kubia-manual-v2 env=debug --overwrite
获取崩溃容器的应用日志
kubectl logs mypod --previous
生命周期管理
1. 创建
1. 创建资源
- kubectl run
- 创建并运行一个或多个容器镜像。
- *创建一个deployment或job来管理容器*。
语法:kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [--command] -- [COMMAND] [args...]
kubectl run nginx --replicas=3 --labels="app-nginx-example" --image=nginx:1.10 --port=80
- kubectl create
kubectl create deployment nginx --image=nginx
# 根据yaml配置文件创建资源对象
kubectl create -f zookeeper.yaml
# 根据yaml配置文件一次创建Service和RC
kubectl create -f my-service.yaml -f my-rc.yaml
# 创建名称空间
kubectl create namespace bigdata
- kubectl apply
kubectl apply deployment nginx --image=nginx
# 使用yaml文件创建资源
kubectl apply -f zookeeper.yaml
2. 标签操作
- 查询标签
kubectl get nodes --show-labels
- 添加标签
# 为指定节点添加标签
kubectl label nodes nodeName labelName=value
# 为指定Pod添加标签
kubectl label pod podName -n nsName labelName=value
- 修改标签
# 修改节点标签值
kubectl label nodes nodeName
# 修改Pod标签值(需要overwrite参数)
kubectl label pod podName -n nsName labelName=value --overwrite
- 删除标签
# 为指定节点删除标签
kubectl label nodes nodeName labelName-
# 删除Pod标签
kubectl label pod podName -n nsName labelName-
2. 查看
# 查看集群状态
kubectl get cs
# 查看Pod
kubectl get pods
kubectl get pod
kubectl get po
# 查看指定名称Pod
kubectl get pod mynginx
kubectl get pod/mynginx
# 同时查看多个资源
kubectl get deploy,pods
# 查看Pod端口信息
kubectl get pod,svc
# 特定命名空间资源查看
kubectl get pods -n bigdata
# 查看所有命名空间下的pod信息
kubectl get pod --all-namespaces
kubectl get pods --A
# 获取Pod运行在哪个节点上的信息
kubectl get pod -o wide
# 显示Pod标签信息
kubectl get pods --show-labels
# 查看特定标签的Pod
kubectl get pods -l app=example
# 以JSON格式显示Pod的详细信息
kubectl get pod podName -o json
# 查看RS
kubectl get replicasets -o wide
# 查看Deployments
kubectl get deployments -o wide
# 查看ip和端口,也叫端点
kubectl get ep
# 查看事件
kubectl get ev
- yaml方式
# 以yaml格式显示Pod的详细信息
kubectl get pod podName -o yaml
kubectl get pod -f pod.yaml
kubectl get pod -f pod1.yaml -f pod2.yaml
# 用get生成yaml文件
kubectl get deploy/nginx --export -o yaml > my-deploy2.yaml
# 查看资源子节点详情
kubectl explain pods.spec.containers
# 用run命令生成yaml文件,dry-run尝试运行,但不会生成,可用于检查语法错误
kubectl run nginx --image=nginx:latest --port=80 --replicas=3 --dry-run
# 尝试运行,并生成yaml文件
kubectl run nginx --image=nginx:latest --port=80 --replicas=3 --dry-run -o yaml > my-deploy.yaml
3. 发布
# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl expose deployment nginx --port=80 --type=NodePort --target-port=80 --name=nginx-service
# 输出为yaml文件(推荐)
kubectl expose deployment nginx --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml
kubectl expose deployment nginx -n bigdata --port=80 --type=NodePort
4. 故障排查
1. 资源详情排查
# 显示Node的详细信息
kubectl describe nodes nodeNamePrefix
# 显示Pod的详细信息
kubectl describe pods podNamePrefix
# 显示由RC管理的Pod的信息
kubectl describe pods rcNamePrefix
2. 资源日志排查
# 容器日志查看
kubectl logs zk-0
kubectl logs zk-0 -n bigdata
# 跟踪查看容器的日志,相当于tail -f命令的结果
kubectl logs -f <pod-name> -c <container-name>
3. 进入资源容器
# 进入容器
kubectl exec -it podName -n nsName /bin/sh
kubectl exec -it podName -n nsName /bin/bash
5. 更新
1. 版本更新
kubectl set image deployment/nginx nginx=nginx:1.15
# 记录更新操作命令以便后续查看变更历史
kubectl set image deployment/nginx nginx=nginx:1.15 --record
2. 编辑更新
kubectl edit deployment/nginx
3. 滚动更新
kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2
kubectl rolling-update frontend --image=image:v2
kubectl rolling-update frontend-v1 frontend-v2 --rollback
4. 替换更新
kubectl replace -f zookersts.yaml
5. 扩缩容
kubectl scale deployment nginx --replicas=10
6. 回滚
# 查看更新过程
kubectl rollout status deployment/nginx --namespace=nsName
# 如果更新成功, 返回值为0
kubectl rollout status deployment nginx-deployment --watch=false | grep -ic waiting
# 查看变更历史版本信息
kubectl rollout history deployment/nginx
kubectl rollout history deployment/nginx --revision=3 --namespace=nsName
# 终止升级
kubectl rollout pause deployment/nginx --namespace=nsName
# 继续升级
kubectl rollout resume deployment/review-demo --namespace=nsName
# 回滚版本
kubectl rollout undo deployment/nginx --namespace=nsName
kubectl rollout undo deployment/nginx --to-revision=3 --namespace=nsName
7. 清理
# 删除资源
kubectl delete deploy/nginx
kubectl delete svc/nginx-service
# 删除所有Pod
kubectl delete pods --all
# 删除所有包含某个label的Pod和Service
kubectl delete pod,service -l name=labelName
# 基于yaml定义的名称删除
kubectl delete -f pod.yaml
# 删除指定命名空间
kubectl delete ns nsName
# 删除指定命名空间的资源
kubectl delete pod zk-0 -n bigdata
kubectl delete pod --all -n bigdata
# 删除计时(观察删除总耗时)
time -p kubectl delete pod podName
# 强制删除(默认:30s)
# 指定删除延迟时间:0s,整体删除时间会明显降低
kubectl delete pod podName -n nsName --grace-period=0 --force
# 以下两行命令功能相同(grace-period=1,等价于now,立即执行)
kubectl delete pod podName -n nsName --grace-period=1
kubectl delete pod podName -n nsName --now
# 删除所有Pods
kubectl delete pods --all --force --grace-period=0
常用操作命令
| 类型 | 命令 | 描述 |
| 基础命令 | create | 通过文件名或标准输入创建资源 |
| expose | 将一个资源公开为一个新的Service | |
| run | 在集群中运行一个特定的镜像 | |
| set | 在对象上设置特定的功能 | |
| get | 显示一个或多个资源 | |
| explain | 文档参考资料 | |
| edit | 使用默认的编辑器编辑资源 | |
| delete | 通过文件名、标准输入、资源名称或标签选择器来删除资源 | |
| 部署命令 | rollout | 管理资源的发布 |
| rolling-update | 对给定的复制控制器滚动更新 | |
| scale | 扩容或缩容Pod、Deployment、ReplicaSet、RC或Job | |
| autoscale | 创建一个自动选择扩容或缩容并设置Pod数量 | |
| 集群管理命令 | certificate | 修改证书资源 |
| cluster-info | 显示集群信息 | |
| top | 显示资源(CPU、Memory、Storage)使用。需要Heapster运行 | |
| cordon | 标记节点不可调度 | |
| uncordon | 标记节点可调度 | |
| drain | 维护期间排除节点(驱除节点上的应用,准备下线维护) | |
| taint | 设置污点属性 | |
| 故障诊断和调试命令 | describe | 显示特定资源或资源组的详细信息 |
| logs | 在一个Pod中打印一个容器日志。如果Pod只有一个容器,容器名称是可选的 | |
| attach | 附加到一个运行的容器 | |
| exec | 执行命令到容器 | |
| port-forward | 转发一个或多个本地端口到一个Pod | |
| proxy | 运行一个proxy到Kubernetes API Server | |
| cp | 拷贝文件或目录到容器 | |
| auth | 检查授权 | |
| 高级命令 | apply | 通过文件名或标准输入对资源应用配置 |
| patch | 使用补丁修改、更新资源的字段 | |
| replace | 通过文件名或标准输入替换一个资源 | |
| convert | 不同的API版本之间转换配置文件 | |
| 设置命令 | label | 更新资源上的标签 |
| annotate | 更新资源上的注释 | |
| completion | 用于实现kubectl工具自动补全 | |
| 其他命令 | api-versions | 打印支持的API版本 |
| config | 修改kubeconfig文件(用于访问API,比如配置认证信息) | |
| help | 所有命令帮助 | |
| plugin | 运行一个命令行插件 | |
| version | 打印客户端和服务版本信息 | |
1. 获取帮助
# 检查kubectl是否安装
rpm -qa | grep kubectl
# 获取kubectl及其子命令帮助方法
kubectl --help
kubectl create --help
1. Worker上执行kubectl
# Worker节点上执行
mkdir -p ~/.kube
scp master1:/root/.kube/config ~/.kube/
# 验证(查看K8s集群节点列表)
kubectl get nodes
2. api相关操作命令
# 查看api版本信息
kubectl api-versions
# 查看api资源列表
kubectl api-resources
3. K8s相关进程操作命令
netstat -lntp | grep kube-proxy
netstat -tnlp | grep kubelet
4. 节点操作命令
- 加入新节点
# 加入新节点,在master节点上执行,将输出再到新节点上执行
kubeadm token create --print-join-command
- 驱逐节点
# 驱逐节点的Pod
kubectl drain nodeName
- 节点下线
# 将节点标记为不可调度,不影响现有Pod(注意daemonSet不受影响)
kubectl cordon nodeName
- 节点上线
# 维护结束,节点重新投入使用
kubectl uncordon nodeName
- 污点设置
# 设置污点
kubectl taint nodes nodeName key1=value1:NoSchedule
kubectl taint nodes nodeName key1=value1:NoExecute
kubectl taint nodes nodeName key2=value2:NoSchedule
# 删除污点
kubectl taint nodes nodeName key1:NoSchedule-
kubectl taint nodes nodeName key1:NoExecute-
kubectl taint nodes nodeName key2:NoSchedule-
# 查看污点详情
kubectl describe nodes nodeName
资源创建实例
Namespace
命令行方式
kubectl create namespace bigdata
yaml方式
vi ns-test.yaml
编排文件如下:
apiVersion: v1
kind: Namespace
metadata:
name: bigdata
执行yaml文件:
kubectl apply -f ns-test.yaml
验证:
kubectl get namespaces
kubectl get namespace
kubectl get ns
清除:
kubectl delete -f ns-test.yaml
kubectl delete ns bigdata
Pod
命令行方式
未提供直接创建Pod的命令,命令行方式一般通过创建Deployment、RC、RS等资源间接创建Pod。
yaml方式
vi pod-test.yaml
编排文件如下:
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: nginx-containers
image: nginx:latest
执行yaml文件:
kubectl apply -f pod-test.yaml
验证:
kubectl get pods
kubectl get pod
kubectl get po
kubectl describe pod pod1
kubectl get pods -o wide
curl http://172.16.189.68
清除:
kubectl delete -f pod-test.yaml
kubectl delete pod pod1
Service
命令行方式
kubectl run nginx-app --image=nginx:latest --image-pull-policy=IfNotPresent --replicas=2
kubectl expose deployment.apps nginx-app --type=ClusterIP --target-port=80 --port=83
参数说明:
- expose:创建service。
- deployment.apps:控制器类型。
- nginx-app:应用名称,也是service名称。
- --type=ClusterIP:指定service类型。
- --target-port=80:指定Pod中容器端口。
- --port=80:指定service端口。
验证:
kubectl get service
kubectl get svc
kubectl get endpoints
kubectl get ep
curl http://10.104.173.230:83
kubectl get all
清除:
kubectl delete service nginx-app
kubectl delete svc nginx-app
yaml方式
vi nginx-service.yaml
编排文件如下:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginxapp
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-app-svc
labels:
name: nginx-app-svc
spec:
type: ClusterIP
ports:
- protocol: TCP
port: 83
targetPort: 80
selector:
app: nginx
---
apiVersion: v1
kind: Service
metadata:
name: nginx-app-svc2
labels:
name: nginx-app-svc2
spec:
type: NodePort
ports:
- protocol: TCP
port: 83
targetPort: 80
nodePort: 30083
selector:
app: nginx
执行yaml文件:
kubectl apply -f nginx-service.yaml
验证:
kubectl describe deployment nginx-app
kubectl describe svc nginx-app-svc
kubectl get service
kubectl get svc
kubectl get endpoints
kubectl get ep
# nginx-app-svc
curl http://10.107.141.109:83
# nginx-app-svc2
curl http://192.168.216.100:30083
# 查看k8s集群指定端口的侦听状态
ss -anput | grep ":30083"
kubectl get all
清除:
kubectl delete -f nginx-service.yaml
kubectl delete service nginx-app-svc
kubectl delete svc nginx-app-svc
常用控制器
1. Deployment
命令行方式
kubectl run nginx-app --image=nginx:latest --image-pull-policy=IfNotPresent --replicas=2
参数说明:
- nginx-app:Deployment控制器类型的应用名称。
- --image=nginx:latest:应用运行的Pod中的Container所使用的镜像。
- IfNotPresent:Container容器镜像下载策略,如果本地有镜像,使用本地,如果本地没有镜像,下载镜像。
- --replicas=2:是指应用运行的Pod共计2个副本,这是用户的期望值,Deployment控制器中的ReplicaSet控制器会一直监控此应用运行的Pod副本状态,如果数量达不到用户期望,就会重新拉起一个新的Pod,会让Pod数量一直维持在用户期望值数量。
验证:
kubectl get deployment.apps
kubectl get deployment
kubectl get deploy
kubectl get replicaset
kubectl get rs
kubectl get all
清除:
kubectl delete deployment nginx-app
yaml方式
vi nginx-deployment.yaml
编排文件如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginxapp
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
执行yaml文件:
kubectl apply -f nginx-deployment.yaml
验证:
kubectl get deployment.apps
kubectl get deployment
kubectl get deploy
kubectl get replicaset
kubectl get rs
kubectl get all
kubectl describe deployment nginx-app
kubectl get pods -o wide
curl http://172.16.189.77
curl http://172.16.235.138
清除:
kubectl delete -f nginx-deployment.yaml
kubectl delete deployment nginx-app
2. ReplicaSet
命令行方式
yaml方式
3. StatefulSet
命令行方式
yaml方式
4. DaemonSet
命令行方式
yaml方式
5. Job
命令行方式
yaml方式
6. CronJob
命令行方式
yaml方式
操作命令补充说明
1. create和apply的异同点
- create
先删除所有现有的东西,重新根据yaml文件生成新的。所以要求yaml文件中的配置必须是完整的。
- apply
根据配置文件里面列出来的内容,升级现有的。所以yaml文件的内容可以只写需要升级的属性。apply命令将配置应用于资源。 如果资源不在那里,那么它将被创建。
从执行的角度来看,如上所示,在kubectl create和kubectl apply之间第一次创建资源时没有区别。 但是,第二次kubectl create会抛出错误。简单来说,如果在单个文件上运行操作以创建资源,则create和apply基本相同。 但是, apply允许您在目录下的多个文件上同时创建和修补。