k8s常用命令

Posted java叶新东老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s常用命令相关的知识,希望对你有一定的参考价值。

kubectl相关

命令

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

资源分类

1、集群级别资源
资源名称缩写说明资源作用
nodesnonode节点集群组成部分
namespacens命名空间隔离Pod
2、pod资源
资源名称缩写说明资源作用
podspopod装载容器的最小单元
3、pod资源控制器
资源名称缩写说明资源作用
replicationcontrollerrc控制pod资源
replicasetsrs控制pod资源
daemonsetsds控制pod资源
jobs控制pod资源
cronjobscj控制pod资源
horizontalpodautoscalershpa控制pod资源
statefulsetssts控制pod资源
4、服务发现资源
资源名称缩写说明资源作用
servicessvc服务统一pod对外接口
ingressing统一pod对外接口

参数

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

资源管理方式

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

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

资源管理方式分类

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

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

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

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

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

使用apply创建资源,

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

node

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

说明

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

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

# 先卸载节点,但是还未删除
 kubectl drain node1 --delete-local-data --force --ignore-daemonsets

# 删除节点
kubectl delete node node2

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

kubeadm reset
3、加入节点

先在主节点创建令牌

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

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

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

namespace

1、获取所有namespace
# 第一种用法
[root@master ~]# kubectl get namespaces
NAME              STATUS   AGE
default           Active   16h   # 所有未指定namespace的对象都会被分配在default空间
kube-node-lease   Active   16h   # 集群节点之间的心跳维护,v1.13开始引入
kube-public       Active   16h   # 此命名空间可以被所有人访问(包括未认证用户)
kube-system       Active   16h   # k8s系统空间,所有由k8s创建的资源都分配到这个空间

# 第二种用法
kubectl get namespace

# 第三种用法
kubectl get ns
2、获取某个命名空间
# 获取名为default的namespace
kubectl get ns default
3、获取namespace为default的的描述信息
[root@master ~]# kubectl describe ns default
Name:         default
Labels:       <none>
Annotations:  <none>
Status:       Active

No resource quota.   # 针对namespace做的资源限制
No LimitRange resource. # LimitRange 针对 namespace中每个组件做的资源限制

说明

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

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

kubectl create ns xxx

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

apiVersion: v1
kind: Namespace
metadata: 
  name: dev

然后偶执行命令进行创建

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

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

第一种–使用命令删除

kubectl delete ns xxx

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

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

pod

1、获取所有pod
[root@master ~]# kubectl get pod -A
NAMESPACE     NAME                                       READY   STATUS                            RESTARTS   AGE
kube-system   calico-kube-controllers-7498f6cbdd-k6m4q   0/1     Running                           20         10h
kube-system   calico-node-5bj92                          0/1     Init:0/2                          1          10h
kube-system   calico-node-fqn48                          0/1     Init:0/2                          0          10h
kube-system   calico-node-r2ln8                          0/1     Init:0/2                          1          10h
kube-system   coredns-5897cd56c4-vnw4c                   0/1     ContainerCreating                 0          15h
kube-system   coredns-5897cd56c4-zvwdn                   0/1     ContainerCreating                 0          15h

第二种用法
kubectl get pods -A
 
第三种用法
kubectl get po -A

说明

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

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

kubectl get pod -A -w

其他参数

# -n 表示获取指定namespace的pod
kubectl get pod  -n kube-system

# 如果不加 -n 参数,默认获取的是default下的pod,所以以下2个命令的执行结果是一样的
kubectl get pod 
kubectl get pod -n default
2、创建pod

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

apiVersion: v1
kind: Pod
metadata: 
  name: pod-name
  namespace: dev
spec: 
  containers: 
    - image: nginx:1.17.1
      name: nginx-container
      ports: 
        - name: nginx-port
          containerPort: 80
          protocol: TCP

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

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

# 删除pod
kubectl delete pod xxx

label

1、为资源打标签(第一种方式:使用命令打标签)
# 为pod资源打标签,需要注意的是,打标签之前,pod必须提前创建好
kubectl label pod pod-name labelKey=labelValue -n deplot-name 


# 为node资源打标签
kubectl label nodes node1 nodetag=node1
2、为资源打标签(第二种方式:使用配置文件打标签)

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

apiVersion: v1
kind: Pod
metadata: 
  name: pod-name
  namespace: dev
  labels: 
    lebelKey1: "labelValue1"
    lebelKey2: "labelValue2"
    lebelKey3: "labelValue3"
spec: 
  containers: 
    - image: nginx:1.17.1
      name: nginx-container
      ports: 
        - name: nginx-port
          containerPort: 80
          protocol: TCP

执行命令创建pod

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

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

kubectl label pod pod-name labelKey=labelValue -n deplot-name  --overwrite
4、查看标签
kubectl get pod pod-name  -n dev --show-labels
5、筛选标签
# 查询lebelKey1=labelValue1的pod
kubectl get pod  -n dev -l lebelKey1=labelValue1 --show-labels

# 查询A不等于B的pod
kubectl get pod  -n dev -l A!=B --show-labels
5、删除标签

删除key为lebelKey的标签

# 删除pod资源的表标签
kubectl label pod ymal-create-pod-name lebelKey- -n dev

# 删除node资源的标签
kubectl label nodes node1 nodetag-

pod控制器(deployment)

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

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

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

kubectl create deployment app=run-cmd-nginx-deploy-3 --image=nginx:1.17.1 --port=80 --replicas=3 -n dev

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

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

[root@master ~]# kubectl get deployment -o wide -n dev --show-labels
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR                     LABELS
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文件,内容如下

apiVersion: apps/v1  # 前面的apps/必须这样写,斜杠后面随便写,暂不知为何
kind: Deployment  # 创建deployment
metadata: 
  name: ymal-deployment-name  # deployment名称
  namespace: dev  # 所属命名空间
spec: 
  replicas: 3  # 副本数量
  selector: 
    matchLabels:  # 匹配标签
      deploy-label-1: ymal-label    # 此选择器和下面的template.metadata..labels进行关联,可以发现这俩值是一样的,一样的值就会进行关联
  template:  # pod模板
    metadata:  # 以下是pod配置
      labels: 
        deploy-label-1: ymal-label
    spec: 
      containers:  # 以下是容器配置
      - image: nginx:1.17.1
        name: nginx-container
        ports: 
        - name: nginx-port
          containerPort: 80
          protocol: TCP
3、查询deployment的详细信息
# 查看deployment详细信息
kubectl describe deployment xxx -n dev

# 查看所有的deplyment
kubectl get deployment -A

# 查询某个deployment
kubectl get deployment xxx -n dev

# 模糊查询 
kubectl get deployment -A | grep xxx

# 查询deployment下的所有pod
kubectl get pod -A | grep deployment-name
4、删除deployment

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

# 第一种删除方式,直接命令删除
kubectl delete deployment xxx -n dev

# 第二种删除方式,使用配置文件进行删除
kubectl delete -f deployment.yaml

service

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

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

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即可
[root@master ~]# kubectl get svc -n dev
NAME                TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
ymal-service-name   NodePort   10.96.216.128   <none>        80:30474/TCP   10m

# 说明
  CLUSTER-IP  # 此ip只能内部访问
  PORT(S)     # 我们看到上面有2个端口80:30474,80是内部访问端口,30474是外部访问的端口;
2、创建service(ymal方式创建)

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

apiVersion: v1
kind: Service
metadata: 
  name: service-name
  namespace: dev
spec: 
  clusterIP: 10.96.98.123
  ports: 
  - port: 80
    protocol: TCP
    targetPort: 80
  selector: # 标签选择器,需要和deployment的label一致
    deploy-label-1: ymal-label
  type: NodePort
3、查看service

以下三种用法都可以

# 第一种
kubectl get services

# 第二种
kubectl get services

# 第三种
kubectl get svc
4、删除service
kubectl delete service xxx

组合查询

查询pod控制器和pod

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
# 一定要加s
kubectl get endpoints -n dev

# 查看endpoint的详细信息
kubectl describe endpoints -n dev
2、删除endpoint

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

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

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

kind: Service
apiVersion: v1
metadata:
  name: nginx
  namespace: dev
spec:
  type: ClusterIP
  ports:
  - name: app-port
    protocol: TCP
    port: 80
    targetPort: 80
  selector:
    app: nginx-pod

其他

1、kubectl runkubectl create的区别

# run后面的xxx是pod名称
kubectl run xxx --image=nginx:1.17.1 --port=80 

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

2、–help

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

kubectl --help

kubectl create --help

kubectl run --help

kubectl explain --help

3、explain查看资源结构

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

# 查看pod资源结构
kubectl explain pod
# 查看容器配置的资源结构
kubectl explain pod.spec.containers

#查看namespace资源结构
kubectl explain namespace

#查看service资源结构
kubectl explain service

# 查看deployment资源结构
kubectl explain deployment

3、进入容器执行命令

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

以上是关于k8s常用命令的主要内容,如果未能解决你的问题,请参考以下文章

k8s常用命令

K8S常用命令介绍

k8s 常用命令总结

k8s常用命令

k8s常用命令

K8S系列-2.常用命令