zoukankan      html  css  js  c++  java
  • kubernetes-核心概念及创建应用(六)

    kubernetes是什么:

    •Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S。
    •K8S用于容器化应用程序的部署,扩展和管理。
    •K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能。
    •Kubernetes目标是让部署容器化应用简单高效。
    官方网站:http://www.kubernetes.io

    kubernetes特性:
    自我修复:在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
    弹性伸缩:使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。
    自动部署和回滚:K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响业务。
    服务发现和负载均衡:K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。
    机密和配置管理:管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。
    存储编排:挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。
    批处理:提供一次性任务,定时任务;满足批量数据处理和分析的场景。

    kubernetes核心概念:

    Pod

    Pod是最小部署单元,每个Pod包含一个或多个容器,Pod中的容器会作为一个整体被Master调度到一个Node上运行。

    Kubernetes引入Pod主要基于下面两个目的:

    1、可管理性
    有些容器天生就是需要紧密联系,一起工作。Pod 提供了比容器更高层次的抽象,将它们封装到一个部署单元中。Kubernetes 以 Pod 为最小单位进行调度、扩展、共享资源、管理生命周期
    
    2、通信和资源共享
    Pod中的所有容器使用同一个网络namespace即相同的IP地址和Port空间,它们可以直接用localhost通信。同样的,这些容器可以共享存储,当Kubernetes挂载volume到Pod本质上是将volume挂载到Pod中的每一个容器。
    Controllers

    Kubernetes 通常不会直接创建Pod,而是通过Controller来管理Pod的。Controller中定义了Pod的部署特性,比如有几个副本,在什么样的Node上运行等。为了满足不同的业务场景,Kubernetes 提供了多种 Controller,包括 Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 等。

    Deployment :无状态应用部署。是最常用的 Controller,Deployment可以管理Pod的多个副本,并确保Pod按照期望的状态运行。
    ReplicaSet :确保预期的Pod副本数量。使用Deployment时会自动创建ReplicaSet,也就是说Deployment是通过ReplicaSet来管理Pod的多个副本,我们通常不需要直接使用ReplicaSet。
    DaemonSet :用于每个Node最多只运行一个Pod副本的场景。正如其名称所揭示的,DaemonSet通常用于运行daemon。
    StatefulSet :有状态应用部署。能够保证Pod的每个副本在整个生命周期中名称是不变的。当某个Pod发生故障需要删除并重新启动时,Pod的名称会发生变化。同时会保证副本按照固定的顺序启动、更新或者删除。
    Job :一次性任务。用于运行结束就删除的应用。
    Cronjob :定时任务
    Service

    防止Pod失联。定义一组Pod的访问策略。

    Deployment可以部署多个副本,每个Pod都有自己的IP,而Pod很可能会被频繁地销毁和重启,它们的IP会发生变化,用IP来访问不太现实。
    Kubernetes Service 定义了外界访问一组特定Pod的方式。Service有自己的IP和端口,Service为Pod提供了负载均衡。
    Kubernetes 运行容器(Pod)与访问容器(Pod)这两项任务分别由 Controller 和 Service 执行。
    Namespaces

    命名空间,将对象逻辑上隔离

    Namespace 可以将一个物理的Cluster逻辑上划分成多个虚拟Cluster,每个Cluster就是一个Namespace。不同Namespace里的资源是完全隔离的。
    
    Kubernetes 默认创建了两个 Namespace。
    default -- 创建资源时如果不指定,将被放到这个Namespace中。
    kube-system -- Kubernetes 自己创建的系统资源将放到这个Namespace中。
    Label

    标签,附加到某个资源上,用于关联对象、查询和筛选

    K8s资源对象上的key/value对。同一个对象的labels属性的key必须唯一。label可以附加到各种资源对象上,如Node,Pod,Service,RC等。
    通过给指定的资源对象捆绑一个或多个不用的label来实现多维度的资源分组管理功能,以便于灵活,方便地进行资源分配,调度,配置,部署等管理工作。
    默认配置下,Scheduler会将Pod调度到所有可用的 Node。不过有些实际情况我们希望将 Pod部署到指定的Node,比如将有大量磁盘 I/O 的 Pod 部署到配置了 SSD 的 Node;或者 Pod 需要 GPU,需要运行在配置了 GPU 的节点上。

    kubectl命令行管理工具

    kubectl命令常用选项:

    kubectl工具管理资源

    创建应用

    [root@k8s-master1 ~]# kubectl run nginx --replicas=3 --image=nginx:1.14 --port=80
    kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
    deployment.apps/nginx created
    [root@k8s-master1 ~]# kubectl get deploy,pods
    NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.extensions/nginx   1/3     3            1           32s
    
    NAME                         READY   STATUS              RESTARTS   AGE
    pod/nginx-7bc87ddb4d-cwptc   0/1     ContainerCreating   0          32s
    pod/nginx-7bc87ddb4d-krl94   0/1     ContainerCreating   0          32s
    pod/nginx-7bc87ddb4d-xzbjn   1/1     Running             0          32s

    发布

    [root@k8s-master1 ~]# kubectl expose deployment nginx --port=80 --type=NodePort --target-port=80 --name=nginx-service
    service/nginx-service exposed
    [root@k8s-master1 ~]# kubectl get service
    NAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
    kubernetes      ClusterIP   10.0.0.1     <none>        443/TCP        19h
    nginx-service   NodePort    10.0.0.201   <none>        80:37857/TCP   36s

    更新

    [root@k8s-master1 ~]# kubectl set image deployment/nginx nginx=nginx:1.15
    [root@k8s-master1 ~]# kubectl get deploy,pods -o wide
    NAME                          READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES       SELECTOR
    deployment.extensions/nginx   3/3     3            3           9m44s   nginx        nginx:1.15   run=nginx
    
    NAME                         READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
    pod/nginx-6f7d58d4cc-24x56   1/1     Running   0          6s    172.17.92.2   192.168.0.126   <none>           <none>
    pod/nginx-6f7d58d4cc-jnlx7   1/1     Running   0          14s   172.17.92.3   192.168.0.126   <none>           <none>
    pod/nginx-6f7d58d4cc-wpk6n   1/1     Running   0          28s   172.17.19.3   192.168.0.125   <none>           <none>

    回滚

    [root@k8s-master1 ~]# kubectl rollout history deployment/nginx
    deployment.extensions/nginx 
    REVISION  CHANGE-CAUSE
    1         <none>
    2         <none>
    
    [root@k8s-master1 ~]# kubectl rollout undo deployment/nginx
    deployment.extensions/nginx rolled back
    [root@k8s-master1 ~]# kubectl get deploy,pods -o wide
    NAME                          READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES       SELECTOR
    deployment.extensions/nginx   3/3     3            3           11m   nginx        nginx:1.14   run=nginx
    
    NAME                         READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
    pod/nginx-7bc87ddb4d-nqc6f   1/1     Running   0          44s   172.17.19.2   192.168.0.125   <none>           <none>
    pod/nginx-7bc87ddb4d-tqmxl   1/1     Running   0          40s   172.17.92.3   192.168.0.126   <none>           <none>
    pod/nginx-7bc87ddb4d-zstkj   1/1     Running   0          42s   172.17.92.2   192.168.0.126   <none>           <none>

    删除

    [root@k8s-master1 ~]# kubectl delete deploy/nginx
    deployment.extensions "nginx" deleted
    [root@k8s-master1 ~]# kubectl delete svc/nginx-service
    service "nginx-service" deleted

     YAML配置文件管理资源

    配置文件说明:

    定义配置时,指定最新稳定版API(当前为v1);
    配置文件应该存储在集群之外的版本控制仓库中。如果需要,可以快速回滚配置、重新创建和恢复;
    应该使用YAML格式编写配置文件,而不是JSON。尽管这些格式都可以使用,但YAML对用户更加友好;
    可以将相关对象组合成单个文件,通常会更容易管理;
    不要没必要的指定默认值,简单和最小配置减少错误;
    在注释中说明一个对象描述更好维护。

    语法格式:

    •缩进表示层级关系
    •不支持制表符“tab”缩进,使用空格缩进
    •通常开头缩进2 个空格
    •字符后缩进1 个空格,如冒号、逗号等
    •“---” 表示YAML格式,一个文件的开始
    •“#”注释

    以YAML文件方式创建deployment

    [root@k8s-master1 nginx]# vim nginx-deployment.yaml
    apiVersion: apps/v1beta2
    kind: Deployment
    metadata:
      name: nginx-deployment
      namespace: default
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.15
            ports:
            - containerPort: 80

    [root@k8s-master1 nginx]# kubectl create -f nginx-deployment.yaml
    deployment.apps/nginx-deployment created

    查看deployment,pod

    [root@k8s-master1 nginx]# kubectl get deploy,pod
    NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.extensions/nginx-deployment   3/3     3            3           2m4s
    
    NAME                                    READY   STATUS    RESTARTS   AGE
    pod/nginx-deployment-5fc86c987f-cx9t7   1/1     Running   0          2m4s
    pod/nginx-deployment-5fc86c987f-gj2v9   1/1     Running   0          2m4s
    pod/nginx-deployment-5fc86c987f-r5w7n   1/1     Running   0          2m4s

    对副本数进行扩容

    [root@k8s-master1 nginx]# kubectl scale deployment nginx-deployment --replicas 5
    deployment.extensions/nginx-deployment scaled
    [root@k8s-master1 nginx]# kubectl get deploy,pod -o wide
    NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES       SELECTOR
    deployment.extensions/nginx-deployment   5/5     5            5           18m   nginx        nginx:1.15   app=nginx
    
    NAME                                    READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
    pod/nginx-deployment-5fc86c987f-cx9t7   1/1     Running   0          18m   172.17.19.3   192.168.0.125   <none>           <none>
    pod/nginx-deployment-5fc86c987f-gj2v9   1/1     Running   0          18m   172.17.92.2   192.168.0.126   <none>           <none>
    pod/nginx-deployment-5fc86c987f-q7rhb   1/1     Running   0          4s    172.17.92.3   192.168.0.126   <none>           <none>
    pod/nginx-deployment-5fc86c987f-r5w7n   1/1     Running   0          18m   172.17.19.2   192.168.0.125   <none>           <none>
    pod/nginx-deployment-5fc86c987f-sqksm   1/1     Running   0          4s    172.17.19.4   192.168.0.125   <none>

    使用service提供外部访问

    [root@k8s-master1 nginx]# vim nginx-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
      labels:
        app: nginx
    spec:
      type: NodePort
      ports:
      - port: 80
        targetPort: 80
      selector:
        app: nginx
    
    
    [root@k8s-master1 nginx]# kubectl create -f nginx-service.yaml 
    service/nginx-service created
    [root@k8s-master1 nginx]# kubectl get svc -o wide
    NAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE   SELECTOR
    kubernetes      ClusterIP   10.0.0.1     <none>        443/TCP        20h   <none>
    nginx-service   NodePort    10.0.0.194   <none>        80:41854/TCP   20s   app=nginx

    浏览器访问Node IP:41854

    帮助生成YAML文件的方式
    •用run命令生成
    kubectl run --image=nginx my-deploy -o yaml --dry-run > my-deploy.yaml
    •用get命令导出
    kubectl get my-deploy/nginx-o=yaml --export > my-deploy.yaml
    •Pod容器的字段拼写忘记了
    kubectl explain pods.spec.containers
  • 相关阅读:
    [CF1042F]Leaf Sets
    [CF1051F]The Shortest Statement
    [洛谷P1792][国家集训队]种树
    [CF484E]Sign on Fence
    [洛谷P2216][HAOI2007]理想的正方形
    [洛谷P4389]付公主的背包
    [洛谷P4726]【模板】多项式指数函数
    服务器上Ubuntu系统安装
    删除ubuntu系统
    Win10下安装Ubuntu16.04双系统
  • 原文地址:https://www.cnblogs.com/yuezhimi/p/10142650.html
Copyright © 2011-2022 走看看