k8s常用命令

2年前 (2022-01-21) faer615 kubernetes 已收录 416℃

点击数:89

# kubectl常用命令
### 相关服务及用途
| 节点名称 | 服务名称 | 用途 |
|---|---|---|
|管理节点 | kubctl-apiserver | 提供HTTP Rest统一接口服务,处理和验证REST请求和更新etcdAPI对象的状态
|管理节点 | kubectl-controller-manager | 资源控制管理同步
|管理节点 | kube-scheduler| 负责资源调度(调度Pod
|工作节点 | kubelet | 管理Pod的生命周期,创建、启停等任务
|工作节点 | kube-proxy | 负责网络通信及负载均衡

获取 context

# 列出所有的 context
kubectl config get-contexts 

# 获取当前的 context
kubectl config current-context

# 更改当前 context
kubectl config use-context

# 修改 context 的元素
kubectl config set-context

更改镜像版本

kubectl set image deployment 应用名称 容器名称=镜像地址

1.重启服务

kubectl patch deployment app名称  -p {\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}} -n 命名空间

2.pod副本数调整(扩容、缩容、自动扩缩容)

kubectl scale deployment APP名称 --replicas=2 -n sev
kubectl scale deployment kubernetes-dashboard --replicas=1 -n kube-system
kubectl scale deployment/deployment_name --replicas=N

# 只有当前副本数等于M时才会执行扩容或者缩容
kubectl scale deployment/deployment_name --replicas=N --current-replicas=M

# 设置多个RCPod副本数量
kubectl scale --replicas=5 rc/foo rc/bar rc/baz

# autoscale命令:这个比scale更加强大,也是弹性伸缩策略 ,它是根据流量的多少来自动进行扩展或者缩容。
# 指定DeploymentReplicaSetReplicationController,
# 并创建已定义好资源的自动伸缩器。使用自动伸缩器可以根据需要自动增加或减少系统中部署的pod数量
# 使用 Deployment foo”设定,使用默认的自动伸缩策略,指定目标CPU使用率,使其Pod数量在210之间
kubectl autoscale deployment foo --min=2 --max=10

# 使用RCfoo”设定,使其Pod的数量介于15之间,CPU使用率维持在80
kubectl autoscale rc foo --max=5 --cpu-percent=80

3.查看部署应用

kubectl get deploy -n kube-system 

# 在本地主机上为API Server启动一个代理网关
kubectl proxy --port=8080
之后就可以通过curl来对此套字节发起访问请求
curl localhost:8080/api/v1/namespaces/ | jq .items[].metadata.name (jq可以对json进行过滤)

4. 创建资源对象

kubectl run name --image=(镜像名) --replicas=(副本数) --port=(容器要暴露的端口) --labels=(设定自定义标签)
# 陈述式对象配置管理方式
kubectl create -f **.yaml
# 声明式对象配置管理方式(也适用于更新等)
kubectl apply -f **.yaml  

5.查看资源对象

# 查看命名空间
kubectl get namespace

#  查看所有名称空间下的pod
kubectl get pods --all-namespaces
等同于
kubectl get pods -A 新版支持,比如v1.18.2

kubectl get pods,services -o wide (-o 输出格式 wide表示plain-text)

kubectl get pod -l "key=value,key=value" -n kube-system (-l 标签选择器(多个的话是与逻辑)-n 指定命名空间,不指定默认default)

kubectl get pod -l "key1 in (val1,val2),!key2" -L key (-l 基于集合的标签选择器, -L查询结果显示标签) 

注意:为了避免和shell解释器解析!,必须要为此类表达式使用单引号
#  监视资源变动信息
kubectl get pod -w

4.查询日志

# 动态检查Pod日志(标准输出)
kubectl logs -f pod名称 -n kube-system
# 在容器内执行命令
kubectl exec -ti pod名称 /bin/bash -n kube-system
# 获得容器前一次运行的日志内容
kubectl logs --previous <Pod名称> <Pod中的容器名称>
kubectl logs --previous l7-lb-controller-74c67fb85d-5b5cg -n kube-system

5.查看描述

kubectl describe pod,svc kubernetes-dashboard -n kube-system

6.查看pod部署节点及IP

kubectl get po
kubectl get po -o wide
kubectl get po ---namespaces=kube-system
kubectl get po --all-namespaces
kubectl get pods -n kube-system -o wide

7.查看集群中服务

kubectl get services --all-namespaces
kubectl get svc kubernetes-dashboard -n kube-system

8.将服务暴露出去(创建Service)

kubectl expose deployments/deployment_name --type="NodePort" --port=(要暴露的容器端口) --name=(Service对象名字)
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web

# 查看暴露端口
kubectl get endpoints -n kube-system kubernetes-dashboard
kubectl get ep -n kube-system kubernetes-dashboard

9.标签管理

# 添加标签
kubectl label nodes <node-name> <label-key>=<label-value>
kubectl label node 192.168.1.66 nodetype=node --overwrite
lsmod | grep ip_vs

# 删除标签
kubectl label nodes node6 IngressProxy-
                    主机名     标签名-

10.查看标签

kubectl get node --show-labels -n kube-system
kubectl get nodes -L kubernetes.io/role
kubectl get pods --show-labels kube-sytem
kubectl get pod --show-labels podname -n kube-system

11.查看svc/pod描述

kubectl describe 类型 资源名称 命名空间
kubectl describe svc kubernetes-dashboard -n kube-system
kubectl describe pod kubernetes-dashboard -n kube-system

12.以yaml/json方式显示pod信息

kubectl get deployment -o yaml kubernetes-dashboard -n kube-system
kubectl get daemonset -o yaml -n kube-system calico-node
kubectl get svc -o json pod名称 -n kube-system

13.显示所有的服务

kubectl get deployments -n kube-system 
kubectl get daemonsets -n kube-system

14.创建命名空间

# 通过命令创建
kubectl create namespace 空间名称
# 通过文件创建
cat > my-namespace.yaml << EOF
apiVersion: v1
kind: Namespace
metadata:
name: new-namespace
EOF
kubectl create -f ./my-namespace.yaml

# Node状态
每个Node都包括以下状态信息
地址:包括hostname、外网IP和内网IP
条件(Condition):包括OutOfDiskReadyMemoryPressureDiskPressure
容量(Capacity):Node上的可用资源,包括CPU、内存和Pod总数
基本信息(Info):包括内核版本、容器引擎版本OS类型等
# 删除命令空间
kubectl delete namespaces new-namespace
# 删除一个namespace会自动删除所有属于该namespace的资源
# default  kube-system 命名空间不可删除
# etcd 强制删除命名空间
etcdctl del /registry/namespaces/rook-ceph

15.创建/查看 Deployment 记录版本号

kubectl create -f nginx-deployment.yaml --record

16.实现水平扩展或收缩

kubectl scale deployment kubernetes-dashboard --replicas=2 -n kube-system
# 重新分配pod数量
kubectl scale deployment kubernetes-dashboard --replicas=1 -n kube-system

17.回滚

# 查看升级历史记录
kubectl rollout history deployment/kubernetes-dashboard -n kube-system

# 回滚到上一个版本
kubectl rollout undo deployment/kubernetes-dashboard -n kube-system

# 查看回退状态
kubectl rollout status deployment/kubernetes-dashboard -n kube-system

# 查看单个revision的详细信息
kubectl rollout history deployment/kubernetes-dashboard --revision=1 -n kube-system

# 使用 --to-revision 参数 指定回滚某个历史版本
kubectl rollout undo deployment/kubernetes-dashboard --to-revision=1  -n kube-system

18.自动扩展

# 集群支持 horizontal pod autoscaling,可以为Deployment设置自动扩展
 kubectl autoscale deployment kubernetes-dashboard --min=1 --max=5 --cpu-percent=80 -n kube-system
 
 # 查看hap状态
 kubectl get hpa kubernetes-dashboard -n kube-system
 
 # 查看hpa详细状态
 kubectl describe hpa kubernetes-dashboard -n kube-system
 
 # 删除hpa
 kubectl delete hpa kubernetes-dashboard -n kube-system

19.更新Deployment镜像

kubectl set image deployment kubernetes-dashboard nginx=nginx:1.9.1
kubectl replace -f rc.yaml

# 更新资源对象replaceset
# 如果基于此前的配置文件进行替换,需要加上force
kubectl replace -f xx.yaml --force

# deployment中的nginx容器镜像设置为“nginx1.9.1
kubectl set image deployment/nginx busybox=busybox nginx=nginx:1.9.1

# 所有deploymentrcnginx容器镜像更新为“nginx1.9.1
kubectl set image deployments,rc nginx=nginx:1.9.1 --all

# daemonset abc的所有容器镜像更新为“nginx1.9.1
kubectl set image daemonset abc *=nginx:1.9.1

# 从本地文件中更新nginx容器镜像
kubectl set image -f path/to/file.yaml nginx=nginx:1.9.1 --local -o yaml

20.编辑 Deployment pod配置

kubectl edit deployment kubernetes-dashboard -n kube-system

21.升级资源

# 暂停状态下执行
kubectl rollout pause deployment kubernetes-dashboard -n kube-system
kubectl set image deploy kubernetes-dashboard nginx=nginx:1.9.1

# 更新升级资源
kubectl set resources deployment kubernetes-dashboard -c=kubernetes-dashboard --limits=cpu=200m,memory=512Mi -n kube-system

# 恢复
kubectl rollout resume deploy kubernetes-dashboard -n kube-system

22.查看CIDR划分

kubectl get nodes -o json | jq '.items[] | .spec'

23.授权管理

# 查看授权node节点
kubectl get certificatesigningrequests
kubectl get csr

# 添加新工作节点
kubectl get csr|grep 'Pending' | awk 'NR>0{print $1}'| xargs kubectl certificate approve

# 批量授权认证
for i in `kubectl get csr|grep -v NAME|awk '{print $1}'`;do kubectl certificate approve $i;done
kubectl get nodes

# 拒绝授权
kubectl certificate deny node-csr-AzAMd7KYm57dUkiD-aM3POpS_N37bXCyHeI_B-llyQM

# 批量拒绝授权
for i in `kubectl get csr|grep -v NAME|awk '{print $1}'`;do kubectl certificate deny $i;done

# 删除信任csr节点
kubectl delete csr node-csr-AzAMd7KYm57dUkiD-aM3POpS_N37bXCyHeI_B-llyQM

# 批量删除授权
for i in `kubectl get csr|grep -v NAME|awk '{print $1}'`;do kubectl delete csr $i;done

24.集群信息查看

# 查看集群访问连接
kubectl cluster-info

# 查看命名空间
kubectl get namespaces

# 查看权限
kubectl describe clusterrole cluster-admin -n kube-system

# 查看kubectl版本
kubectl version

# 查看客户端及服务端程序版本信息
kubectl version --short=true 

# 查看支持api版本
kubectl api-versions

# 查看当前kubectl配置
kubectl config view

# 查看集群状态
kubectl get componentstatuses
kubectl get rs
NAME                 STATUS    MESSAGE            ERROR
controller-manager   Healthy   ok               
scheduler            Healthy   ok               
etcd-1               Healthy   {"health": "true"}
etcd-2               Healthy   {"health": "true"}
etcd-0               Healthy   {"health": "true"}

# 查看集群节点
kubectl get nodes

25.维护状态/取消维护模式

# 禁止调度
kubectl cordon node名称

# 启用调度
kubectl uncordon node名称

# 驱逐运行中的node节点
kubectl drain --ignore-daemonsets node名称
# 注:该命令会删除节点上的所有poddaemonset除外),在其他node上重启他们,通常该节点需要维护时使用该命令。
直接使用该命令会自动调用kubectl cordon <node>命令。
当该节点维护完成,启动kubelet后,再使用kubectl  uncordon  <node> 即可将该节点添加到k8s集群中

26. 删除资源对象

# 删除指定资源对象
kubectl delete [pods/services/deployments/...] name
kubectl delete pod pod名称 -n kube-system
# 删除kube-system下指定标签的资源对象
kubectl delete [pods/services/deployments/...] -l key=value -n kube-system 
# 删除kube-system下所有资源对象
kubectl delete [pods/services/deployments/...] --all -n kube-system
# 强制删除Terminating的资源对象
kubectl delete [pods/services/deployments/...] source_name --force --grace-period=0 -n kube-system
# 强制删除pod
kubectl delete pod PODNAME --force --grace-period=0 -n kube-system
kubectl delete -f xx.yaml

# 一般不用这种方式删除
kubectl apply -f xx.yaml --prune -l <labels>
# 默认删除控制器会同时删除其管控的所有Pod对象,cascade=false只删除rs
kubectl delete rs rs_name --cascade=fale
# 删除node节点
kubectl delete node 节点名称

28.匿名访问权限

kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous
kubectl label nodes 192.168.61.64 IngressProxy=true

29. kubelet.kubeconfig 证书转换

echo "证书内容"|base64 --decode > abc.pem
# 查看证书有效期
openssl x509 -in apiserver.crt -text -noout | grep Not

30.直接通过 kubectl 命令来访问这些 API

kubectl get --raw "/apis/metrics.k8s.io/v1beta1" | jq . 
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes" | jq . 
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/pods" | jq . 
kubectl top nodes 
kubectl top pods

31.查看secrets密码

kubectl get secrets jenkins -o yaml|grep password|awk '{print $NF}'|base64 --decode;echo

32.查看yaml内容

kubectl get deployment -o yaml kubernetes-dashboard -n kube-system

33.自动添加新加工作节点命令

kubectl get csr|grep 'Pending' | awk 'NR>0{print $1}'| xargs kubectl certificate approve

34.日志查看

# 容器之前崩溃,使用以下命令可以获得容器前一次运行的日志
kubectl logs --previous <Pod名称> <Pod中的容器名称>

35.不中断业务升级

kubectl rolling-update pod名称 -f xxx.yaml

# 回退
kubectl rolling-update pod名称 -rollback

36.创建Fluent bit 的 Service Account

kubectl create sa logging -n kube-system

pod 拉取策略

# 镜像拉取规则
# 默认值,总是拉取 pull
imagePullPolicy: Always

# 本地有则使用本地镜像,不拉取
imagePullPolicy: IfNotPresent

# 只使用本地镜像,从不拉取
imagePullPolicy: Never

命令补全

yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo"source <(kubectl completion bash)" >> ~/.bashrc

# 添加kubectlk别名
vim ~/.bashrc alias k='kubectl'
# tab命令只在使用完整的kubectl 命令起作用,使用别名k 时不起作用,修补:
source <( kubectl completion bash | sed's/kubectl/k/g' ) # 写入 .bashrc
 
mac
brew install bash-completion
source $(brew --prefix)/etc/bash_completion
source <(kubectl completion bash)

排错

>>> 无法删除命令空间
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. 
The resource may continue to run on the cluster indefinitely.
Error from server (Conflict): Operation cannot be fulfilled on namespaces "rook-ceph": 
The system is ensuring all content is removed from this namespace.  
Upon completion, this namespace will automatically be purged by the system.

# 1. 获取当前namespace描述
kubectl get namespace test -o json > tmp.json

# 2. 编辑tmp.json,删除其中的spec字段。
{
    "apiVersion": "v1",
    "kind": "Namespace",
    "metadata": {
        "creationTimestamp": "2019-11-12T01:58:10Z",
        "deletionTimestamp": "2019-11-12T04:07:25Z",
        "labels": {
            "name": "rook-ceph"
        },
        "name": "rook-ceph",
        "resourceVersion": "134355",
        "selfLink": "/api/v1/namespaces/rook-ceph",
        "uid": "15f7aa00-f9b9-4595-bf62-3630f0510e72"
    },
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    "spec": {
        "finalizers": [
            "kubernetes"
        ]
    },
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    "status": {
        "phase": "Terminating"
    }
}

3. 最后在管理节点执行
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8080/api/v1/namespa
faer615
博主

这货来去如风,什么鬼都没留下!!!

相关推荐

评论已关闭!