zoukankan      html  css  js  c++  java
  • Kubernetes——容器集群

    kubernetes
    kubernetes(k8s)是google的容器集群管理系统,在docker的基础之上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等
    一系列完整的功能,提高了大规模容器集群管理的便捷性。

    kubernetes的优势:
    容器编排,轻量级,开源,弹性伸缩,负载均衡。
    关于kubernetes的一些重要概念:
    1、cluster——是计算、存储和网络资源的集合,k8s利用这些资源运行各种基于容器的应用。
    2、master——master是cluster的大脑,他的主要职责是调度,也即决定将容器放在那里去运行。master运行liunx操作系统,可以是物理机或者
     虚拟机,为了实现高可用,可以运行多个master。
    3、node——node的职责是运行容器应用,node由master管理,node负责监控并汇报容器的状态,同时根据master的要求来管理容器的生命周期。
     node运行在linux操作系统之上, 可以是物理机也可以是虚拟机。
    4、pod——pod是k8s的最小工作调度单元,每一个pod包含一个或者多个容器。pod中的容器会作为一个整体被调度到一个node上面去运行。
    5、controller——k8s一般不会直接创建pod,而是通过contoller来管理pod的。controller中定义了pod的部署特性,如有几个副本,在什么样的node
     上去运行等。为了满足不同的应用场景,k8s提供了多种controller,包括deployment、replicaset、daemonset、statefulset、job等
    6、deployment——这是最常用的controller,deploymentk可以管理pod的多个副本,并确保pod按照期望的状态运行。
    7、replicaset——实现了多副本的管理,使用deployment的时候会自动创建replicaset,deployment是通过replicaset来管理pod的多个副本
     我们通常无需使用replicaset。
    8、daemonset——用于每一个node最多只运行一个pod副本的场景。daemonset通常用于运行daemon。
    9、statefulset——能够保证pod的每一个副本在整个生命周期中名称是不变的,而其他的controller不提供这个功能,当某个pod发生故障需要删除
     并重新启动的时候,pod的名称会发生变化,同时statefulset会保证副本按照固定的顺序启动,更新或删除。
    10、job——用于运行结束就删除的应用, 而其他的controller的pod通常是长期运行的。
    11、service——deployment可以部署多个副本,每个pod都有自己的ip,那么外界是如何访问这些副本的呢?
     答案就是通过service,k8s的service定义了外界访问一组特定pod的方式。service有自己的ip和端口,service为pod提供了负载均衡。
     k8s运行容器pod与访问容器这两项任务分别由contorller和service来执行。
    12、namespace——可以将一个物理的cluster逻辑上划分为多个cluster,每一个cluster就是一个namespace,不同的namespace里的资源是相互隔离的。
     
    kubernetes是PAAS级的服务

    搭建k8s集群:
     首先集群的每一个节点都要做域名解析,通过host来进行通信。
     集群内部关闭firewalld和selinux
     在每一个节点上都要部署docker,并将其设为开机自启。
     保证你的服务器(或者实例)的cpu核数要大于2,一般服务器是24核的。
     

     每个节点都要关掉交换分区swap,并打开桥功能,在安装部署好docker之后才能打开桥功能(这是借助iptables来实现的)。

      #也只有在docker部署好之后才能生成/proc/sys/net/bridge/bridge-nf-call-iptables
      #echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
     每个节点准备k8s的yum文件:
      baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el6-x86_64/
     然后下载集群的相关组件:
      yum install kubeadm kubelet kubectl -y
      如果对版本有要求,直接下载对应版本的kubeadm kubelet kubectl 即可。(各个节点都要下载三个集群组件)
      kubeadm:集群初始化工具,只需要在主节点初始化即可。
      kubelet:负责在node上启动容器。
      kubectl:管控k8s集群的命令行工具。
     初始化集群:
      kubeadm init --image-repository registry.aliyuncs.com/google_containers
      --kubernetes-version v1.15.1 --apiserver-advertise-address MASTER_IP
      --pod-network-cidr=10.244.0.0/16
      然后根据提示让其它节点加入到集群。
     安装pod网络:
      kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
      确保每个节点开启了桥功能,启动了docker
     每个节点启功kubelet
     
    使用集群:
     kubectl get no #查看各个节点的状态,每一个都要ready,在master上查看。
         如果没有ready可以需要等待,节点在拉取镜像。
     kubectl api-resources #查看资源的缩写
     
    k8s——移除节点:
     设置节点为维护模式:
     kubectl drain ken3 --delete-local-data --force --ignore-daemonsets
     删除节点:
     kubectl delete no ken3
     kubectl get no
     
    k8s——加入节点:
     在刚开始初始化的时候的kubeadm join xxxxxx 的加入集群的信息还在。
      kubeadm join 172.20.10.2:6443 --token rn816q.zj0crlasganmrzsr
      --discovery-token-ca-cert-hash sha256:e339e4dbf6bd1323c13e794760fff3cbeb7a3f6f42b71d4cb3cffdde72179903
     如果已经不在,需要再生成一串信息。在master上执行:
       kubeadm token create --ttl 0 --print-join-command
       会返回加入的的初始化信息,复制这段信息。
     然后执行以下步骤加入集群:
      systemctl stop kubelet
      rm -rf /etc/kubenetes/*
      kubeadm join 172.20.10.2:6443 --token rn816q.zj0crlasganmrzsr
      --discovery-token-ca-cert-hash sha256:e339e4dbf6bd1323c13e794760fff3cbeb7a3f6f42b71d4cb3cffdde72179903
     
    k8s——集群架构
     k8s的集群由master和node组成,节点上运行着若干k8s的服务。
     master节点上运行着的后台服务有:kube-apiserver kube-scheduler kube-contorller-manager etcd和pod网络。
      kube-apiserver:api server是k8s的前端接口,各种客户端工具以及k8s其他组件可以通过它管理集群的各种资源。
      kube-scheduler:scheduler负责决定将pod放在哪个node上面去运行,另外scheduler在调度的时候会充分考虑集群的架构,
          当前的各个节点的负载,以及应用对高可用、性能、数据亲和性的需求。
      kube-contorller-manager:contorller manager负责管理集群的各种资源,保证资源处于预期的状态。
            controller manager由多种controller组成,包括:replication endpoints namespace serveraccounts等
            不同的controller管理着不同的资源,如replication controller管理deployment statefulset daemonset,
            namespace controller管理着Namespace资源。
      etcd:负责保存k8s集群的配置信息和各种资源的状态信息,当数据发生变化时,etcd会快速通知k8s的相关组件。(相当于数据库)
      pod网络:pod之间要能够相互通信,k8s集群必须掌握pod网络,flannel网络就是其中的一种可选方案。
     node节点:node是运行pod的地方,node上运行的k8s组件有kubelet kube-proxy pod网络 
      kubelet:就是node的agent,当scheduler确定在哪个节点上去运行pod后,就会将pod的具体信息发送给该节点的kubelet,kubelet
        会按照要求去创建和运行pod,并向master去汇报运行状态。
      kube-proxy:service在逻辑上代表了后端的多个pod,外界通过service去访问pod,service接受到的请求是如何转发给pod的呢?这就是
        kube-proxy需要完成的工作。
        每一个node都会运行kube-proxy服务,它负责将访问service的TCP/UDP数据转发给后端的容器,如果有多个副本,那么kube-proxy
        还会实现负载均衡。
      
     k8s的绝大多数应用服务都是以容器的方式运行的,除了kubelet
     kubelet时唯一一个没有以容器的形式运行的kubenetes组件,它在系统中通过systemd来运行。

    kubectl常用操作:
     kubectl get ns #查看namaspace
     kubectl get po -n kube-system
     #k8s的系统组件都被放到了kube-system namespace当中,这里有一个kube-dns组件,它为cluster提供DNS服务,kube-dns是在执行kubeadm init
     #时作为附加组件安装的。
     kubectl run nginx --image=nginx --replicas=2  #其中的run nginx中的nginx是控制器deployment的名字
     kubectl get po
     kubectl get po -o wide   #可以查看到在哪个node上运行的pod
     kubectl get deploy
     kubectl get rs           #查看rplicaset
     
    分析在创建pod的时候发生了什么?
     1、管理员通过命令行工具指定创建两个pod
     2、api-server会通知deployment(controller)
     3、deploy通过rs去创建两个pod副本
     4、pod的副本信息存到etcd中,同时也给到了sceduler
     5、sceduler进行调度,决定在哪个node上去创建pod,并将副本信息发送给该节点的kubelet
     6、kubelet创建运行pod,并向master汇报运行状态。
     补充:引用的配置和状态信息都保存在了etcd中,执行kubectl get pod的时候API server会从etcd中读取这些数据。
        flannel会为每个pod分配ip,因为还没有创建service,所以kube-proxy还没有参与进来。
     
    pod的生命周期:
     首先pod被创建,接着pod被调度到node进行部署运行。pod是非常忠诚的,一旦被分配到node以后,就不会离开这个node,直到被删除,生命
     周期完结。
     pod的生命周期被定义为以下几个阶段:
        pending:pod已经被创建,但是一个或者多个容器还没有被创建,这包括了容器调度阶段和容器镜像的下载过程。
        running:pod已经被调度到了node,所有的容器已经创建,并且至少有一个容器在运行或者重启。
        succeeded:pod中所有容器正常退出。
        failed:pod中所有容器退出,至少有一个容器是一次退出的。
  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    库引入问题
  • 原文地址:https://www.cnblogs.com/getbird/p/11655198.html
Copyright © 2011-2022 走看看