K8s操作命令

生命周期管理

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

Deployment是指管理性能并指定 Pod 所需行为的 Kubernetes 对象。 它指定应用程序的生命周期,包括分配给应用程序的 Pod。 它提供了一种方法来传达应用程序所需的状态,控制器负责将当前状态更改为所需的状态。

部署自动执行启动 Pod 实例的过程,并确保它们按照定义在群集内的所有节点上运行。 管理员和 IT 专业人员使用部署来传达他们希望从应用程序获取的内容,然后 Kubernetes 会执行所有必要的步骤来创建应用程序的所需状态。

虽然部署定义了应用程序的运行方式,但它们并不能保证应用程序在群集中的位置。 例如,如果应用程序需要在每个节点上都有一个 Pod 实例,则需要使用 DaemonSet。 对于有状态应用程序,StatefulSet 会提供唯一的网络标识符、持久存储和有序部署/缩放。

Kubernetes 部署对象可用于:

  • 部署副本集或 Pod。
  • 纵向扩展或缩减应用程序的实例数。
  • 更新应用程序的每个正在运行的实例。
  • 将应用程序的所有正在运行的实例回滚到另一个版本。
  • 暂停或继续部署。

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

ReplicaSet 是一个进程,它运行 Pod 的多个实例并保持指定数量的 Pod 不变。 它确保在任意给定时间运行一组稳定的副本 Pod,这保证了有可用的指定数量的相同 Pod。

当某个 Pod 失败时,ReplicaSet 将启动一个新的 Pod 实例,并当正在运行的实例达到指定数量时进行纵向扩展。 反之,当创建了具有相同标签的实例时,它会纵向缩减或删除 Pod。

yaml方式

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
  labels:
    tier: nginx
spec:
  # 按你的实际情况修改副本数
  replicas: 3
  selector:
    matchLabels:
      tier: nginx
  template:
    metadata:
      labels:
        tier: nginx
    spec:
      containers:
      - name: nginx
        image: nginx-test

3. StatefulSet

StatefulSet:维护超出单个 Pod 生命周期的应用程序的状态。 与部署一样,StatefulSet 创建并管理至少一个具有唯一、持久标识和稳定主机名的相同 Pod。 StatefulSet 中的副本使用顺序方法来进行部署、缩放和升级。

StatefulSet 适合需要稳定且唯一的标识符、持久存储、有序部署和缩放的应用程序。 这类应用的例子包括 MySQL、MongoDB、Kafka 和 Cassandra。 无状态应用程序(如 Apache 和 Tomcat)并不关心它们正在使用的网络,也不需要持久存储。

StatefulSet 的主要组件是永久性卷预配程序以及无外设服务。

yaml方式

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx
  labels:
    tier: nginx
spec:
  # 必须指定一个server
  serviceName: nginx-svc
  # 按你的实际情况修改副本数
  replicas: 3
  selector:
    matchLabels:
      tier: nginx
  template:
    metadata:
      labels:
        tier: nginx
    spec:
      containers:
      - name: nginx
        image: nginx

4. DaemonSet

DaemonSet 是一个 Kubernetes 对象,可确保配置中定义的 Pod 副本始终在群集中的每个工作器节点上可用。 将新节点添加到群集时,DaemonSet 会自动分配该节点上的 Pod。

同样,删除节点时,该节点上运行的 Pod 也会被删除,并且不会在另一个节点上重新计划 (,例如,与 ReplicaSets) 一样。 这使你能够克服 Kubernetes 计划限制,并确保在群集中的所有节点上部署特定的应用程序。

DaemonSet 可提高整体群集性能。 例如,可使用它们来部署 Pod,以执行维护任务,并针对每个节点提供支持服务:

  • 运行日志收集守护程序,例如 FluentdLogstash
  • 运行监视守护程序的节点,例如 Prometheus
  • 运行群集存储守护程序,例如 glusterdceph

尽管 DaemonSet 默认在每个节点上创建 Pod,但可通过在 YAML 文件中预定义节点选择器字段来限制可接受节点的数量。 DaemonSet 控制器只会在与节点选择器匹配的节点上创建 Pod。

通常,一个 DaemonSet 可跨所有节点部署一个守护程序类型,但可能有多个 DaemonSet 使用不同的标签控制一个守护程序类型。 Kubernetes 标签根据各个节点的特征指定部署规则。

yaml方式

apiVersion: apps/v1  
kind: DaemonSet  
metadata: 
      labels: 
         app: nginx
      name: example-daemon
spec:  
  template:
    metadata:
    labels:
       	  app: nginx
          spec:  
    containers:  
        -name: nginx  
         image: nginx

5. Job

普通任务是一次性运行的短任务,部署完成后即可执行。正常退出(exit 0)后,任务即执行完成。

普通任务是用来控制批处理型任务的资源对象。批处理业务与长期伺服业务(Deployment、Statefulset)的主要区别是:

批处理业务的运行有头有尾,而长期伺服业务在用户不停止的情况下永远运行。Job管理的Pod根据用户的设置把任务成功完成就自动退出了。成功完成的标志根据不同的spec.completions策略而不同,即:

  • 单Pod型任务有一个Pod成功就标志完成。
  • 定数成功型任务保证有N个任务全部成功。
  • 工作队列型任务根据应用确认的全局成功而标志成功。

yaml方式

apiVersion: batch/v1
kind: Job
metadata:
  name: myjob
spec:
  completions: 50        # Job结束需要运行50个Pod,这个示例中就是打印1 50次
  parallelism: 5        # 并行5个Pod
  backoffLimit: 5        # 最多重试5次
  template:
    spec:
      containers:
      - name: nginx
        image: nginx
        command: ["echo", "1"]
      restartPolicy: Never

6. CronJob

定时任务是按照指定时间周期运行的短任务。使用场景为在某个固定时间点,为所有运行中的节点做时间同步。

定时任务是基于时间的Job,就类似于Linux系统的crontab,在指定的时间周期运行指定的Job,即:

  • 在给定时间点只运行一次。
  • 在给定时间点周期性地运行。

CronJob的典型用法如下所示:

  • 在给定的时间点调度Job运行。
  • 创建周期性运行的Job,例如数据库备份、发送邮件。

yaml方式

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

操作命令补充说明

1. create和apply的异同点

  • create

先删除所有现有的东西,重新根据yaml文件生成新的。所以要求yaml文件中的配置必须是完整的。

  • apply

根据配置文件里面列出来的内容,升级现有的。所以yaml文件的内容可以只写需要升级的属性。apply命令将配置应用于资源。 如果资源不在那里,那么它将被创建。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值