• Kubectl概述
      • kubectl是Kubernetes集群的命令行管理工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。
    • Kubectl常用示例
      可以通过kubectl help命令获取更多的信息。
      ```bash Basic Commands (Beginner): create Create a resource from a file or from stdin. expose 使用 replication controller, service, deployment 或者 pod 并暴露它作为一个 新的 Kubernetes Service run 在集群中运行一个指定的镜像 set 为 objects 设置一个指定的特征

    Basic Commands (Intermediate): explain 查看资源的文档 get 显示一个或更多 resources 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 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替换一个资源 wait Experimental: Wait for one condition on one or many resources convert 在不同的 API versions 转换配置文件

    Settings Commands: label 更新在这个资源上的 labels annotate 更新一个资源的注解 completion Output shell completion code for the specified shell (bash or zsh)

    Other Commands: alpha Commands for features in alpha api-resources Print the supported API resources on the server api-versions Print the supported API versions on the server, in the form of “group/version” config 修改 kubeconfig 文件 plugin Runs a command-line plugin version 输出 client 和 server 的版本信息

    1. - 创建Pod
    2. - Pod在集群内部可以直接访问。
    3. ```bash
    4. # 创建容器,指定副本数量为1个
    5. $ kubectl run nginx-test --image=nginx:1.14.1-alphine --port=80 --replicas=1
    6. # 查看pod信息
    7. $ [root@master ~]# kubectl get pods -o wide
    8. NAME READY STATUS RESTARTS AGE IP NODE
    9. nginx-test-8f7b9b965-88t6r 1/1 Running 0 4h13m 10.244.1.2 node1.larryyu.com
    10. # 删除pod
    11. $ kubectl delete pod nginx-test-8f7b9b965-88t6r
    12. pod "nginx-test-8f7b9b965-88t6r" deleted
    13. # 删除后k8s会自动创建一个pod来满足用户要求。
    14. $ kubectl get pods
    15. NAME READY STATUS RESTARTS AGE
    16. nginx-test-8f7b9b965-kn6d4 0/1 ContainerCreating 0 7s
    17. # k8s在创建pod后,会按照用户要求来保证pod的状态,此时删除了这个pod,k8s会自动重新启动一个容器来满足此pod需要有一个容器的需求。
    • 动态伸缩Pod规模

      # 扩展到3个副本
      $ kubectl scale --replicas=3 deployment nginx-test
      deployment.apps/nginx-test scaled
      $ kubectl get pods
      NAME                         READY   STATUS    RESTARTS   AGE
      nginx-test-8f7b9b965-b8khq   1/1     Running   0          6s
      nginx-test-8f7b9b965-s88rk   1/1     Running   0          6s
      nginx-test-8f7b9b965-tncjs   1/1     Running   0          34m
      
    • 灰度升级Pod

      # 将deployment的nginx-test中的镜像升级为1.15
      $ kubectl set image deployment nginx-test nginx-test=nginx:1.15-alpine
      deployment.apps/nginx-test image updated
      # 获取Pod信息,可以看到在升级过程中会出现临时大于3个Pod的情况,多出的就是新升级的Pod。
      $ kubectl get pods
      NAME                          READY   STATUS              RESTARTS   AGE
      nginx-test-65bd7df976-kts8q   1/1     Running             0          17s
      nginx-test-65bd7df976-rtq9n   1/1     Running             0          8s
      nginx-test-65bd7df976-zrv8n   0/1     ContainerCreating   0          0s
      nginx-test-8f7b9b965-b8khq    1/1     Terminating         0          5m44s
      nginx-test-8f7b9b965-tncjs    1/1     Running             0          39m
      # 升级完成后会变成3个Pod
      $ kubectl get pods
      NAME                          READY   STATUS    RESTARTS   AGE
      nginx-test-65bd7df976-kts8q   1/1     Running   0          2m37s
      nginx-test-65bd7df976-rtq9n   1/1     Running   0          2m28s
      nginx-test-65bd7df976-zrv8n   1/1     Running   0          2m20s
      # 通过kubectl describe可以查看容器镜像信息
      $ kubectl describle pod nginx-test-65bd7df976-kts8q
      ...
      Containers:
      nginx-test:
      Image:          nginx:1.15-alpine # 镜像版本
      ...
      # 回滚操作
      $ kubectl rollout undo deployment nginx-test
      
    • 前面我们已经能够通过Deployment调用ReplicaSet来创建一组Pod来提供高可用的服务,会为每个Pod分配一个单独的Pod IP,但却存在以下问题

      • Pod IP仅仅是集群内可见的虚拟IP,外部无法访问
      • Pod IP会随着Pod的销毁而消失,当ReplicaSet对Pod进行动态伸缩调整时,可能无法访问这个Pod服务

    此时,可以通过K8S提供的Service来解决

    • Service介绍

      • service可以看做是一组日工相同服务的Pod对外的访问接口,借助Service,应用可以方便的实现服务发现和负载均衡
      • 创建service

        $ kubectl expose deployment nginx-test --name=nginx --port=80 --target-port=80 --protocol=TCP  
        # 查看service ip
        $ kubectl get svc
        NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
        kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP   2d17h
        nginx        ClusterIP   10.97.193.24   <none>        80/TCP    39s
        
      • 此时无论Pod如何动态伸缩,均可通过service Ip访问,原理就是service通过绑定deployment中的Labels标签来识别Pod,无论Pod地址如何变化,均可通过Labels来绑定到Pod

        # 查看service详细信息
        $ kubectl describe service nginx
        Name:              nginx
        Namespace:         default
        Labels:            run=nginx-test  # 绑定的deployment标签
        Annotations:       <none>
        Selector:          run=nginx-test
        Type:              ClusterIP
        IP:                10.97.193.24
        Port:              <unset>  80/TCP
        TargetPort:        80/TCP
        Endpoints:         10.244.2.5:80
        Session Affinity:  None
        Events:            <none>
        # 查看deployment标签信息,通过这个标签绑定即可
        [root@master ~]# kubectl get deployment -o wide
        NAME         READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES              SELECTOR
        nginx-test   1/1     1            1           2d2h   nginx-test   nginx:1.14-alpine   run=nginx-test
        
      • 上面创建的Service类型为ClusterIP,Service还支持以下几种类型

    • Service类型
      • ClusterIP:默认值,给这个Service分配一个ClusterIP,是K8s自动分配的虚拟IP,只能在集群内部访问
      • NodePort:将Service通过指定的Node上的端口暴露给外部,通过此方法,访问任意一个NodeIP:nodePort都将路由到ClusterIP,从而到该Pod服务
      • LoadBalancer:在NodePort的基础上,借助cloud provider创建一个负载均衡器,并将请求转发到:NodePort,此模式只能在云服务器上使用
      • ExternalName:将服务通过DNS CNAME记录方式转发到指定域名,通过spec.externlName设定
    • 创建可以在集群外部访问Service

      $ kubectl edit svc nginx
      ...
      spec:
      clusterIP: 10.97.193.24
      ...
      type: NodePort  # NodePort既表示可在集群外部访问
      ...
      $ kubectl get svc
      NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
      kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        2d18h
      nginx        NodePort    10.97.193.24   <none>        80:32708/TCP   67m # 可以看到会映射到外部32708端口
      
    • 创建Pod流程

    11-使用kubectl进行应用部署 - 图1

    1、kubectl提交创建Pod,API相应请求,通过一系列的认证授权,把Pod数据存储到etcd,创建Deployment资源并初始化

    2、Controller通过list-watch机制,检测发现新的deployment,发现该资源没有关联Pod和ReplicaSet,启动Deploument Controller创建ReplicaSet资源,在启用ReplicaSet Controller创建Pod

    3、所有COntroller正常后,将Deployment,replicaSet,pod资源信息更新到etcd

    4、Scheduler通过list-watch机制,检测发现新的Pod,进过打分选择规则,将Pod绑定到合适的主机

    5、将绑定结果更新的etcd

    6、kubectl每个20s向kube-apiserver通过NodeName获取自身Node上所要运行的Pod清单,通过与自己的内存缓存进行比较,新增Pod

    7、启动Pod启动容器

    8、将容器信息Pod信息同步到etcd。