K8S

容器编排

管理容器整个生命周期的组件,其中包括:
自动容器将软件滚动更新、容器的自动扩缩容(不影响现在系统的情况下,自动创建、删除容器)、实现水平自动扩容、监控容器健康状态(监控容器,发生故障时自动修复、自动重构等),容器之间的资源的统一调度,让个别容器(一般为前端的LOADBALACE)外网能够访问,服务发现和服务注册
docker
    docker-compose,docker-swam,docker-machine
ASF
    mesos,marathon
google
    kubernetes

kubernetes

由Master和多个Node组成
    一个Master由以下组件组成
        API Server,所有的功能的调用都需要经过此服务,使用https协议且是json格式,并将结果存储于集群状态存储系统etcd中;API Server通过认证(Authentication)、授权(Authorization)和准入控制(AdmissionControl)等来管理对资源的访问请求,因此,来自于任何客户端(如 kubectl 、kubelet 、kube-proxy 等)的访问请求都必须事先完成认证之后方可进行后面的其他操作。
        Scheduler,从etcd读取保存的数据然后调度一个nodes运行此数据的容器
        Controller Manager Server,管理容器的按照期望的目标运行
        etcd,键值存储
    一个Node由以下组件组成
        kubelet,是kubernetes master的agent以控制各Node的容器的启动,停止等操作
        docker,容器执行引擎
        kube-proxy,每个容器与宿主机的通信,以及是否能让外网访问,以其自动生成iptables规则或者ipvs规则
Addons
    DNS(SkyDNS->kubeDNS->CoreDNS)
    WEB UI
    Container Resource Monitoring(Prometeheus)
    Cluster-level Logging(EFK)

kubernetes网络

节点网络,各节点网络直接通过物理网卡直接通信
pod网络,各节点网络之上直接虚拟出来一个网络,使各pod之间不需要通过nat规则可互相通信,可通过叠加网络等实现
service网络:Service一个固定IP,这是一个虚拟IP(也称为ClusterIP),并不是一个真实存在的IP,而是由k8s虚拟出来的。虚拟IP的范围通过k8s API Server的启动参数 --service-cluster-ip-range=19.254.0.0/16配置;虚拟IP属于k8s内部的虚拟网络,外部是寻址不到的。在k8s系统中,实际上是由k8s Proxy组件负责实现虚拟IP路由和转发的,所以k8s Node中都必须运行了k8s Proxy,从而在容器覆盖网络之上又实现了k8s层级的虚拟转发网络。
  在逻辑层面上,Service被认为是真实应用的抽象,每一个Service关联着一系列的Pod。在物理层面上,Service有事真实应用的代理服务器,对外表现为一个单一访问入口,通过k8s Proxy转发请求到Service关联的Pod。
Service同样是根据Label Selector来挑选Pod进行关联的,实际上k8s在Service和Pod之间通过Endpoint衔接,Endpoints同Service关联的Pod;相对应,可以认为是Service的服务代理后端,k8s会根据Service关联到Pod的PodIP信息组合成一个Endpoints。

kubernetes组件

Pod
Service
Namespace
Volume

kubernetes工作流程

 
1. kubernetes把应用程序及其周边概念抽象为资源类型,并通过属性赋值的方式实例化为对象;
2. 用户通过API server提交对象管理请求,请求创建的Pod对象由调度器调度至最佳匹配Node之上,并由kubelet创建和维护;
3. kubernetes把施加于资源对象之上的运维操作过程程序化为控制器(部署、健康状态监控、版本更新等),并由控制器通过“和解循环(reconilation loop)”不间断地监视相关对象的当前状态是否与用户定义的期望状态相吻合,二者不相符合,则启动相关的操作过程让当前状态无限接近期望的状态

使用kubeadm部署kubernetes

阿里云的镜像
cat >/etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=kubernetes 
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg   
EOF
Master01:192.168.56.159
node01-node03:192.168.56.158,192.168.56.160,192.168.56.161

Master01:
    yum install docker-ce kubeadm kubelet
配置可以访问k8s.gcr.io的环境变量vim /usr/lib/system/systemd/docker.service
添加如下内容
    Environment="HTTPS_PROXY=http://"
    Environment="NO_PROXY=192.168.50.0/24,127.0.0.0/8"
    ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
启动docker:systemctl start docker
开机自启动:systemctl enabled docker kubelet
编辑kubelet配置文件/etc/sysconfig/kubelet,忽略Swap启用
    KUBELET_EXTRA_ARGS="--fail-swap-on=false"
手动下载镜像
    kubeadm config images pull
kubernetes初始化:
    1. kubeadm init --kubernetes-version=v1.13.3 --pod-network-cidr=10.224.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
    2. 使用配置文件
        apiVersion: kubeadm.k8s.io/v1alpha2
        kind: MasterConfiguration
        kubernetesVersion: v1.12.1
        api:
          advertiseAddress: 172.20.0.71
          bindPort: 6443
          controlPlaneEndpoin: ""
        imageRepository: k8s.gcr.io
        kubeProxy:
          config:
            mode: "ipvs"
            ipvs:
              ExcludeCIDRs: null
              minSyncPeriod: 0s
              scheduler: ""
              syncPeriod: 30s
        kubeletConfiguration:
          baseConfig:
            cgroupDriver: cgroupfs
            clusterDNS:
            - 10.96.0.10
            clusterDomain: cluster.local
            failSwapon: false
            resolvConf: /etc/resolv.conf
            staticPodPath: /etc/kubernets/mainfests
        networking:
          dnsDomain: cluster.local
          podSubnet: 10.244.0.0/16
          serviceSubnet: 10.96.0.0/12
kubernetes Master初始化
    kubeadm init --config kubelet.yaml --ignore-preflight-errors=Swap

在普通用户的家用户建立
    mkdir .kube
复制cp /etc/kubernetes/admin.conf .kube/config 
chown USER.GROUP /home/USER/.kube/config
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f FLANNEL插件

node01-node03:
安装kubeadm
    yum install kubeadm kubelet docker-ce
启动docker:systemctl start docker
开机自启动:systemctl enabled docker kubelet
编辑kubelet配置文件/etc/sysconfig/kubelet,忽略Swap启用
    KUBELET_EXTRA_ARGS="--fail-swap-on=false"
手动下载镜像或使用Master节点已经下载的镜像
    docker save 
    docker load
kubeadm join 192.168.50.81:6443 --token egfevi.5qhvsgp9sgkubfmq --discovery-token-ca-cert-hash sha256:e877d8d7b9f7d0fbc4bb3ba3506f2b5ddbd3f0ab091147eb93f7d4595e014a2f

kubectl

kubectl的命令由此可以分为三类:陈述式命令(imperative command)、陈述式对象配置(imperative object configuration)和声明式对象配置( declarative object configuration)。第一种方式即此前用到的run、expose、delete 和get等命令;陈述式管理方式包括create 、delete 、get和replace等命令;声 明式对象配置并不直接指明要进行的对象管理操作,而是提供配置清单文件给Kubernetes 系统, 并委托系统跟踪活动对象的状态变动,资源对象的创建、删除及修改操作全部通过唯一的命令 apply来完成。
最基本的语法格式为kubectl [command] [TYPE] [NAME] [flags]
    [command]
        create 通过文件或标准输入创资源
        expose 基于rc、service、deployment或pod创建service资源
        run 通过创建Deployment在集群中运行指定镜像
        set 设置资源的特定属性
        get 显示一个或多个资源
        explain 打印资源文档
        edit 编辑资源
        delete 基于文件名、stdin、资源或者名字、以及资源和资源和选择器删除资源
        rollout 管理资源的滚动更新
        scale 伸缩Deployment、ReplicaSet、RC的规模
        cluster-info 集群信息
        top 资源的使用率
        describe 显示指定资源或资源组的详细信息
        logs 显示Pod内某容器的日志
        exec 在容器执行某些命令
        apply 基于文件或stdin将配置应用于资源
        patch 使用策略合并补丁跟新资源字段
        replace 基于文件或stdin替换一个资源
        config 配置kubeconfig文件的内容
显示当前版本
    kubectl version --short=true
显示当前集群信息
    kubectl cluster-info
显示已部署应用的详细信息
部署一个pod
    kubectl create deployment 
        kubectl create deployment my-app --image=ikubernetes/myapp:v1
升级指定pod的版本
    kubectl set image deployment <resource> <name>
        kubectl set image deployment my-app myapp=ikubernetes/myapp:v2
为指定pod扩展节点
    kubectl scale --replicas=2 deployment <RESOURCE>
        kubectl scale --replicas=3 deployment my-app
为指定pod建立service
    kubectl create service clusterip NAME [--tcp=<port>:<targetport>]