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

k8s.png

生命周期管理

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命令将配置应用于资源。 如果资源不在那里,那么它将被创建。

img

从执行的角度来看,如上所示,在kubectl create和kubectl apply之间第一次创建资源时没有区别。 但是,第二次kubectl create会抛出错误。简单来说,如果在单个文件上运行操作以创建资源,则create和apply基本相同。 但是, apply允许您在目录下的多个文件上同时创建和修补。

标签: k8s常用命令

添加新评论