zoukankan      html  css  js  c++  java
  • k8s学习笔记之三:k8s快速入门

    一、前言

    kubectl是apiserver的客户端工具,工作在命令行下,能够连接apiserver上实现各种增删改查等各种操作
    kubectl官方使用文档:https://kubernetes.io/docs/reference/kubectl/overview/

    二、设置kubectl输入命令自动补全

    [root@k8s-master01 ~]# yum install -y bash-completion
    [root@k8s-master01 ~]# source /usr/share/bash-completion/bash_completion
    [root@k8s-master01 ~]# source <(kubectl completion bash)
    [root@k8s-master01 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc

    三、使用kubectl进行增、删、查、改等常用操作

    1.查看kubectl命令帮助

    [root@k8s-master01 ~]# kubectl  -h
    kubectl controls the Kubernetes cluster manager. 
    Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/
    Basic Commands (Beginner):    #基本命令集,适合新手
      create         Create a resource from a file or from stdin.
      expose         使用 replication controller, service, deployment 或者 pod 并暴露它作为一个 新的
    Kubernetes Service
      run            在集群中运行一个指定的镜像
      set            为 objects 设置一个指定的特征
      run-container  在集群中运行一个指定的镜像. This command is deprecated, use "run" instead
    
    Basic Commands (Intermediate):  #基本命令集,适合有一定基础的人
      get            显示一个或更多 resources
      explain        查看资源的文档
      edit           在服务器上编辑一个资源
      delete         Delete resources by filenames, stdin, resources and names, or by resources and label selector
    
    Deploy Commands:   #发布相关的命令集
      rollout        Manage the rollout of a resource
      rolling-update 完成指定的 ReplicationController 的滚动升级
      scale          为 Deployment, ReplicaSet, Replication Controller 或者 Job 设置一个新的副本数量
      autoscale      自动调整一个 Deployment, ReplicaSet, 或者 ReplicationController 的副本数量
    
    Cluster Management Commands: #集群管理相关的命令集
      certificate    修改 certificate 资源.
      cluster-info   显示集群信息
      top            Display Resource (CPU/Memory/Storage) usage.
      cordon         标记 node 为 unschedulable
      uncordon       标记 node 为 schedulable
      drain          Drain node in preparation for maintenance
      taint          更新一个或者多个 node 上的 taints
    
    Troubleshooting and Debugging Commands:  #故障检测及调试相关命令集
      describe       显示一个指定 resource 或者 group 的 resources 详情
      logs           输出容器在 pod 中的日志
      attach         Attach 到一个运行中的 container
      exec           在一个 container 中执行一个命令
      port-forward   Forward one or more local ports to a pod
      proxy          运行一个 proxy 到 Kubernetes API server
      cp             复制 files 和 directories 到 containers 和从容器中复制 files 和 directories.
      auth           Inspect authorization
    
    Advanced Commands: #高级命令集
      apply          通过文件名或标准输入流(stdin)对资源进行配置
      patch          使用 strategic merge patch 更新一个资源的 field(s)
      replace        通过 filename 或者 stdin替换一个资源
      convert        在不同的 API versions 转换配置文件
    
    Settings Commands:  #设置相关的命令集
      label          更新在这个资源上的 labels
      annotate       更新一个资源的注解
      completion     Output shell completion code for the specified shell (bash or zsh)
    
    Other Commands: #其他命令集
      api-versions   Print the supported API versions on the server, in the form of "group/version"
      config         修改 kubeconfig 文件
      help           Help about any command
      plugin         Runs a command-line plugin
      version        输出 client 和 server 的版本信息
    
    Usage:    #使用格式
      kubectl [flags] [options]
    
    Use "kubectl <command> --help" for more information about a given command.  #各个子命令如何获取命令帮助
    Use "kubectl options" for a list of global command-line options (applies to all commands).  #查看命令的通用选项(所有命令)

    #可以看到,命令帮助很人性化的帮我们对各个命令做了划分,让我们可以更好的学习和使用,下面我们开始使用kubectl命令在命令行下测试相关命令的用法

    2.创建一个应用程序

    1)创建一个应用程序,我们使用  "kubectl run " 命令,是 "kubectl run -h" 查看命令使用帮助,命令说明告诉我们这个命令可以创建一个deployment或者job的容器(deployment和job是什么意思,我们后续再讲)

    [root@k8s-master01 ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 --dry-run=true  #nginx-deploy表示deployment的名称 --image表示镜像的地址 --port表示pod暴露的端口 --replicas表示副本的个数 --dry-run表示测试,不真正执行命令
    NAME           AGE
    nginx-deploy   <unknown>
    [root@k8s-master01 ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1  #测试发现命令正常,执行命令
    deployment.apps "nginx-deploy" created  #提示我们创建成功了
    [root@k8s-master01 ~]# kubectl get deployment  #我们查看一下deployment的信息,是否有当前创建的
    NAME(名称)           DESIRED(需要pod的个数)   CURRENT(当前已经存在的个数)   UP-TO-DATE(最新创建的pod个数)   AVAILABLE(可用的pod个数)   AGE(deployment存活的时间)
    nginx-deploy           1                 1                     1                              1                        12s
    [root@k8s-master01 ~]# kubectl get pod -o wide  #获取pod的信息,-o wide 表示更详细的显示信息
    NAME(pod的名称)                READY(就绪的个数/总的个数)     STATUS(目前的状态)    RESTARTS(重启的次数)   AGE(存活的时间)       IP(pod的IP地址)           NODE(部署在哪个节点)
    nginx-deploy-7db697dfbd-qkdqp        1/1                       Running              0                   19s            10.244.2.2                  k8s-node02

    2)下面我们来访问一下这个nginx pod

    集群内访问

    [root@k8s-master01 ~]# curl -I 10.244.2.2  #在集群内进行访问,返回状态码为200,访问没有问题
    HTTP/1.1 200 OK
    Server: nginx/1.14.0
    Date: Tue, 30 Oct 2018 03:20:33 GMT
    Content-Type: text/html
    Content-Length: 612
    Last-Modified: Wed, 12 Sep 2018 00:04:31 GMT
    Connection: keep-alive
    ETag: "5b98580f-264"
    Accept-Ranges: bytes

    集群外部访问

    当我们在集群之外访问是发现无法访问,那么集群之外的客户端如何才能访问呢?这就需要我们的service服务了,下面我们就创建一个service,是外部客户端可以访问我们的pod

    3)创建一个service

    [root@k8s-master01 ~]# kubectl expose deployment nginx-deploy  --name=nginx   --port=80 --target-port=80 --type=NodePort  #
    service "nginx" exposed #使用kubectl expose 可以创建一个service ,可以使用 kubectl expose -h命令查看命令帮助,由于篇幅有限,各参数含义参考命令帮助
    [root@k8s-master01 ~]# kubectl get svc -o wide  #查看我们service的详细信息
    NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE       SELECTOR
    kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP        54m       <none>
    nginx        NodePort    10.107.16.3   <none>        80:30757/TCP   56s       run=nginx-deploy  #这是我们新创建service的信息,使用30757端口进行映射

    使用集群外客户端再一次访问,需要使用集群任意节点的IP地址加上暴露的端口号

     

    service服务有个特点,如果端口暴露类型为NodePort,那么可以通过集群内任意一台主机加暴露的端口进行访问

    4)现在我们来删除刚刚参加的pod,看看会发生什么

    [root@k8s-master01 ~]# kubectl get pod 
    NAME                            READY     STATUS    RESTARTS   AGE
    nginx-deploy-7db697dfbd-qkdqp   1/1       Running   0          2h
    [root@k8s-master01 ~]# kubectl delete pod nginx-deploy-7db697dfbd-qkdqp #删除deployment下的pod
    pod "nginx-deploy-7db697dfbd-qkdqp" deleted
    [root@k8s-master01 ~]# kubectl get pod -w  #然后迅速的查看pod状态,-w是一直等待的意思,我们可以看到pod被删除后系统又自动创建一个新的pod  (deployment管理的pod会尽量一直保持我们期望的状态)
    NAME                            READY     STATUS              RESTARTS   AGE
    nginx-deploy-7db697dfbd-46x7s   0/1       ContainerCreating   0          6s
    nginx-deploy-7db697dfbd-46x7s   1/1       Running   0         15s

    查看下deployment和service的状态

    NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    nginx-deploy   1         1         1            1           2h
    [root@k8s-master01 ~]# kubectl get svc  #service的名称和IP没有发生改变
    NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP        2h
    nginx        NodePort    10.107.16.3   <none>        80:30757/TCP   1h

    再一次访问service地址,看看是否可以访问成功

    没有问题,为什么我们删除pod之后重新创建service还可创建成功呢?这是因为service和pod直接是使用标签来进行关联的

    [root@k8s-master01 ~]# kubectl describe svc nginx   #查看nginx的信息
    Name:                     nginx
    Namespace:                default
    Labels:                   run=nginx-deploy   #我们看到nginx的标签为run=nginx-deploy
    Annotations:              <none>
    Selector:                 run=nginx-deploy
    Type:                     NodePort
    IP:                       10.107.16.3
    Port:                     <unset>  80/TCP
    TargetPort:               80/TCP
    NodePort:                 <unset>  30757/TCP
    Endpoints:                10.244.1.2:80
    Session Affinity:         None
    External Traffic Policy:  Cluster
    Events:                   <none>
    [root@k8s-master01 ~]# kubectl describe pod nginx-deploy-7db697dfbd-46x7s #在看下新创建的pod信息
    Name:           nginx-deploy-7db697dfbd-46x7s
    Namespace:      default
    Node:           k8s-node01/172.16.150.213
    Start Time:     Tue, 30 Oct 2018 13:06:02 +0800
    Labels:         pod-template-hash=3862538968
                    run=nginx-deploy  #同样也拥有run=nginx-deploy的标签
    Annotations:    <none>
    Status:         Running
    IP:             10.244.1.2
    .......(以下省略)

    5)下面我们来尝试对nginx-deploy这个deployment进行扩容和缩减操作

    扩容:

    [root@k8s-master01 ~]# kubectl get deployment 
    NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    nginx-deploy   1         1         1            1           2h
    [root@k8s-master01 ~]# kubectl scale --replicas=5 deployment nginx-deploy  #对名称为nginx-deploy类型为deployment的对象进行扩容,有初始的1个扩容到五个
    deployment.extensions "nginx-deploy" scaled
    [root@k8s-master01 ~]# kubectl get pod -w #我们可以看到pod扩容的过程
    NAME                            READY     STATUS              RESTARTS   AGE
    nginx-deploy-7db697dfbd-46x7s   1/1       Running             0          14m
    nginx-deploy-7db697dfbd-lr7wx   0/1       ContainerCreating   0          1s
    nginx-deploy-7db697dfbd-sk48l   0/1       ContainerCreating   0          1s
    nginx-deploy-7db697dfbd-tdtc8   0/1       ContainerCreating   0          1s
    nginx-deploy-7db697dfbd-xg25w   0/1       ContainerCreating   0          1s
    nginx-deploy-7db697dfbd-xg25w   1/1       Running   0         11s
    nginx-deploy-7db697dfbd-lr7wx   1/1       Running   0         12s
    nginx-deploy-7db697dfbd-sk48l   1/1       Running   0         12s
    nginx-deploy-7db697dfbd-tdtc8   1/1       Running   0         12s

    缩减:

    [root@k8s-master01 ~]# kubectl scale --replicas=3 deployment nginx-deploy  #使用replicas指定我们想要的个数即可
    deployment.extensions "nginx-deploy" scaled
    [root@k8s-master01 ~]# kubectl get pod -w
    NAME                            READY     STATUS        RESTARTS   AGE
    nginx-deploy-7db697dfbd-46x7s   1/1       Running       0          16m
    nginx-deploy-7db697dfbd-lr7wx   0/1       Terminating   0          2m
    nginx-deploy-7db697dfbd-sk48l   0/1       Terminating   0          2m
    nginx-deploy-7db697dfbd-tdtc8   1/1       Running       0          2m
    nginx-deploy-7db697dfbd-xg25w   1/1       Running       0          2m
    nginx-deploy-7db697dfbd-sk48l   0/1       Terminating   0         2m
    nginx-deploy-7db697dfbd-sk48l   0/1       Terminating   0         2m
    nginx-deploy-7db697dfbd-lr7wx   0/1       Terminating   0         2m
    nginx-deploy-7db697dfbd-lr7wx   0/1       Terminating   0         2m

    6.现在我们对nginx-deploy进行滚动升级及回滚操作,由1.14-alpine 升级到1.15-alpine,并由1.15-alpine回滚到1.14-alpine版本(nginx在docker hub上版本信息:https://hub.docker.com/_/nginx/)

    滚动升级:

    [root@k8s-master01 ~]# kubectl set image deployment nginx-deploy nginx-deploy=nginx:1.15-alpine --record #具体命令及参数含义请参考命令帮助
    deployment.apps "nginx-deploy" image updated
    [root@k8s-master01 ~]# kubectl get pod -w #观察滚动升级的过程
    NAME                            READY     STATUS              RESTARTS   AGE
    nginx-deploy-6c7dd4d9bf-c58mr   0/1       ContainerCreating   0          3s
    nginx-deploy-6c7dd4d9bf-fvmt5   0/1       ContainerCreating   0          3s
    nginx-deploy-7db697dfbd-46x7s   1/1       Running             0          27m
    nginx-deploy-7db697dfbd-xg25w   1/1       Running             0          13m
    nginx-deploy-6c7dd4d9bf-c58mr   1/1       Running   0         28s
    nginx-deploy-7db697dfbd-xg25w   1/1       Terminating   0         13m
    nginx-deploy-6c7dd4d9bf-lp7w2   0/1       Pending   0         0s
    nginx-deploy-6c7dd4d9bf-lp7w2   0/1       Pending   0         0s
    nginx-deploy-6c7dd4d9bf-lp7w2   0/1       ContainerCreating   0         0s
    nginx-deploy-7db697dfbd-xg25w   0/1       Terminating   0         13m
    nginx-deploy-7db697dfbd-xg25w   0/1       Terminating   0         13m
    nginx-deploy-7db697dfbd-xg25w   0/1       Terminating   0         13m
    nginx-deploy-6c7dd4d9bf-fvmt5   1/1       Running   0         30s
    nginx-deploy-7db697dfbd-46x7s   1/1       Terminating   0         27m
    nginx-deploy-7db697dfbd-46x7s   0/1       Terminating   0         27m
    nginx-deploy-7db697dfbd-46x7s   0/1       Terminating   0         27m
    nginx-deploy-7db697dfbd-46x7s   0/1       Terminating   0         27m
    ^C[root@k8s-master01 ~]# kubectl get pod 
    NAME                            READY     STATUS              RESTARTS   AGE
    nginx-deploy-6c7dd4d9bf-c58mr   1/1       Running             0          41s
    nginx-deploy-6c7dd4d9bf-fvmt5   1/1       Running             0          41s
    nginx-deploy-6c7dd4d9bf-lp7w2   0/1       ContainerCreating   0          13s
    [root@k8s-master01 ~]# kubectl get pod #查看最后的状态,比对一下现在的pod和之前的pod是否相同
    NAME                            READY     STATUS    RESTARTS   AGE
    nginx-deploy-6c7dd4d9bf-c58mr   1/1       Running   0          1m
    nginx-deploy-6c7dd4d9bf-fvmt5   1/1       Running   0          1m
    nginx-deploy-6c7dd4d9bf-lp7w2   1/1       Running   0          45s

    查看任意一个pod的信息,看看镜像是否升级

    [root@k8s-master01 ~]# kubectl describe pod nginx-deploy-6c7dd4d9bf-c58mr
    Name:           nginx-deploy-6c7dd4d9bf-c58mr
    Namespace:      default
    Node:           k8s-node02/172.16.150.214
    Start Time:     Tue, 30 Oct 2018 13:33:15 +0800
    Labels:         pod-template-hash=2738808569
                    run=nginx-deploy
    Annotations:    <none>
    Status:         Running
    IP:             10.244.2.5
    Controlled By:  ReplicaSet/nginx-deploy-6c7dd4d9bf
    Containers:
      nginx-deploy:
        Container ID:   docker://934e8074c90e0a5114ae846a2405515885efbcf1fcba8653a66d303f94e47253
        Image:          nginx:1.15-alpine   #image信息
        Image ID:       docker-pullable://docker.io/nginx@sha256:ae5da813f8ad7fa785d7668f0b018ecc8c3a87331527a61d83b3b5e816a0f03c
    ......(以下省略)

    版本回滚:

    [root@k8s-master01 ~]# kubectl rollout undo deployment nginx-deploy     #--to-revision 参数可以指定回退的版本
    deployment.apps "nginx-deploy" 
    [root@k8s-master01 ~]# kubectl get pod -w
    NAME                            READY     STATUS              RESTARTS   AGE
    nginx-deploy-6c7dd4d9bf-c58mr   1/1       Running             0          7m
    nginx-deploy-6c7dd4d9bf-fvmt5   1/1       Running             0          7m
    nginx-deploy-6c7dd4d9bf-lp7w2   0/1       Terminating         0          7m
    nginx-deploy-7db697dfbd-gskcv   0/1       ContainerCreating   0          4s
    nginx-deploy-7db697dfbd-ssws8   0/1       ContainerCreating   0          4s
    nginx-deploy-7db697dfbd-ssws8   1/1       Running   0         11s
    nginx-deploy-6c7dd4d9bf-fvmt5   1/1       Terminating   0         7m
    nginx-deploy-7db697dfbd-2qh7v   0/1       Pending   0         0s
    nginx-deploy-7db697dfbd-2qh7v   0/1       Pending   0         0s
    nginx-deploy-7db697dfbd-2qh7v   0/1       ContainerCreating   0         0s
    nginx-deploy-6c7dd4d9bf-fvmt5   0/1       Terminating   0         7m
    nginx-deploy-6c7dd4d9bf-lp7w2   0/1       Terminating   0         7m
    nginx-deploy-6c7dd4d9bf-lp7w2   0/1       Terminating   0         7m
    ....(以下省略)

    查看任意一个pod的信息,看看镜像是否回滚到1.14-alpine版本

    [root@k8s-master01 ~]# kubectl  get pod 
    NAME                            READY     STATUS    RESTARTS   AGE
    nginx-deploy-7db697dfbd-2qh7v   1/1       Running   0          5m
    nginx-deploy-7db697dfbd-gskcv   1/1       Running   0          5m
    nginx-deploy-7db697dfbd-ssws8   1/1       Running   0          5m
    [root@k8s-master01 ~]# kubectl describe pod nginx-deploy-7db697dfbd-2qh7v  #查看任意一个pod的版本信息,查看是否回滚到1.14版本
    Name:           nginx-deploy-7db697dfbd-2qh7v
    Namespace:      default
    Node:           k8s-node02/172.16.150.214
    Start Time:     Tue, 30 Oct 2018 13:40:55 +0800
    Labels:         pod-template-hash=3862538968
                    run=nginx-deploy
    Annotations:    <none>
    Status:         Running
    IP:             10.244.2.7
    Controlled By:  ReplicaSet/nginx-deploy-7db697dfbd
    Containers:
      nginx-deploy:
        Container ID:   docker://b75740e5919bd975755b256c83e03b63ea95cf2307ffc606abd03b59fea6634a
        Image:          nginx:1.14-alpine
        Image ID:       docker-pullable://docker.io/nginx@sha256:8976218be775f4244df2a60a169d44606b6978bac4375192074cefc0c7824ddf

    下面我们对刚刚操作的命令做一个大致的总结:

    kubectl run       #创建一个deployment或job来管理创建的容器
    kubectl get       #显示一个或多个资源,可以使用标签过滤,默认查看当前名称空间的资源
    kubectl expose    #将一个资源暴露为一个新的kubernetes的service资源,资源包括pod (po), service (svc), replicationcontroller (rc),deployment(deploy), replicaset (rs)
    kubectl describe  #显示特定资源或资源组的详细信息
    kubectl scale     #可以对Deployment, ReplicaSet, Replication Controller, 或者StatefulSet设置新的值,可以指定一个或多个先决条件
    kubectl set       #更改现有的应用程序资源
    kubectl rollout   #资源回滚管理

    以上就是kubectl命令行下一些简单的操作,主要是让我们对kubernetes有一个快速的认识,实际工作中我们应当使用yaml文件的形式来从不同维度对我们的容器进行操作(写的不好,多多包涵)

  • 相关阅读:
    Spring mvc Data Redis—Pub/Sub(附Web项目源码)
    spring mvc Spring Data Redis RedisTemplate [转]
    征服 Nginx + Tomcat【转】
    Memcached笔记——(四)应对高并发攻击【转】
    征服 Redis + Jedis + Spring (三)—— 列表操作【转】
    iBatis自动生成的主键 (Oracle,MS Sql Server,MySQL)【转】
    OpenERP登录页面调整
    OpenERP QWeb模板标签笔记
    OpenERP Web开发
    ReadOnly field saved with NULL value
  • 原文地址:https://www.cnblogs.com/panwenbin-logs/p/9875843.html
Copyright © 2011-2022 走看看