k8s常用命令

发布时间:2022-03-01 09:31:57 作者:yexindonglai@163.com 阅读(501)

kubectl相关

命令

1、基本命令
命令 作用
create 创建资源
edit 编辑资源
get 获取资源
patch 更新(修改)资源
delete 删除资源
explain 展示资源文档
2、运行/调试命令
命令 作用
run 在集群中运行指定镜像
expose 暴露资源为service
describe 展示资源内部信息
logs 输出容器在pod中的日志
attach 进入运行中的容器
cp 在pod内外复制文件
rollout 管理资源的发布
scale 扩/缩容Pod数量
autoscale 自动调整pod数量

资源分类

1、集群级别资源
资源名称 缩写 说明 资源作用
nodes no node节点 集群组成部分
namespace ns 命名空间 隔离Pod
2、pod资源
资源名称 缩写 说明 资源作用
pods po pod 装载容器的最小单元
3、pod资源控制器
资源名称 缩写 说明 资源作用
replicationcontroller rc 控制pod资源
replicasets rs 控制pod资源
daemonsets ds 控制pod资源
jobs 控制pod资源
cronjobs cj 控制pod资源
horizontalpodautoscalers hpa 控制pod资源
statefulsets sts 控制pod资源
4、服务发现资源
资源名称 缩写 说明 资源作用
services svc 服务 统一pod对外接口
ingress ing 统一pod对外接口

参数

参数 说明
-A 展示所有
-f 指定文件
-k 处理kustomization目录。此标志不能与-f或-R一起使用。
-L 指定标签lebel
-o 指定输出格式,常用的有json、yaml、wide(详细列表)
-R 递归处理-f,—filename中使用的目录。在需要管理时非常有用
-l 要进行筛选的选择器(只支持标签查询),支持“=”、“=”和“!=”。(例如-l键1=value1,键2=value2)<br>用法示例:kubectl get pod -l "key=value"
-w 持续跟踪命令的状态或者事件变化,类似tail -f功能
-n 指定命名空间,--namepace的缩写
-i 即使未连接任何组件,也要保持pod中容器上的stdin打开。
-t 为pod中的每个容器分配了一个tty。

资源管理方式

命令行敲出的指令分为2种,

  • 其中kubectlruncreateapply 等等都是命令,
  • 前面带-或者--的都是参数,比如--port-image-n

资源管理方式分类

类型 操作对象 适用环境 优点 缺点 使用频率
命令式对象管理 对象 测试 简单 只操作活动对象,无法审计、跟踪 较少
命令式对象配置 文件 开发 可以审计跟踪 项目大时,配置文件多,操作麻烦 常用
声明式对象配置 目录 开发 支持目录操作 意外情况下难以调试 较少
1、命令式对象管理

直接使用命令去操作k8s资源,命令和参数一起出现

  1. kubectl run nginx-pod --image=nginx:1.17.1 --port=80
2、命令式对象配置

通过命令和配置文件去操作作k8s资源,命令还是那个命令,只不过参数都放在配置文件里面

  1. kubectl create/patch -f nginx-pod.yaml
3、声明式对象配置
  1. kubectl apply -f nginx-pod.yaml

使用apply创建资源,

  • 如果资源不存在,就创建,相当于执行kubectl create -f nginx-pod.yaml
  • 如果资源存在,就修改,相当于执行kubectl patch -f nginx-pod.yaml

node

1、获取所有节点
  1. [root@master ~]# kubectl get nodes
  2. NAME STATUS ROLES AGE VERSION
  3. master Ready control-plane,master 15h v1.20.9
  4. node1 Ready <none> 13h v1.20.9
  5. node2 Ready <none> 11h v1.20.9

说明

  • NAME : 节点名称
  • STATUS :节点状态
    • Ready : 已就绪
    • NotReady:未就绪
  • ROLES :角色
  • AGE:运行时长,从启动到现在运行了多长时间
  • VERSION : 版本
2、删除节点

在master节点执行以下命令即可删除

  1. # 先卸载节点,但是还未删除
  2. kubectl drain node1 --delete-local-data --force --ignore-daemonsets
  3. # 删除节点
  4. kubectl delete node node2

还需要在work节点上执行以下命令来清空ini配置

  1. kubeadm reset
3、加入节点

先在主节点创建令牌

  1. # 执行后会返回一个 kubeadm 开头的命令
  2. kubeadm token create --print-join-command

然后在需要加入集群的节点中执行令牌,注意这里的命令是通过kubeadm token create --print-join-command命令返回的结果

  1. # 在工作节点上执行以下命令即可加入集群
  2. kubeadm join cluster-endpoint:6443 --token xxx.xxx --discovery-token-ca-cert-hash sha256:xxx

namespace

1、获取所有namespace
  1. # 第一种用法
  2. [root@master ~]# kubectl get namespaces
  3. NAME STATUS AGE
  4. default Active 16h # 所有未指定namespace的对象都会被分配在default空间
  5. kube-node-lease Active 16h # 集群节点之间的心跳维护,v1.13开始引入
  6. kube-public Active 16h # 此命名空间可以被所有人访问(包括未认证用户)
  7. kube-system Active 16h # k8s系统空间,所有由k8s创建的资源都分配到这个空间
  8. # 第二种用法
  9. kubectl get namespace
  10. # 第三种用法
  11. kubectl get ns
2、获取某个命名空间
  1. # 获取名为default的namespace
  2. kubectl get ns default
3、获取namespace为default的的描述信息
  1. [root@master ~]# kubectl describe ns default
  2. Name: default
  3. Labels: <none>
  4. Annotations: <none>
  5. Status: Active
  6. No resource quota. # 针对namespace做的资源限制
  7. No LimitRange resource. # LimitRange 针对 namespace中每个组件做的资源限制

说明

  • Status
    • Active :正在使用,
    • Terminating :正在删除namespace
3、创建namespace

记住,名称中不能用下划线_,可以用横行-
第一种创建方式—命令行创建

  1. kubectl create ns xxx

第二种创建方式—命令行 + 配置文件
创建一个名为namespace-dev.yaml的文件,内容如下(注意大小写,kind的头字母必须大写)

  1. apiVersion: v1
  2. kind: Namespace
  3. metadata:
  4. name: dev

然后偶执行命令进行创建

  1. kubectl create -f namespace-dev.yaml
4、删除namespace

需要注意的是,删除后,当前命名空间下的pod、deployment、container也会一起删掉

第一种—使用命令删除

  1. kubectl delete ns xxx

第二种—使用配置文件删除

  1. kubectl delete -f namespace-dev.yaml
5、查看命名空间详情
  1. kubectl describe ns xxx

pod

1、获取所有pod
  1. [root@master ~]# kubectl get pod -A
  2. NAMESPACE NAME READY STATUS RESTARTS AGE
  3. kube-system calico-kube-controllers-7498f6cbdd-k6m4q 0/1 Running 20 10h
  4. kube-system calico-node-5bj92 0/1 Init:0/2 1 10h
  5. kube-system calico-node-fqn48 0/1 Init:0/2 0 10h
  6. kube-system calico-node-r2ln8 0/1 Init:0/2 1 10h
  7. kube-system coredns-5897cd56c4-vnw4c 0/1 ContainerCreating 0 15h
  8. kube-system coredns-5897cd56c4-zvwdn 0/1 ContainerCreating 0 15h
  9. 第二种用法
  10. kubectl get pods -A
  11. 第三种用法
  12. kubectl get po -A

说明

  • NAMESPACE :名称空间
  • NAME:Pod名称
  • READY:已准备好的实例数/总实例数
  • STATUS:状态
    • Running:运行中
    • Init:0/2 : 正在初始化 已初始化完成数量/总数
    • ContainerCreating : 容器正在创建中,需要注意的是,如果长时间还是这个状态的话,就是有错误了,需通过命令kubectl describe pod podName查看原因
  • RESTARTS : 重启次数
  • AGE:运行时长

获取所有namespace的pod并监视资源变动
加上-w 表示监视资源变动信息,此时命令行进入阻塞状态,如果pod有变化将会马上呈现出来;

  1. kubectl get pod -A -w

其他参数

  1. # -n 表示获取指定namespace的pod
  2. kubectl get pod -n kube-system
  3. # 如果不加 -n 参数,默认获取的是default下的pod,所以以下2个命令的执行结果是一样的
  4. kubectl get pod
  5. kubectl get pod -n default
2、创建pod

因为pod里面至少要有一个容器,所以pod是和容器一起创建的,新建一个文件pod.ymal,内容如下

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: pod-name
  5. namespace: dev
  6. spec:
  7. containers:
  8. - image: nginx:1.17.1
  9. name: nginx-container
  10. ports:
  11. - name: nginx-port
  12. containerPort: 80
  13. protocol: TCP

然后执行命令并指定配置文件进行创建

  1. kubectl create -f pod.ymal
3、修改pod
4、删除pod
  • 如果只是单纯的删除pod,你会发现,删除了之后,k8s会自动启动了另一个pod,这是因为当前pod是由pod控制器创建的,控制器会监控pod状态,一旦pod死亡,会立即重建,所以想要删除pod就得先删除deployment。删除后,与此deployment关联的pod也会一起删除;
  • 如果不删除delployment的话,这里的删除pod只是充当一个重启的作用;
  • 如果是创建时未指定pod控制器,那就可以使用以下命令直接删除pod
  1. # 删除deployment,删除后,与此deployment关联的pod也会一起删除
  2. kubectl delete deployment xxx
  3. # 删除pod
  4. kubectl delete pod xxx

label

1、为资源打标签(第一种方式:使用命令打标签)
  1. # 为pod资源打标签,需要注意的是,打标签之前,pod必须提前创建好
  2. kubectl label pod pod-name labelKey=labelValue -n deplot-name
  3. # 为node资源打标签
  4. kubectl label nodes node1 nodetag=node1
2、为资源打标签(第二种方式:使用配置文件打标签)

以下示例是为pod资源打标签,这种方式是和pod一起创建的,新建一个配置文件 label.yaml

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: pod-name
  5. namespace: dev
  6. labels:
  7. lebelKey1: "labelValue1"
  8. lebelKey2: "labelValue2"
  9. lebelKey3: "labelValue3"
  10. spec:
  11. containers:
  12. - image: nginx:1.17.1
  13. name: nginx-container
  14. ports:
  15. - name: nginx-port
  16. containerPort: 80
  17. protocol: TCP

执行命令创建pod

  1. kubectl apply -f label.ymal
3、更新标签

适合更新label值,前提是label的key必须已存在;

  1. kubectl label pod pod-name labelKey=labelValue -n deplot-name --overwrite
4、查看标签
  1. kubectl get pod pod-name -n dev --show-labels
5、筛选标签
  1. # 查询lebelKey1=labelValue1的pod
  2. kubectl get pod -n dev -l lebelKey1=labelValue1 --show-labels
  3. # 查询A不等于B的pod
  4. kubectl get pod -n dev -l A!=B --show-labels
5、删除标签

删除key为lebelKey的标签

  1. # 删除pod资源的表标签
  2. kubectl label pod ymal-create-pod-name lebelKey- -n dev
  3. # 删除node资源的标签
  4. kubectl label nodes node1 nodetag-

pod控制器(deployment)

pod控制器有很多种,我们这里就用deployment

1、创建deployment(第一种方式:命令行创建)

使用以下run命令运行一个nginx,deployment名称为app=run-cmd-nginx-deploy-3

  1. kubectl create deployment app=run-cmd-nginx-deploy-3 --image=nginx:1.17.1 --port=80 --replicas=3 -n dev
  2. # 说明
  3. nginx-deploy # pod控制器的名称,也就是deployment,
  4. --image=nginx:1.17.1 # 指定镜像版本
  5. --port=80 # 指定nginx的端口
  6. --replicas=3 # 创建三个副本,也就是会创建三个pod(注意:在k8s版本v1.8以后,r--eplicas已失效,建议使用deployment,不过仅仅是run命令失效,create 和yaml配置文件还是有效的)
  7. -n dev # 指定namespace

通过以下命令可以看到,会自动生成一个app=run-cmd-nginx-deploy-3的标签

  1. [root@master ~]# kubectl get deployment -o wide -n dev --show-labels
  2. NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR LABELS
  3. run-cmd-nginx-deploy-3 3/3 3 3 18m nginx nginx:1.17.1 app=run-cmd-nginx-deploy-3 app=run-cmd-nginx-deploy-3
2、创建deployment(第二种方式:yaml配置文件创建)

新建一个deployment.yaml文件,内容如下

  1. apiVersion: apps/v1 # 前面的apps/必须这样写,斜杠后面随便写,暂不知为何
  2. kind: Deployment # 创建deployment
  3. metadata:
  4. name: ymal-deployment-name # deployment名称
  5. namespace: dev # 所属命名空间
  6. spec:
  7. replicas: 3 # 副本数量
  8. selector:
  9. matchLabels: # 匹配标签
  10. deploy-label-1: ymal-label # 此选择器和下面的template.metadata..labels进行关联,可以发现这俩值是一样的,一样的值就会进行关联
  11. template: # pod模板
  12. metadata: # 以下是pod配置
  13. labels:
  14. deploy-label-1: ymal-label
  15. spec:
  16. containers: # 以下是容器配置
  17. - image: nginx:1.17.1
  18. name: nginx-container
  19. ports:
  20. - name: nginx-port
  21. containerPort: 80
  22. protocol: TCP
3、查询deployment的详细信息
  1. # 查看deployment详细信息
  2. kubectl describe deployment xxx -n dev
  3. # 查看所有的deplyment
  4. kubectl get deployment -A
  5. # 查询某个deployment
  6. kubectl get deployment xxx -n dev
  7. # 模糊查询
  8. kubectl get deployment -A | grep xxx
  9. # 查询deployment下的所有pod
  10. kubectl get pod -A | grep deployment-name
4、删除deployment

需要注意的是,一旦删除pod控制器,此pod控制器下的所有pod和容器也会一并删除;

  1. # 第一种删除方式,直接命令删除
  2. kubectl delete deployment xxx -n dev
  3. # 第二种删除方式,使用配置文件进行删除
  4. kubectl delete -f deployment.yaml

service

1、创建service—命令行方式创建

默认创建的pod是只能对内访问的,所以需要创建一个对外的访问端口,创建一个service其实就是暴露对外的访问端口

  1. kubectl expose deployment xxx --name=service-name --port=80 --target-port=80 --type=NodePort

说明

  • expose deployment xxx : 需要暴露的deployment名称
  • --name :service名称
  • --port : service 暴露的端口
  • --target-port : 目标端口,也就是pod容器中的端口
  • --type:service类型,分为以下几个
    • ClusterIP:默认值,它是Kubernetes系统自动分配的虚拟IP,只能在集群内部访问
    • NodePort:将Service通过指定的Node上的端口暴露给外部,通过此方法,就可以在集群外部访问服务
    • LoadBalancer:使用外接负载均衡器完成到服务的负载分发,注意此模式需要外部云环境支持
    • ExternalName: 把集群外部的服务引入集群内部,直接使用

创建好service之后,查看service信息,可以看到,暴露的端口为:30474,

  • 外部访问:因为博主这边是虚拟机,所以使用主机的ip:端口,也就是192.168.253.131:30474就可以访问到页面了;
  • 内部访问:直接在虚拟机内访问10.96.216.128:80即可
  1. [root@master ~]# kubectl get svc -n dev
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. ymal-service-name NodePort 10.96.216.128 <none> 80:30474/TCP 10m
  4. # 说明
  5. CLUSTER-IP # 此ip只能内部访问
  6. PORT(S) # 我们看到上面有2个端口80:30474,80是内部访问端口,30474是外部访问的端口;
2、创建service(ymal方式创建)

新建一个service.ymal文件,内容如下

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: service-name
  5. namespace: dev
  6. spec:
  7. clusterIP: 10.96.98.123
  8. ports:
  9. - port: 80
  10. protocol: TCP
  11. targetPort: 80
  12. selector: # 标签选择器,需要和deployment的label一致
  13. deploy-label-1: ymal-label
  14. type: NodePort
3、查看service

以下三种用法都可以

  1. # 第一种
  2. kubectl get services
  3. # 第二种
  4. kubectl get services
  5. # 第三种
  6. kubectl get svc
4、删除service
  1. kubectl delete service xxx

组合查询

查询pod控制器和pod

  1. kubectl get deployment,pod -n dev

endpoint

Endpoint是kubernetes中的一个资源对象,存储在etcd中,用来记录一个service对应的所有pod的访问地址,它是根据service配置文件中selector描述产生的。

一个Service由一组Pod组成,这些Pod通过Endpoints暴露出来,Endpoints是实现实际服务的端点集合。换句话说,service和pod之间的联系是通过endpoints实现的。

每创建一个service,k8s会自动创建一个同名的 Endpoint出来

1、查看 endpoint
  1. # 一定要加s
  2. kubectl get endpoints -n dev
  3. # 查看endpoint的详细信息
  4. kubectl describe endpoints -n dev
2、删除endpoint

如果是由service创建出来的endpoints,删除后会马上创建出一个同名的endpoint出来,如果要删除必须先删除service

  1. kubectl delete endpoints xxxx -n dev
3、创建endpoint

因为每次创建一个service,k8s会自动创建一个同名的 Endpoint出来,所我们直接创建service就可以了

  1. kind: Service
  2. apiVersion: v1
  3. metadata:
  4. name: nginx
  5. namespace: dev
  6. spec:
  7. type: ClusterIP
  8. ports:
  9. - name: app-port
  10. protocol: TCP
  11. port: 80
  12. targetPort: 80
  13. selector:
  14. app: nginx-pod

其他

1、kubectl runkubectl create的区别

  1. # run后面的xxx是pod名称
  2. kubectl run xxx --image=nginx:1.17.1 --port=80
  3. # create 后面必须指定创建的资源是什么类似,比如我下面创建了一个deployment,xxx是deployment的名字,镜像是nginx,端口80,启用3个pod副本,
  4. kubectl create deployment xxx --image=nginx:1.17.1 --port=80 --replicas=3

2、—help

--help用来查看帮助文档,如果你不知道某个命令怎么使用了,就可以用--help查询命令的用法

  1. kubectl --help
  2. kubectl create --help
  3. kubectl run --help
  4. kubectl explain --help

3、explain查看资源结构

explain用来查看配置文件的 资源结构,如果不知道配置文件中的资源用有哪些结构,那么就可以使用explain命令来查看

  1. # 查看pod资源结构
  2. kubectl explain pod
  3. # 查看容器配置的资源结构
  4. kubectl explain pod.spec.containers
  5. #查看namespace资源结构
  6. kubectl explain namespace
  7. #查看service资源结构
  8. kubectl explain service
  9. # 查看deployment资源结构
  10. kubectl explain deployment

3、进入容器执行命令

  1. # 容器名称可通过命令`kubectl describe pod`查看
  2. # centos 使用 /bin/bash
  3. # ubuntu或debain 使用/bin/sh
  4. kubectl exec pod名称 -it -c 容器名称 /bin/sh

关键字Kubernetes