kubernetes

kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用。简称K8s,是用8代替8个字符“ubernete”而成的缩写。
    容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,使用容器可以在build或release 的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚拟机轻量、更“透明”,这更便于监控和管理。
    每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。
Kubernetes 的特点:
    可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
    可扩展: 模块化,插件化,可挂载,可组合
    自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展

kubernetes组件

Master 组件
    kube-apiserver:所有服务访问统一入口
    ETCD:键值对数据库,存储k8s集群所有重要信息
    controller-manager:维持副本期望数目
    kube-scheduler:任务调度,选择合适的节点进行任务分配
    COREDNS:为集群中的SVC创建一个域名IP的对应关系解析
节点(Node)组件
    kubelet:直接和容器引擎交互实现容器的生命周期管理
    kube-proxy:写入规则到IPTABLES,IPVS,实现服务映射访问
    docker: 用于运行容器
    supervisord:supervisord是一个轻量级的监控系统,用于保障kubelet和docker运行
    fluentd:一个守护进程,可提供cluster-level logging

kubernetes资源

资源:k8s中所有内容都抽象为资源,资源实例化后叫做对象。
资源清单:k8s中,一般使用yaml格式的文件来创建符合我们预期的pod,这样的yaml文件称为资源清单
集群资源分类:
    名称空间级别资源:
        工作负载型资源:pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job
        服务发现型及负载均衡型资源:Service,Ingress
        配置与存储型资源:Volume(存储卷),CSI(容器存储接口,可以扩展各种各样的第三方存储卷)
        特殊类型存储卷:ConfigMap(当配置中心来使用),Secret(保存敏感数据),DownwardAPI(把外部环境中的信息输出给容器)
    集群级别资源:Namespace,Node,Role,ClusterRole,Rolebinding,ClusterRoleBinding
    元数据型资源:HPA,PodTemplate,LimitRange

Pod的分类

自主式Pod:当Pod退出后,此类型的Pod不会被创建
控制器管理的Pod:在控制器的生命周期里,始终要维持Pod的副本数目

init容器

Pod能够具有多个容器,应用运行在容器里面,但是它也可能有一个或多个先于容器启动的init容器。
init容器与普通容器非常像,除了如下两点:
    init容器总是运行到成功完成为止
    每个init容器都必须在下一个init容器启动之前成功完成
如果pod的init容器失败了,kubernetes会不断的重启该pod,直到init容器成功为止,然而,如果pod对应的restartPolicy为never,它不会重启。

Service类型

ClusterIp: 默认类型,自动分配一个仅Cluster内部可以访问的虚拟IP
NodePort:在ClusterIp基础上为Service在每台机器上绑定一个端口,这样就可以通过node_ip:node_port的方式来访问服务
LoadBalancer:在NodePort的基础上,借助cloud provider创建一个外部负载均衡器,并将请求转发到node_ip:node_port。
ExternalName:把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这在kubernetes 1.7以上的版本的kube-dns才支持

污点

每个污点有一个key和value作为污点的标签,其中value可以为空,effect描述污点的作用,当前taint effect支持如下三个选项:
    NoSchedule:表示k8s将不会将pod调度到具有该污点的Node上
    PreferNoSchedule:表示k8s将尽量避免pod调度到具有该污点的pod上
    NoExecute:表示k8s将不会将pod调度到具有该污点的node上,同时会将node上已存在的pod驱逐出去
污点的设置,查看和取出
设置污点:
kubectl taint nodes node1 key1=value1:NoSchedule
查看污点
kubectl describe node node_name
取出污点
kubectl taint nodes node1 key1:NoSchedule-

kubernetes常用命令

查看pod
kubectl get pod -n namespaces_name
查看pod详情
kubectl describe pod pod_name
查看pod日志
kubectl logs -f --tail=900 pod_name
用yaml文件创建pod
kubectl create -f pod.yml
删除pod
kubectl delete pod pod_name
进入某个pod
kubectl exec -it pod_name /bin/bash