虚拟化容器,大数据,DBA,中间件,监控。

使用 kubectl 管理 Kubernetes 容器平台

09 11月
作者:admin|分类:容器虚拟化

  • kubectl 概述

  • kubectl 是一个用于操作 kubernetes 集群的命令行接口,通过利用 kubectl 的各种命令可以实现各种功能。
  • 环境说明(centos7.9):
      IP                    主机名           角色     内存
    192.168.2.30  k8s-master1   master   4G 
    192.168.2.40  k8s-01            slave1   3G 
    192.168.2.41  k8s-02            slave2   3G
  • kubectl 创建和删除一个 pod
    命令 说明
    run         在集群上运行一个 pod
    create    使用文件或者标准输入的方式创建一个 pod
    delete    使用文件或者标准输入以及资源名称或者标签选择器来删除某个 pod

    apply 通过文件名或控制台输入,对资源进行配置(推荐)。

  • kubectl run 语法
    kubectl run 和 docker run 一样,kubectl run 能将一个 pod 运行起来。
    语法:
    kubectl run PODNAME --image=image [--env="key=value"] [--port=port] 
  • 创建一个 nginx deployment
  • kubectl run nginx --image=nginx:latest --image-pull-policy='IfNotPresent' --port=80

    --image-pull-policy='IfNotPresent' # 如果本地不存在镜像,那么才从外网下载镜像。 默认值为:imagePullPolicy: Always 一直从外网下载镜像,不使用本地的镜像。
  • pods 常见的状态:
    1. ContainerCreating      #容器创建过程 
    2. ImagePullBackOff      #镜像拉取失败
    注:如果 pod 没有正常运行,看到的状态是 ImagePullBackOff,是因为 docker hub 没有连接上,导致镜像没有下载成功,这时,可以在 node 节点上把相关镜像手动上传一下或把 docker 源换成阿里云的。
    3. terminating ['tɜ:mɪneɪtɪŋ]    #终止 。删除 pod 时的状态
    4. Running 正常运行状态
  • 使用 kubectl delete 删除创建的对象
    删除 pod
    语法:kubectl delete pod pod 名字

    如果删除pod失败时可以使用 强制删除 --force
    -grace-period=0 正常删除pod时,会延迟一定时长才进行删除,缺省未设定的情况下会等待30s中之后删除
  • yaml 语法规则
    YAML 语言(发音 /ˈjæməl/ )的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。
    1. pod 资源 yaml 配置文件常见单词:
    kind: 同类,类型 ; 
    apiVersion API 版本 ; 
    metadata 元数据 ;
    spec: 规格,说明书(定义具体参数) ; 
    2. yaml 语法的基本语法规则如下:
    1、大小写敏感
    2、使用缩进表示层级关系
    3、缩进时不允许使用 Tab 键,只允许使用空格。
    4、缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
    5、# 表示注释,从这个字符一直到行尾,都会被解析器忽略。

  • kubectl create 加载 yaml 文件生成 deployment

  • 使用 kubectl run 在设定很复杂的需求时,需要非常长的一条语句,也很容易出错,也没法保存。所以更多场景下会使用 yaml 或者 json 文件。
  • vim mysql-deployment.yaml

    kind: Deployment #使用 deployment 创建一个 pod 资源,旧的 k8s 版本可以使用 kind: ReplicationController 来创建pod
    apiVersion: apps/v1 
    metadata:
     name: mysql #deployment 的名称,全局唯一
     namespace: default
     labels:
     k8s-app: mysql
    spec:
     selector:
     matchLabels:
     k8s-app: mysql
     replicas: 1 # Pod 副本期待数量,1 表示只运行一个 pod
     template:
     metadata:
     labels:
     k8s-app: mysql
     spec:
     containers: # Pod 中容器的定义部分
     - name: mysql #容器的名称
     image: mysql/mysql-server #容器对应的 Docker Image 镜像
     imagePullPolicy: IfNotPresent #默认值为:imagePullPolicy: Always 一直从外网,下载镜像,不使用本地的镜像
    #其他镜像下载策略参数说明:
    #IfNotPresent :如果本地存在镜像就优先使用本地镜像。这样可以直接使用本地镜像,加快启动速度
    Present [ˈpreznt] 目前;现在
    #Never:直接使用本地镜像,不再去外网拉取镜像;如果本地不存在就报异常了
     ports:
     - containerPort: 3306 #容器暴露的端口号
     protocol: TCP
     env: #注入到容器的环境变量
     - name: MYSQL_ROOT_PASSWORD #设置 mysql root 的密码
     value: "hello123"

  • 使用 mysql-deployment.yaml 创建和删除 mysql 资源


注:当一个目录下,有多个 yaml 文件的时候,使用 kubectl apply -f 目录 的方式一下全部创建
kubectl apply -f yamls/
扩展:
使用 kubectl create 和 kubectl apply 创建资源对象的区别
kubectl apply -f FILENAME 可多次执行,每次修改 YAML 文件后,使用 apply 可直接部署
kubectl create -f FILENAME 不可多次执行,每次修改 YAML 后,需要先删除资源后才能部署

推荐使用 apply 部署资源对象,delete 删除资源对象。
注意:线上都用 kubectl apply -f file.yaml

  • -o wide 参数可以查看更详细的信息
  • 总结:get 命令能够确认的信息类别:
    deployments (缩写 deploy)
    namespaces (缩写 ns)
    nodes (缩写 no)
    pods (缩写 po)
    replicasets (缩写 rs)
    services (缩写 svc)

  • 使用 describe 查看 k8s 中详细信息 describe [dɪˈskraɪb] 描述

  • 语法: kubectl describe pod pod 名字
    语法: kubectl describe node node 名字
    语法: kubectl describe deployment deployment 名字

  • 使用 describe 查看 pod 的详细描述信息
    kubectl describe pod mysql-76f8866f79-gbrpp


    使用 describe 查看 node 的详细描述信息
    kubectl describe node k8s-01


    使用 describe 查看 deployment 的详细描述信息
    kubectl describe deployment mysql
    kubectl describe deployments.apps

  • kubectl 其他常用命令和参数说明
    命令 说明
    logs     取得 pod 中容器的 log 信息
    exec    在 pod 中执行一条命令
    cp        从 pod 拷出或向 pod 拷入文件
    attach Attach   附加到一个运行中的 pod 上,实时查看 pod 消息

  • kubectl logs 类似于 docker logs,使用 kubectl logs 能够取出 pod 中镜像的 log,也是故障排除时候的重要信息
    kubectl logs mysql-76f8866f79-gbrpp
    -f 动态查看日志
    kubectl logs kube-apiserver-k8s-master1 -n kube-system -f

 

  • kubectl exec   exec 命令用于到 pod 中执行一条命令,到 mysql 的镜像中执行 cat /etc/my.cnf 命令
    kubectl exec mysql-76f8866f79-gbrpp cat /etc/my.cnf
  •  使用参数 exec -it ,直接登 pod 上中
    kubectl exec -it mysql-76f8866f79-gbrpp bash
    exit 退出容器 
    如果有多个容器  使用    -c 指定进入到 pod 具体容器里

  • 推荐写法
    kubectl exec -it mysql-76f8866f79-gbrpp -- sh
    同样 -c 可以指定进入哪个容器

  • kubectl cp
    用于从 pod 中拷出 hosts 文件到物理机的/tmp 下
    kubectl cp mysql-76f8866f79-gbrpp:/etc/hosts /tmp/hosts

     发现报错,查看帮助信息来排错

     # Requires that the 'tar' binary is present in your container #发现想要使用 kubectl cp 你的容器实例中必须有 tar 库
     # image. If 'tar' is not present, 'kubectl cp' will fail. #如果镜像中 tar 命令不存在,那么 kubectl cp 将失败

    在 pod 的容器力安装安装 tar 

     重新 cp
     

    更改 message.log 并拷贝回 pod

  •  kubectl attach
    kubectl attach 用于取得 pod 中容器的实时信息,可以直接查看容器中以 daemon 形式运行的进程输出,可以持续不断实时的取出消息。像 tail -f /var/log/messages 动态查看日志的作用。
    kubectl logs 是一次取出所有消息,像 cat /etc/passwd 
    attach [əˈtætʃ] 贴上、附上
    kubectl attach pod/kube-apiserver-k8s-master1 -n kube-system

  • 使用 kubectl 管理集群

  • kubectl 相关命令参数如下:
    kubectl edit 编辑服务器侧资源
    kubectl replace 替换,使用 yaml 配置文件来替换正在运行中的配置参数
    kubectl patch 部分更新资源相关信息
    kubectl apply 使用文件或者标准输入更改配置信息
    kubectl scale 重新设定 Deployment/ReplicaSet/RC/Job 的 size
    kubectl autoscale Deployment/ReplicaSet/RC 的自动扩展设定
    kubectl cordon 设定 node 不可使用
    kubectl uncordon 设定 node 可以使用
    kubectl drain 设定 node 进入维护模式

  • vim nginx-deployment.yaml
     

     vim nginx-svc.yaml

    注:
     nodePort: 31001 #指定是 node 物理机上监控听的端口,后期公网上的机器,可以访问此端口。
     targetPort: 80 #nginx pod 的端口号,也就是真正 docker 监听的端口号
     port: 3000 #service 服务端口号 、service 集群 IP 监听的端口,K8S 内部各个 service 服务,
    使用这个端口号进行通信 

    需要用到的镜像

    kubectl apply -f nginx-deployment.yaml
    kubectl apply -f nginx-svc.yaml

     kubectl get svc -owide

     注:发现 nginx 容器中的 80 端口已经映射到 node 物理机节点的 31001 端口上了。可以查看到 nginx 服务已经运行在 k8s-01 和 k8s-02 上了。
    http://192.168.2.30:31001/ ,http://192.168.2.40:31001/ http://192.168.2.41:31001/都可以访问到。

  • 分别查看

 echo "I am gf 192.168.2.40" > index.html && kubectl cp index.html nginx-54d66fc654-s6kgs:/usr/share/nginx/html/index.html
 

  • kubectl edit 修改服务配置

  • kubectl get -o 格式化输出,-o 指定输出的消息为 yaml 类型
  • 以 yaml 类型查看 nginx 的 service 信息

    edit 这条命令用于编辑服务器上的资源。
    改端口 31001 为 31111
    kubectl edit service nginx

  • 注:edit 编辑修改配置文件时,不需要停止服务。改完后立即生效

  • kubectl replace
    replace 就是替换,把 nodeport 端口改为 31003
    kubectl get service nginx -o yaml > nginx_replace.yaml
    vim nginx_replace.yaml
    kubectl replace -f nginx_replace.yaml

  • kubectl patch
    当修改一部分设定时,使用 patch 很方便。比如:给 pod 换个 image 镜像。
    patch [pætʃ] 补丁 
    查看当前 port 中使用的 nginx 镜像是否能解析 php:

    发现不支持 PHP,开始打补丁
    kubectl patch pod nginx-54d66fc654-ddp2l -p '{"spec":{"containers":[{"name":"nginx","image":"richarvey/nginx-php-fpm:latest"}]}}'
    kubectl patch pod nginx-54d66fc654-s6kgs -p '{"spec":{"containers":[{"name":"nginx","image":"richarvey/nginx-php-fpm:latest"}]}}'

  • kubectl apply
    apply 命令是用来使用文件或者标准输入来更改配置信息

    vim nginx-svc.yaml 

  • kubectl scale
    scale [skeɪl] 规模
    scale 命令用于横向扩展,是 kubernetes 或者 swarm 这类容器编辑平台的重要功能之一

    执行 scale 命令,使用 scale 命令进行横向扩展,将原本为 2 的副本提高到 3。相当于开 3 台 nginx 服务,来处理数据,瞬间提升 3 倍的处理数据的能力。

    kubectl scale --current-replicas=2 --replicas=3 deployment/nginx

    前后对比

  • kubectl autoscale
    autoscale 命令用于自动扩展确认,scale 需要手动执行,而 autoscale 则会根据负载进行调解。而这条命令则可以对 Deployment 进行设定,通过最小值和最大值的指定进行设定。
    kubectl autoscale deployment nginx --min=3 --max=5
    kubectl get horizontalpodautoscalers.autoscaling

     kubectl edit horizontalpodautoscalers.autoscaling

  • kubectl cordon 与 uncordon
    cordon [ˈkɔ:dn] 封锁 警戒线
    在实际维护的时候会出现某个 node 坏掉,或者做一些处理,暂时不能让生成的 pod 在此 node 上运行,需要通知 kubernetes 让其不要创建过来,这条命令就是 cordon,uncordon 则是取消这个要求。

  • 之前横向扩展到 5 个副本,发现利用 roundrobin 策略,每个 node 上运行起来了一个 pod,是平均分配的。
    执行 cordon 命令,设定 k8s-02 上不再运行新的 pod 实例,使用 get node 确认,其状态显示 SchedulingDisabled。

    kubectl cordon k8s-02

     执行 scale 命令,再次执行横向扩展命令,看是否会有 pod 漂到 k8s-02 这台机器上
     kubectl scale --replicas=8 deployment/nginx

     发现后面扩展的没有被调度到  k8s-02 上

    使用 uncordon 命令解除对 k8s-02 机器的限制

     解除限制后成功调度,恢复正常

  • kubectl drain
    kubectl drain 命令 [dreɪn] 排水
    用于对某个 node 结点进行维护。
    drain 两个作用:
    1. 设定此 node 不可以使用(cordon) 
    2. evict 驱逐 pod 到他正常的 node 节点上
    evict [ɪˈvɪkt] 驱逐
    事前准备,删除没有用的 deploy,节约点硬件资源

    执行 drain 命令,让 k8s-01 不可用,并把 k8s-01 上已经运行 pod 驱逐到其他 node 上:
    kubectl drain k8s-01 --ignore-daemonsets
    注:--ignore-daemonsets --忽略守护进程

    结果确认
    把 k8s-01 上的 pod 删除后,k8s 会根据 replicas 的机制,在清退 pod 和设定 node 时,在其他结点上生成新的 pod。这时就可以对 k8s-01 节点进行维护了,维护好后,重新 uncordon 即可。


     


  • kubectl apply -f 1.pod/deployment.yaml -o yaml --dry-run
    --dry-run 生成 yaml 模版,可选值 Must be "none", "server", or "client".

    ​​​​​​​
浏览593 评论0
返回
目录
返回
首页
k8s 控制器:Replicaset 和 Deployment K8s 之 Pod 高级用法