k8s常用命令


常用命令:

查看集群信息
[root@k8s-master ~]# kubectl cluster-info
Kubernetes control plane is running at https://172.20.10.88:6443
CoreDNS is running at https://172.20.10.88:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
查看集群配置
kubectl get cm -A
kubectl get cm -n kube-system
kubectl get cm -n kube-system kubeadm-config -o yaml
kubectl edit cm -n kube-system kubeadm-config -o yaml

# 导出配置
kubectl -n kube-system get cm kubeadm-config -o yaml > kubeadm-config.yaml
查看pod
# 查看集群所有的pod信息
kubectl get pods -A
kubectl get pods --all-namespaces
watch kubectl get pods -n kube-system

# 查看pods所在的运行节点
kubectl get pods -A -o wide
kubectl get pods --all-namespaces -o wide

# 查看pods定义的详细信息
kubectl get pods -n kube-system coredns-7bb8bb4dd7-hfj9j -o yaml

按selector名来查找pod
kubectl get pod --selector name=redis

# 在自定义列中列出资源信息
kubectl get pod -n kube-system coredns-7bb8bb4dd7-hfj9j -o custom-columns=CONTAINER:.spec.containers[0].name,IMAGE:.spec.containers[0].image
查看pod运行镜像
kubectl describe deployment coredns --namespace kube-system | grep Image | cut -d "/" -f 2
进入pod里的容器
kubectl exec -it podName  -c  containerName -n namespace -- shell comand
创建目录
kubectl exec -it spark-master-xksl -c spark-master -n spark  -- mkdir -p /usr/local/spark
注意:
shell命令前,要加-- 号,不然shell命令中的参数,不能识别

kubectl exec -it etcd-k8s-master  -n kube-system /bin/sh
查看Node
kubectl get nodes -o wide
查看namespaces
kubectl get namespace
创建namespaces
kubectl create ns development
# 或者yaml文件创建
apiVersion: v1
kind: Namespace
metadata:
  name: development
创建Deployment
# 方式1:
# kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dry-run=server|client] [--overrides=inline-json]
[--command] -- [COMMAND] [args...] [options]
kubectl run nginx --image=nginx --port=80 --replicas=2 #用命令直接创建
# 方式2:
# 生成deployment的yaml文件并apply
kubectl run nginx --image=nginx --port=80 --dry-run -o yaml > nginx-deploy.yaml
kubectl apply -f nginx-deploy.yaml
查看Deployment
# 创建deploy控制器时会自动创建rs控制器,二者具有相同的标签选择器
kubectl get deploy -A
kubectl get deployments.apps -A
kubectl get deployment -A -o wide
kubectl get deployments.apps -n kube-system coredns -o yaml
kubectl get deployments.apps -n kube-system coredns -o yaml > coredns.yaml
kubectl edit deployments.apps -n kube-system coredns -o yaml
查看DaemonSet
kubectl get ds -A
kubectl get daemonsets.apps --namespace=kube-system

kubectl edit daemonsets.apps kube-proxy --namespace=kube-system
查看service服务
kubectl get service -o wide
kubectl get svc -A
查看replicasets
kubectl get rs -A
kubectl get replicasets.apps -A
查看job
kubectl get job -A
查看cornjob
kubectl get cornjob -A
kubectl get jobs -A
暴露服务
kubectl expose deployment nginx --port=80 --type=LoadBalancer
查看详情
kubectl describe node k8s-master
kubectl describe pod -n kube-system   etcd-k8s-master
kubectl describe deployments.apps -n kube-system coredns
kubectl describe service -n kube-system kube-dns
查看日志
kubectl logs -f -n kube-system   etcd-k8s-master
kubectl logs -f -n kube-system   etcd-k8s-master --tail=1000
# Pod 有多个容器,logs 命令中使用 -c <容器名称>,以查找指定容器的日志。
[root@k8s-master ~]# kubectl logs -f -n kube-system metrics-server-v0.3.6-847cd784bf-cpgf6 
error: a container name must be specified for pod metrics-server-v0.3.6-847cd784bf-cpgf6, choose one of: [metrics-server metrics-server-nanny]
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl logs -f -n kube-system metrics-server-v0.3.6-847cd784bf-cpgf6 -c metrics-server-nanny
删除容器和服务
kubectl delete deployment 
kubectl delete service 
配置方式运行&&删除
kubectl create -f 
kubectl delete -f 
修改pod副本数的方式
# 方式1:
# 编辑coredns的deployment
kubectl edit deployments.apps -n kube-system coredns

# 方式2:
#### 动态扩展和伸缩
kubectl scale deployment -n kube-system coredns --replicas=2

#### 弹性扩容根据CPU的占用率(需要结合资源限制一同使用)
kubectl autoscale deployment -n kube-system   coredns --min=2 --max=10 --cpu-percent=80
horizontalpodautoscaler.autoscaling/coredns autoscaled

# 方式3:
修改yaml文件-->kubectl apply -f xxx.yaml
升级pod镜像的方法
#升级并记录,可实现回滚,推荐使用该方法
kubectl set image deploy/nginx nginx=nginx:1.9 --record

修改yaml文件-->kubectl apply -f xxx.yaml
kubectl edit deployments.apps -n kube-system coredns

# 滚动升级是deployment pod升级时的默认策略,也可以修改默认值
用命令kubectl edit deploy nginx可以查看默认值
``
spec:
  progressDeadlineSeconds: 600
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: coredns
  minReadySeconds: 5       #默认看不到,需要手工添加
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
``
默认情况下,当6个pod副本需要升级时:Kubernetes 将终止1个实例(6x25%=1.5个实例,向下舍去=1),创建3个新实例(6x25%=1.5个实例,向上舍入=2,加1个实例来弥补1个终止实例=3个实例),此时总共运行8个副本。
一旦新的pod就绪,它将从旧的副本集中终止另外2个实例,以便将部署恢复到所需的副本数,然后重复这个过程,直到部署完成为止。
- minReadySeconds:Kubernetes在等待设置的时间后才进行升级
- maxSurge:升级过程中最多可以比原先设置多出的POD数量
- maxUnavaible:升级过程中最多有多少个POD处于无法提供服务的状态

# 查看滚动升级历史记录:
kubectl rollout history deployment -n kube-system coredns
滚动升级相关命令
kubectl set image deploy/nginx nginx=nginx:1.7.9 --record
kubectl set image deploy/nginx nginx=nginx --record
kubectl rollout status deploy nginx #查看升级状态
kubectl rollout pause deployment nginx #升级暂停
kubectl rollout resume deployment nginx #恢复升级
kubectl describe deploy nginx #查看升级详情
kubectl rollout history deploy/nginx #查看升级历史
kubectl rollout history deployment httpd

kubectl set image deploy/nginx nginx=nginx:1.7.9 --record=true
kubectl set image deploy/nginx nginx=nginx --record=true
kubectl rollout history deployment nginx --revision=5
kubectl rollout undo deployment/nginx --to-revision=4 #回滚到指定版本
kubectl rollout undo deployment nginx-deploy #回滚到前一个版本
显式指定滚动升级参数

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx
    minReadySeconds: 5
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80

DaemonSet用于在每个Kubernetes节点中将守护进程的副本作为后台进程运行,说白了就是在每个节点部署一个Pod副本,当节点加入到Kubernetes集群中,Pod会被自动调度到该节点上运行。
每个节点有一个ds pod,新加入的节点也会自动生成一个ds pod
ds pod不受调度策略控制
使用DaemonSe场景:
1、集群存储守护程序,如glusterd、ceph要部署在每个节点上以提供持久性存储;
2、节点监视守护进程,如Prometheus监控集群,可以在每个节点上运行一个node-exporter进程来收集监控节点的信息;
3、日志收集守护程序,如fluentd或logstash,在每个节点上运行以收集容器的日志
示例:


kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
  name: nginx-ds
  labels:
    k8s-app: nginx
spec:
  template:
    metadata:
      labels:
        k8s-app: nginx
    spec:
      containers:
      - image: nginx:1.7.9
        name: nginx
        ports:
        - name: http
          containerPort: 80

无状态服务(Stateless Service):所有pod只需要共享一个持久存储,并不需要每个pod一个持久存储,并且多个实例对于同一个请求响应的结果是完全一致的
有状态服务(Stateful Service):每个pod都需要一个独立的持久存储,对于这种类型的资源,我们一般是通过创建一个Headless Service类型的服务来暴露服务,将clusterIP设置为None就是一个无头的服务。
1、有状态服务一般使用pvc模板和存储类为每个pod自动生成一对pv和pvc来实现持久化存储。
2、也可以手动创建pv,然后和利用StatefulSet中的volumeClaimTemplates自动生成的pvc进行配对。

手动创建pv用于StatefulSet
1、创建两个pv

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001        #第二个是pv002
  labels:
    release: stable
spec:
  capacity:
    storage: 1Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  hostPath:
    path: /tmp/data

2、先创建无头服务

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
    role: stateful

3、创建StatefulSet pod使用pv

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"        #使用上面创建的无头服务
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
        role: stateful
    spec:
      containers:
      - name: nginx
        image: cnych/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

volumeClaimTemplates会根据其对应的pv自动生成pvc并自动配对,数量由replicas: 2决定。

使用pvc模板和存储类自动生成pv和pvc
1、创建存储类

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: course-nfs-storage
provisioner: fuseim.pri/ifs

2、先创建无头服务

apiVersion: v1
kind: Service
metadata:
  name: nfs-web
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
    role: stateful

3、使用存储类创建StatefulSet pod

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: nfs-web
spec:
  serviceName: "nfs-web"         #使用上面创建的无头服务
  replicas: 2
  template:
    metadata:
      labels:
        app: nfs-web
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
      annotations:
        volume.beta.kubernetes.io/storage-class: course-nfs-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
            #storageClassName: course-nfs-storage        使用存储类
      resources:
        requests:
          storage: 1Gi

会自动生成两对pv和pvc

通过模版生成yaml文件

1、kubectl create deployment web --image=nginx -o yaml --dry-run>test.yaml
以nginx为镜像生成一个名为web的yaml文件,导出到test.yaml (--dry-run不会真正的创建镜像,只是尝试运行)

2、 kubectl get deploy nginx -o=yaml --export > nginx.yaml
查看一个目前已经部署的镜像:kubectl get deploy,再导出nginx的配置,生成一个nginx.yaml文件

新版2.0摒弃了一些过时api改为如下:
kubectl get deploy nginx -o=yaml > nginx.yaml

# 第一种使用kubectl create命令生成初始化yaml文件默认--namespace:default
kubectl create deployment coredns --image=registry.aliyuncs.com/google_containers/coredns:v1.8.6 -o yaml --dry-run > 1deploy-coredns.yaml
# 在 v1.18 中,was的等效标志已dry-run=server被--server-dry-run弃用。
kubectl create deployment coredns --image=registry.aliyuncs.com/google_containers/coredns:v1.8.6 -o yaml --dry-run=client > deploy-coredns.yaml

# 修改coredns的namespace:
vim deploy-coredns.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: coredns
  name: coredns
  namespace: kube-system

# 第二种方式 当资源已经部署了,从部署资源中,拿出来已经生成好的yaml文件对它做修改。使用kubectl get 命令导出yaml文件。
[root@k8s-master ~]# kubectl get deploy -A
NAMESPACE     NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   calico-kube-controllers   1/1     1            1           20h
kube-system   coredns                   1/1     1            1           5m16s

kubectl get deployment -n kube-system coredns -o=yaml > mycoredns.yaml
kubectl get deployment -n kube-system coredns -o yaml > deploy-coredns.yaml

kubectl get pod -n kube-system   coredns-6d8c4cb4d-cqb7w -o yaml > coredns.yaml
deployment是pod版本管理的工具 用来区分不同版本的pod,Deployment会保障你的容器的运行状态,如果副本数是2,删除一个Pod,Deployment会立即重启一个新的


rollout回滚

创建deployment

kubectl create deploy nginx-test --image=nginx:1.14

scale 副本数量

kubectl scale deployment nginx-test --replicas 10

如果集群支持 horizontal pod autoscaling 的话,还可以为Deployment设置自动扩展:

kubectl autoscale deployment nginx-test --min=10 --max=15 --cpu-percent=80

需要注意的是,horizontal pod autoscaling(HPA)作用于Replication Controller 对象时,再对其使用rolling update会变成无效操作,因为RC在滚动更新时,是通过创建新的RC对象来替代旧的对象,但是HPA无法自动绑定到新创建的RC对象上

更新 deployment
更新镜像

kubectl set image deployment/nginx-test nginx=nginx:1.15

回滚到上一个版本:

kubectl rollout undo deployment/nginx-test

也可以使用 --revision参数指定某个历史版本:

kubectl rollout undo deployment/nginx-test --to-revision=2

历史记录:

kubectl rollout history deployment/nginx-test

创建 Deployment 的时候使用了--record参数可以记录命令,我们可以很方便的查看每次 revision 的变化。查看单个revision 的详细信息:

kubectl rollout history deployment nginx-test --revision=1

验证发布:

kubectl rollout status deploy/nginx-test

回滚发布

kubectl rollout undo deployments/nginx-test

回滚到指定版本:还可以通过资源文件进行配置保留的历史版次量

kubectl rollout undo deployment/nginx-test --to-revision=<版次>

原理:
k8s分批次有序地进行着滚动更新,直到把所有旧的副本全部更新到新版本。实际上,k8s是通过两个参数来精确地控制着每次滚动的pod数量:

  • maxSurge 滚动更新过程中运行操作期望副本数的最大pod数,但不能为0;也可以为百分数(eg:10%)。默认为25%。
  • maxUnavailable 滚动更新过程中不可用的最大pod数,但不能为0;也可以为百分数(eg:10%)。默认为25%。

重要参数 maxSurge与maxUnavailable

  • maxSurge: 1 表示滚动升级时会先启动1个pod
  • maxUnavailable: 1 表示滚动升级时允许的最大Unavailable的pod个数
  • 由于replicas为3,则整个升级,pod个数在2-4个之间

剖析部署概况:

  • DESIRED 最终期望处于READY状态的副本数
  • CURRENT 当前的副本总数
  • UP-TO-DATE 当前完成更新的副本数
  • AVAILABLE 当前可用的副本数

滚动过程是通过控制两个副本集来完成的

autoscale自动伸缩(扩容)

使用 autoscaler 自动设置在kubernetes集群中运行的pod数量(水平自动伸缩)。

指定Deployment、ReplicaSet或ReplicationController,并创建已经定义好资源的自动伸缩器。使用自动伸缩器可以根据需要自动增加或减少系统中部署的pod数量。

使用默认的自动伸缩策略,指定目标CPU使用率,使其Pod数量在2到10之间。

kubectl autoscale deployment/nginx-test --min=2 --max=10

使其Pod的数量介于1和5之间,CPU使用率维持在80%。

kubectl autoscale deploy/nginx-test --max=5 --cpu-percent=80

通过kubectl api-versions可以看到

[root@k8s-master]# kubectl api-versions
autoscaling/v1
autoscaling/v2
autoscaling/v2beta1
autoscaling/v2beta2
autoscaling/v1 #只支持通过cpu为参考依据,来改变pod副本数
autoscaling/v2beta1 #支持通过cpu、内存、连接数以及用户自定义的资源指标数据为参考依据。
autoscaling/v2beta2 #同上,小的变动

# 使用kubectl explain来快速了解用法
kubectl explain deployment.spec
kubectl explain deployment.spec.strategy

kubectl explain hpa ##默认查询到的是autoscaling/v1版本
kubectl explain hpa --api-version=autoscaling/v2beta1 ##如果使用其他版本,可以使用--api-version指明版本

我们可以简单的通过 kubectl autoscale 命令来创建一个 HPA 资源对象
Controller默认30s轮询一次(可通过 kube-controller-manager 的--horizontal-pod-autoscaler-sync-period 参数进行设置),
查询指定的资源中的 Pod 资源使用率,并且与创建时设定的值和指标做对比,从而实现自动伸缩的功能

kubectl autoscale deployment hpa-demo --cpu-percent=10 --min=2 --max=10
kubectl autoscale deployment nginx-deployment --cpu-percent=10 --min=5 --max=20
kubectl get hpa
kubectl describe hpa nginx-deployment
kubectl edit hpa nginx-deployment
kubectl delete hpa nginx-deployment

或者用yaml 文件

注意一下如果要想让 HPA 生效,对应的 Pod 资源必须添加 requests 资源声明

kubectl describe hpa hpa-demo