美文网首页
云原生架构之【Kubernetes(K8s)】第四部分:资源编排

云原生架构之【Kubernetes(K8s)】第四部分:资源编排

作者: 张毅SOHO | 来源:发表于2020-09-04 16:54 被阅读0次

    kubectl 是 K8s 集群的命令行工具,通过 kubectl 能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。

    kubectl 工具已包含在 K8s 的 Server、Node 编译程序安装包中,无需单独安装。默认情况下,启动时连接本地服务器的 8080 端口访问 K8s APIServer,因此仅可以在 K8s 的任意主控节点上使用(如果需要在工作节点或者其他主机上使用 kubectl,则需要为它创建 K8s APIServer 的连接文件,通常情况下没有这种必要性)

    目录

    1.语法结构

    2.命令清单

    3.集群部署拓扑图

    4.应用资源编排部署
    -- 4.1.使用命令部署应用
    -- 4.2.使用 YAML 文件部署应用
    5.运维管理

    附录一 更多学习资料

    附录二 安装 kubectl 命令补全工具


    1.语法结构

    kubetctl [command] [type] [name] [flages]

    • [commasnd]:指对一个或者多个资源的操作,例如:create、get、name、describe、delete 等。
    • [type] 指定资源类型(不区分大小写),多个资源通过 "," 分隔。可以通过 "kubectl api-resources" 命令查询资源类型清单。
    • name:指定资源名称(区分大小写)。
    • flags:指定可选参数。常用包括:
      -n [namespace]:指定资源的命名空间,默认值是 "default"。
      -o [output_format]:指定资源的输出方式。可选形式包括:
      ① -o json:输出 JSON 格式 API 对象。
      ② -o name:输出资源名称,不显示其他信息。
      ③ -o wide:输出资源的详细信息。
      ④ -o yaml:输出 YAML 格式的 API 对象。
      ⑤ 不指定时输出资源摘要信息。
      -s [apiserver_ip:port]:指定连接的 API Server 的 IP 和 Port,默认值是 "localhost:8080"。

    示例 1:查询所有工作节点

    [centos@k8s-master ~]$ kubectl get node
    

    示例 2:查询指定名字的工作节点

    [centos@k8s-master ~]$ kubectl get node k8s-node1
    

    示例 3:查询指定命名空间的 Pod 的摘要信息

    [centos@k8s-master ~]$ kubectl get pod -n kube-system
    

    示例 4:查询指定命名空间的 Pod 的详细信息

    [centos@k8s-master ~]$ kubectl get pod -n kube-system -o wide
    

    示例 5:查询指定命名空间的 Pod 、 Service、Node 的详细信息

    [centos@k8s-master ~]$ kubectl get pod,svc,node -n kube-system -o wide
    

    2.命令清单

    1、基础命令

    • create:通过文件名或标准输入创建资源。
    • expose:将一个新的资源暴露为新的服务。
    • run:在集群中运行一个特定的镜像(创建一个容器)。
    • set:在对象上设置特定的功能。
    • get:显示一个或多个资源。
    • edit:编辑一个资源。
    • exit:使用默认的编辑器编辑资源。
    • delete:通过文件名、标准输入、资源名称、或标签选择器来删除资源。
    • explain:查看资源的文档。

    2、部署命令

    • rollout:管理资源的发布。
    • rolling-update:对给定的复制控制器滚动更新。
    • scale:扩容或缩容 Pod 数量。
    • autoscale :创建一个自动选择扩容并设置 Pod 数量。

    3、集群管理命令

    • certficate:修改证书资源。
    • cluster-info:显示集群信息。
    • cordon:标记节点可以调度。
    • uncordon 标记节点不可调度:(节点维护情况下使用)。
    • drain:驱逐节点上的应用,准备下线(比如机器故障、更换等停机)。
    • taint:修改节点 taint 标记。

    4、故障诊断和调试命令

    • describe:显示特性资源或资源组详细信息。
    • log:在一个 Pod 中打印一个容器日志。
    • attach:附加到一个运行的容器。
    • exec:执行命令到容器。
    • port-forward:转发一个或多个本地端口到 Pod 。
    • porxy:运行一个 Porxy 到 API Server。
    • cp:拷贝文件或目录到容器中。
    • auth:检查授权。

    5、高级命令

    • apply:通过文件名或标准输入对资源应用配置。
    • patch:通过补丁修改、更新资源字段。
    • replace:通过文件名或标准输入替换一个资源。
    • covert:不同 API 版本之间转换配置文件。

    6、设置命令

    • lable:更新资源上的标签。
    • annotate:更新资源上的注释。
    • completion:用于实现 kubectl 工具自动补全。

    7、其他命令

    • api-versions:打印受支持的 API 版本。
    • api-resources:打印受支持的资源类型。
    • config:修改 kubernetes 文件(用于访问 API 的连接和认证信息等)。
    • help:所有帮助命令。
    • plugin:运行一个命令行插件。
    • version:打印客户端和服务版本信息。

    更多指令使用指南请阅读【http://docs.kubernetes.org.cn/683.html


    3.集群部署拓扑图

    K8s 集群拓扑图

    网络资源规划:

    1、Master 主控节点

    • 主机名:k8s-master
    • IP:192.168.0.20
    • 程序:kube-apiserver,kube-controllermanager,kube-scheduler
    • 操作系统:CentOS8

    2、Node 工作节点

    节点名 主机名 IP 地址 程序 操作系统
    工作节点-1 k8s-node1 192.168.0.31 kubelet,kube-proxy,docker CentOS8
    工作节点-2 k8s-node2 192.168.0.32 kubelet,kube-proxy,docker CentOS8
    工作节点≥3 k8s-node3 192.168.0.33 kubelet,kube-proxy,docker CentOS8

    3、Etcd 节点

    节点名 主机名 IP 地址 程序 操作系统
    Etcd 节点-1 k8s-etcd1 192.168.0.41 etcd CentOS8
    Etcd 节点-2 k8s-etcd2 192.168.0.42 etcd CentOS8
    Etcd 节点≥3 k8s-etcd3 192.168.0.43 etcd CentOS8

    4、SSL 证书服务器

    • 主机名:k8s-ssl
    • IP:192.168.0.50
    • 程序:CFSSL,OpenSSL
    • 操作系统:CentOS8

    5、K8s 集群网络

    • Service 子网 IP 段:10.0.0.0/16。用于为 Pod 中发布的服务自动分配 IP 地址。
    • CNI 子网 IP 段:10.254.0.0/16。用于为 Pod 中部署的容器自动分配 IP 地址。

    4.应用资源编排部署

    应用部署时,Node 工作节点会检查本地节点是否已存在镜像,如果不存在则会自动从 Docker Hub 中下载镜像。

    如果在互联网中,由于国外的 Docker Hub 限速会导致长时间部署不成功,建议通过 Docker 将镜像下载到所有的 Node 工作节点本地仓库后再创建容器。

    如果部署在隔离网络中,需要首先在能够连接互联网且装有 docker 的代理主机上拉取镜像到本地,然后从代理主机上将镜像导入到所有的 Node 工作节点上。

    Docker 获取镜像的指令:
    docker pull nginx:latest

    如何安装 Docker 及拉取、导出、导入镜像,请阅读文章《RedHat/CentOS8【Docker】镜像制作编排和容器部署》【https://www.jianshu.com/p/a4198b127729】。

    4.1.使用命令部署应用

    在任意 Master 主控节点上执行以下操作步骤:

    1、部署 Pod。

    [centos@k8s-master ~]$ kubectl create deployment web --image=nginx:latest
    

    格式:kubectl create deployment nane --image [--dry-run=server|client|none]

    参数:
    nane:资源名称。
    --image:资源镜像名称。
    --dry-run:试运行模式,不实际创建。

    2、暴露 Service。

    [centos@k8s-master ~]$ kubectl expose deployment web --port=80 --type=NodePort
    

    格式: kubectl expose deployment web [--port] [--protocol=TCP|UDP|SCTP] [--target-port] [--name][--type=ClusterIP|NodePort|LoadBalancer|ExternalName] [--dry-run=server|client|none]

    参数:
    name:资源名称。
    --port:Pod 暴露给服务的端口号,应与 Pod 提供服务的端口号一致。
    --protocol:Pod 暴露给服务的端口协议,应与 Pod 提供服务的协议一致。默认为 "TCP" 协议。
    --target-port:Pod 接收服务流量的端口号,应与 Pod 暴露给服务的端口号一致。默认值为 Pod 暴露给服务的端口号。
    --name:部署服务、端点的名字。默认值为资源名称。
    --type:暴露可访问类型,"ClusterIP" 表示仅集群内部访问,"NodePort" 表示通过端口映射访问,其他不常用。默认值 "ClusterIP" 。
    --dry-run:试运行模式,不实际创建。

    3、查看部署资源。

    [centos@k8s-master ~]$ kubectl get deploy,pod,ep,svc -o wide
    
    NAME                  READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
    deployment.apps/web   1/1     1            1           72m   nginx        nginx:latest   app=web
    
    NAME                       READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
    pod/web-756987f8f4-c9q92   1/1     Running   0          72m   10.254.1.56   k8s-node1   <none>           <none>
    
    NAME                   ENDPOINTS           AGE
    endpoints/web          10.254.1.56:80      6m6s
    
    NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE    SELECTOR
    service/web          NodePort    10.0.104.29   <none>        80:32660/TCP   6m6s   app=web
    

    4.2.使用 YAML 文件部署应用

    YAML 编写规范请阅读文章【https://www.runoob.com/w3cnote/yaml-intro.html

    在任意 Master 主控节点上执行以下操作步骤:

    1、从命令中创建 YAML 文件。

    # 创建空的 YAML 文件。
    [centos@k8s-master ~]$ touch nginx.yaml
    
    # 通过试运行模式执行命令,追加 deployment 资源的 YAML 内容到 nginx.yaml 文件中。
    [centos@k8s-master ~]$ kubectl create deployment webapp --image=nginx:latest -o yaml --dry-run=client >> nginx.yaml
    
    # 追加分隔符,YAML 使用 '---' 来分隔多个不同的 YAML 内容。
    [centos@k8s-master ~]$ echo '---' >> nginx.yaml
    
    # 通过试运行模式执行命令,追加 service 资源的 YAML 内容到 nginx.yaml 文件中。
    [centos@k8s-master ~]$ kubectl expose deployment webapp --port=80 --type=NodePort -o yaml --dry-run=client >> nginx.yaml
    

    2、编辑 YAML 文件。

    使用文本编辑器打开 YAML 文件:

    [centos@k8s-master ~]$ gedit nginx.yaml
    

    修改文件内容如下并保存:

    apiVersion: apps/v1
    # kind: DaemonSet
    # 如果将 kind 属性设置为 DaemonSet,镜像会在所有的 Node 工作节点中部署。
    kind: Deployment
    metadata:
      # 资源标签
      labels:
        app: webapp
      # 资源名称
      name: webapp
      # 资源命名空间
      namespace: default
    spec:
      # 表示 Pod 副本数,默认为 1, 扩容 Pod 副本可实现负载均衡,Pod 最大副本数建议与 Node 工作节点数
      # 当 Kind 修改为 “DaemonSet” 时,此属性不适用,注释或删除改属性。
      # replicas: 2
      replicas: 2
      selector:
        matchLabels:
          app: webapp
      template:
        metadata:
          labels:
            app: webapp
        spec:
          # 当增加 hostNetwork 属性并设置为 true 时,表示使用宿主机的网络空间,设置为 false 或不设置表示使用容器内部的网络空间。
          # hostNetwork: true
          containers:
          - image: nginx:latest
            name: nginx
            # 挂载外部存储
            # volumeMounts:
              # 容器内挂载路径
            # - mountPath: /data/hostPath/
              # 挂载存储资源的名称,名称与 volume 中 name 设置值一致
              # name: host
            # - mountPath: /data/emptyDir/
              # name: shared
            # - mountPath: /data/nfs
              # name: nfs
          # 外部存储资源
          # volumes:
            # 资源名称
          # - name: host
            # 资源类型(hostPath 表示使用 Pod 容器所在宿主机的磁盘位置,当 Pod 容器迁移时,不会同步迁移数据。使用宿主机本地磁盘可以做数据半版持久化存储,但使用宿主机挂载的网络磁盘则可以做持久化存储。)
            # hostPath:
              # 资源位置
              # path: /host
          # - name: shared
            # 资源类型(emptyDir 表示使用临时交换空间,当 Pod 启动时自动在宿主机上开辟空间,Pod 销毁时自动销毁。不能做数据持久化存储。)
            # emptyDir: {}
          # - name: nfs
            # 资源类型(nfs 表示使用 NFS 存储服务器的网络存储位置。可以做持久化存储。)
            # server: 192.168.115.6    
            # path: /nfs
    ---
    apiVersion: v1
    kind: Service
    metadata:
      creationTimestamp: null
      # 资源标签
      labels:
        app: webapp
      # 资源名称
      name: webapp
      # 资源命名空间
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
        # 设置值为暴露到宿主机网络的端口号(取值范围:30000-32767),不设置时随机取值
        nodePort: 30001
      selector:
        app: webapp
      type: NodePort
    

    3、部署 YAML 文件声明的资源。

    [centos@k8s-master ~]$  kubectl apply -f nginx.yaml
    

    4、查看部署资源。

    [centos@k8s-master ~]$ kubectl get deploy,pod,ep,svc,ing -o wide
    
    NAME                     READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES         SELECTOR
    deployment.apps/webapp   2/2     2            2           20m    nginx        nginx:latest   app=webapp
    
    NAME                          READY   STATUS    RESTARTS   AGE    IP            NODE        NOMINATED NODE   READINESS GATES
    pod/webapp-7db8b4f789-5qxpx   1/1     Running   2          20m    10.254.0.34   k8s-node2   <none>           <none>
    pod/webapp-7db8b4f789-wplfs   1/1     Running   0          20m    10.254.1.57   k8s-node1   <none>           <none>
    
    NAME                   ENDPOINTS                       AGE
    endpoints/webapp       10.254.0.34:80,10.254.1.57:80   8s
    
    NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE    SELECTOR
    service/webapp       NodePort    10.0.139.121   <none>        80:32132/TCP   8s     app=webapp
    
    NAME              CLASS    HOSTS             ADDRESS   PORTS     AGE
    ingress-web       <none>   ingress.web                 80        20h
    ingress-web-ssl   <none>   ingress.web.ssl             80, 443   18h
    

    5、创建、更新、删除、创建+更新 YAML 文件声明的资源。

    # 创建+更新部署资源
    [centos@k8s-master ~]$  kubectl apply -f nginx.yaml
    
    # 创建部署资源
    [centos@k8s-master ~]$  kubectl create -f nginx.yaml
    
    # 更新部署资源
    [centos@k8s-master ~]$  kubectl update -f nginx.yaml
    
    # 删除部署资源
    [centos@k8s-master ~]$  kubectl delete -f nginx.yaml
    

    5.运维管理

    1、使用帮助

    # 获取受支持的 API 版本。
    [centos@k8s-master ~]$ kubectl api-versions
    
    # 获取受支持的资源类型。
    [centos@k8s-master ~]$ kubectl api-resources
    
    # 获取命令行使用帮助。
    [centos@k8s-master ~]$ kubectl api-resources
    

    2、资源管理

    # 查看 Node 详细信息
    [centos@k8s-master ~]$ kubectl get node -n default -o wide
    
    # 查看 Pod 详细信息
    [centos@k8s-master ~]$ kubectl get pod -n default -o wide
    
    # 查看 Pod 运行事件信息
    [centos@k8s-master ~]$ kubectl describe pod web-756987f8f4-c9q92  -n default
    
    # 查看 Endpoint 详细信息
    [centos@k8s-master ~]$ kubectl get ep -n default -o wide
    
    # 查看 Service 详细信息
    [centos@k8s-master ~]$ kubectl get svc -n default -o wide
    
    # 查看 Deployment 详细信息
    [centos@k8s-master ~]$ kubectl get deploy -n default -o wide
    
    # 查看 Ingress 详细信息
    [centos@k8s-master ~]$ kubectl get ing -n default -o wide
    
    # 同时查看多个资源详细信息
    [centos@k8s-master ~]$ kubectl get deploy,node,pod,ep,svc,ing -n default -o wide
    
    # 升级 Pod 容器的镜像
    [centos@k8s-master ~]$ kubectl set image deployment/web nginx=nginx:1.15  -n default
    
    # 查看 Pod 容器镜像的升级状态
    [centos@k8s-master ~]$ kubectl rollout status deployment/web
    
    # 扩(缩)融 Pod 容器,--replicas 表示 Pod 副本数,默认为 1, 扩容 Pod 副本可实现负载均衡,Pod 最大副本数建议与 Node 工作节点数。
    [centos@k8s-master ~]$ kubectl scale deployment/web --replicas=2
    
    # 查看 Pod 容器的历史版本
    [centos@k8s-master ~]$ kubectl rollout history deployment/web
    
    # 将 Pod 回滚到上一个版本
    [centos@k8s-master ~]$ kubectl rollout undo deployment/web
    
    # 将 Pod 回滚到指定的版本
    [centos@k8s-master ~]$ kubectl rollout undo deployment/web --revision=2
    

    3、容器管理

    # 查看容器运行日志
    [centos@k8s-master ~]$ kubectl logs web-756987f8f4-c9q92  -n default
    
    # 在容器中执行命令
    [centos@k8s-master ~]$ kubectl exec web-756987f8f4-c9q92  ls -n default
    
    # 进入容器
    [centos@k8s-master ~]$ kubectl exec -it web-756987f8f4-c9q92 bash -n default
    
    # 从宿主机向容器中拷贝文件
    [centos@k8s-master ~]$ kubectl cp srcile.txt web-756987f8f4-c9q92:/var/destfile.txt -n default
    
    # 从容器向宿主机中拷贝文件
    [centos@k8s-master ~]$ kubectl cp web-756987f8f4-c9q92:/var/srcfile.txt destfile.txt -n default
    
    # 创建容器
    [centos@k8s-master ~]$ kubectl run busybox-container --image=busybox:1.28.4 bash
    
    # 创建容器并进入命令行
    [centos@k8s-master ~]$ kubectl run -it busybox-container2 --image=busybox:1.28.4 bash
    
    # 创建容器并进入命令行,并在退出容器时自动删除(一般用于测试)
    [centos@k8s-master ~]$ kubectl run -it --rm busybox-container --image=busybox:1.28.4 bash
    
    

    4、集群管理

    # 显示集群 API Server 和 Service 的地址
    [centos@k8s-master ~]$ kubectl cluster-info
    
    # 显示集群当前状态
    [centos@k8s-master ~]$ kubectl cluster-info dump
    
    # 显示集群当前状态,并输出到指定目录
    [centos@k8s-master ~]$ kubectl cluster-info dump --output-directory=/tmp/cluster-state
    
    # 标记工作节点 "k8s-node1" 为不可调度状态
    [centos@k8s-master ~]$ kubectl cordon k8s-node1
    
    # 标记工作节点 "k8s-node1" 为可调度状态,或用于恢复已排除的工作节点
    [centos@k8s-master ~]$ kubectl uncordon k8s-node1
    
    # 排除工作节点 "k8s-node1" 上的 Pod,排除前需要先将该节点标记为不可调度状态
    [centos@k8s-master ~]$ kubectl drain k8s-node1
    

    附录一 更多学习资料

    K8s 中文文档【https://www.kubernetes.org.cn/docs

    K8s 中文文档【https://kubernetes.io/zh/docs/home/

    K8s 指令使用指南【http://docs.kubernetes.org.cn/683.html

    YAML 编写规范【https://www.runoob.com/w3cnote/yaml-intro.html


    附录二 安装 kubectl 命令补全工具

    1、使用 yum 源安装语法补全工具 bash-completion 。

    [centos@k8s-master ~]$ sudo dnf install bash-completion
    

    2、配置当前 Shell 的 kubectl 命令补全。

    [centos@k8s-master ~]$ source /usr/share/bash-completion/bash_completion
    [centos@k8s-master ~]$ source <(kubectl completion bash)
    

    3、永久配置当前用户 Shell 的 kubectl 命令补全。

    [centos@k8s-master ~]$ echo "source <(kubectl completion bash)" >> ~/.bashrc
    [centos@k8s-master ~]$ bash
    

    3、在 Shell 中输入 "kubectl" 指令后按 "Tab" 键测试。

    [centos@k8s-master ~]$ kubectl 
    alpha          attach         completion     create         edit           kustomize      plugin         run            uncordon
    annotate       auth           config         delete         exec           label          port-forward   scale          version
    api-resources  autoscale      convert        describe       explain        logs           proxy          set            wait
    api-versions   certificate    cordon         diff           expose         options        replace        taint          
    apply          cluster-info   cp             drain          get            patch          rollout        top    
    

    相关文章

      网友评论

          本文标题:云原生架构之【Kubernetes(K8s)】第四部分:资源编排

          本文链接:https://www.haomeiwen.com/subject/mhfosktx.html