一.K8S介绍:

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

1.K8S优势:

容器编排;轻量级;开源;弹性伸缩;负载均衡

2.重要概念:

Cluster: 是 计算、存储和网络资源的集合,k8s利用这些资源运行各种基于容器的应用.
Master: master是cluster的大脑,他的主要职责是调度,即决定将应用放在那里运行。master运行linux操作系统,可以是物理机或者虚拟机。为了实现高可用,可以运行多个master。
Node: 职责是运行容器应用。node由master管理,node负责监控并汇报容器的状态,同时根据master的要求管理容器的生命周期。node运行在linux的操作系统上,可以是物理机或者是虚拟机。
Pod: pod是k8s的最小工作单元。每个pod包含一个或者多个容器。pod中的容器会作为一个整体被master调度到一个node上运行。
Controller: k8s通常不会直接创建pod,而是通过controller来管理pod的。controller中定义了pod的部署特性,比如有几个剧本,在什么样的node上运行等。为了满足不同的业务场景,
k8s提供了多种controller,包括deployment、replicaset、daemonset、statefulset、job等。
Deployment: 是最常用的controller。deployment可以管理pod的多个副本,并确保pod按照期望的状态运行。
Replicaset: 实现了pod的多副本管理。使用deployment时会自动创建replicaset,也就是说deployment是通过replicaset来管理pod的多个副本的,我们通常不需要直接使用replicaset。
Daemonset: 用于每个node最多只运行一个pod副本的场景。正如其名称所示的,daemonset通常用于运行daemon。
Job: 用于运行结束就删除的应用,而其他controller中的pod通常是长期持续运行的。
Service: deployment可以部署多个副本,每个pod 都有自己的IP,外界如何访问这些副本那?答案是service。k8s的 service定义了外界访问一组特定pod的方式。service有自己的IP和端口,
service为pod提供了负载均衡。k8s运行容器pod与访问容器这两项任务分别由controller和service执行。
Namespace: 可以将一个物理的cluster逻辑上划分成多个虚拟cluster,每个cluster就是一个namespace。不同的namespace里的资源是完全隔离的。

二. k8s架构分析 

k8s的集群由master和node组成,节点上运行着若干k8s服务

1.master节点:

master节点之上运行着的后台服务有kube-apiserver 、kube-scheduler、kube-controller-manager、etcd和pod网络。

1.API Server: API Server是k8s的前端接口,各种客户端工具以及k8s其他组件,可以通过它管理集群的各种资源。

2.Scheduler: scheduer负责决定将pod放在哪个node上运行。另外scheduler在调度时会充分考虑集群的架构,当前各个节点的负载,以及应用对高可用、性能、数据亲和性的需求。

3.Controller Manager: 负责管理集群的各种资源,保证资源处于预期的状态。

4.etcd: 负责保存k8s集群的配置信息和各种资源的状态信息,当数据发生变化时,etcd会快速的通知k8s相关组件。

5.pod网络:pod要能够相互通信,k8s集群必须掌握pod网络,fannel是其中一个可选的方案。

2.Node节点:

node是pod运行的地方。node上运行的k8s组件有kublet、kube-proxy和pod网络(例如flannel)

1.kubelet: 是node的agent,当scheduler去确定在某个node上运行pod后,会将pod的具体配置信息发送给该节点的kubelet,kubelet会根据遮羞信息创建和运行容器,并向master报告运行状态。

2.kube-proxy: 每个node都会运行kube-proxy服务,外界通过service访问pod,kube-proxy负责将降访问service的TCP/UDP数据流转发到后端的容器。如果有多个副本,kube-proxy会实现负载均衡。

3.pod网络:pod能能够互相通信,k8s集群必须部署pod网络,flannel是其中一个可以选择的方案

3.部署过程:

1.kubectl 发送部署请求到 API Server。

2.API Server 通知 Controller Manager 创建一个 deployment 资源。

3.Scheduler 执行调度任务,将两个副本 Pod 分发到 k8s-node1 和 k8s-node2。

4.k8s-node1 和 k8s-node2 上的 kubectl 在各自的节点上创建并运行 Pod。

三.deployment—yml文件

 命令vs配置文件(yml文件)

1.命令方式简单直接快捷,上手快;适合临时测试或实验。

2.配置文件方式提供了创建的模板,可以重复部署;易于管理;适合正规,跨环境,规模化部署。

案例:启动nginx pod ,副本为3

1. 命令行方式: kubectl run nginx –image=nginx -r 3

2 .编写yml文件

执行yml 文件:kubectl apply -f nginx.yml

node打标签

1.kubectl label  node ken3 disk=ssd

2.将pod加入到标签节点上(在yml文件中修改)

3.执行yml文件后查看pod,会发现运行在标签为disk=ssd的节点上。

 四.Job

容器按照持续运行的时间可分为两类:服务类容器和工作类容器。服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等。工作类容器则是一次性任务,比如批处理程序,完成后容器就退出。Kubernetes 的 Deployment、ReplicaSet 和 DaemonSet 都用于管理服务类容器;对于工作类容器,我们用 Job。

1.Job配置文件

restartPolicy 指定什么情况下需要重启容器。对于 Job,只能设置为 Never 或者 OnFailure。对于其他 controller(比如 Deployment)可以设置为 Always 。

如果Job失败会发生什么?

会自动生成很多pod因为在job中期待完成数是1.但是因为job内部有错误,无法完成相应的任务,而且重启策略是Never,表示容器从来不会重启,所以系统为了完成工作,就会一直开启新的容器,试图去完成自己的工作。如果重启策略为OnFailure的话,只有一个pod,但pod会一直重启!

注意:

restartPolicy 表示pod重启策略

Always: 这个是默认值,pod退出就会自动重启

Never: 这个表示容器退出不会重启

OnFailure: 表示容器再失败退出的时候才会重启,容器正常退出不会重启

imagePullPolicy 表示镜像拉取的策略

Always: 这个是默认值,表示每次执行yml文件都会去拉取dockerhub中的镜像

Never: 总是不拉取镜像

IfNotPresent: 本地不存在才会去拉取镜像

五.cronjob

1.cjyml文件

六.service

1.每个 Pod 都有自己的 IP 地址。当 controller 用新 Pod 替代发生故障的 Pod 时,新 Pod 会分配到新的 IP 地址。这样就产生了一个问题:

如果一组 Pod 对外提供服务(比如 HTTP),它们的 IP 很有可能发生变化,那么客户端如何找到并访问这个服务呢?Kubernetes 给出的解决方案是 Service。

Kubernetes Service 从逻辑上代表了一组 Pod,具体是哪些 Pod 则是由 label 来挑选。Service 有自己 IP,而且这个 IP 是不变的。客户端只需要访问 Service 的 IP,Kubernetes 则负责建立和维护 Service 与 Pod 的映射关系。无论后端 Pod 如何变化,对客户端不会有任何影响,因为 Service 没有变。

2.创建service:

先创建deployment文件(如上)

再创建service文件:

selector 指明挑选那些 label 为 run: httpd 的 Pod 作为 Service 的后端。

将 Service 的 8080 端口映射到 Pod 的 80 端口,使用 TCP 协议。(tcp协议可省略,默认的)

七.DNS访问  

此时我们通过另一个容器来访问刚才的pod

1.启动容器busybox

2.通过名称访问service中运行的pod(进入到容器busybox中)

Wget httpd-svc:80

发现可以访问。但要注意,通过名称访问,只能在同一名称空间。如果不是在同一名称空间,需要指定namespace. 执行如下:

1.修改yml文件:

2.同样启动容器busybox,并指定名称空间进行访问

Wget httpd2-svc.kube-public:80

3.或者在启动容器busybox时就指定名称空间

Kubectl run -it –image=busybox -n kube-public /bin/sh

八.外网如何访问pod(这里主要讲通过端口形式)

1.编写service的文件

在原有文件添加type:NodePort,表示暴露一个随机端口出来。外部访问只需加上这个端口就可以访问。

2.固定宿主机端口

(1).编写serviceyml文件(加上固定端口号即可)

几个端口表示的含义

port表示svc的端口

targetPort: pod的端口

nodePort: 需要映射到宿主机的端口

九.数据管理(volume

1.emptyDir

emptyDir 是最基础的 Volume 类型。一个 emptyDir Volume 是 Host 上的一个空目录。emptyDir Volume 对于容器来说是持久的,对于 Pod 则不是。当 Pod 从节点删除时,Volume 的内容也会被删除。但如果只是容器被销毁而 Pod 还在,则 Volume 不受影响。emptyDir Volume 的生命周期与 Pod 一致。

实践emptyDir(相当于docker中Docker Management Volume)

emptyDir 是 Host 上创建的临时目录,其优点是能够方便地为 Pod 中的容器提供共享存储,不需要额外的配置。但它不具备持久性,如果 Pod 不存在了,emptyDir 也就没有了。

 2.hostpath

hostPath Volume 的作用是将 Docker Host 文件系统中已经存在的目录 mount 给 Pod 的容器。大部分应用都不会使用 hostPath Volume,因为这实际上增加了 Pod 与节点的耦合,限制了 Pod 的使用。不过那些需要访问 Kubernetes 或 Docker 内部数据(配置文件和二进制库)的应用则需要使用 hostPath。

实践hostPath(效果相当于执行: docker run -v /tmp:/usr/share/nginx/html

编写yml文件

 3.NFS

1.环境准备:控制节点部署好NFS,节点需要下载nfs-utils支持nfs文件类型

2.编写yml文件

4.pv&pvc

PersistenVolume(pv)是外部存储系统中的一块存储空间,由管理员创建和维护。与volume一样,pv具有持久性,生命周期独立于Pod。

PersistentVolumeClaim(pvc)是对pv的申请。Pvc通常由普通用户创建和维护。需要为pod分配存储资源时,用户可以创建一个pvc,指明存储资源的容量大小和访问模式等信息,K8s会查找并提供满足条件的pv.

有了PersistentVolumeClaim,用户只需要告诉k8s需要什么样的存储资源,而不必关心真正的空间从哪里分配,如何访问等底层细节信息。这些Storage Provider的底层信息交给管理员来处理。

实践PV/PVC

1.部署NFS

2.编写pvyml文件

3.执行yml文件并查看pv

注意:

accessModes有三类

ReadWriteOnce – 可以被单个节点进行读写挂载

ReadOnlyMany – 可以被多个节点进行只读挂载

ReadWriteMany – 可以被多个节点进行读写挂载

4.创建pvc

编写pvc的yml文件

执行yml文件并查看pvc

5.使用pvc

编写部署nginxyml文件

执行yml文件并进行测试

5.如何释放pv

1.先停掉pod

2.删除pvc

3.删除pv

十.应用机密信息与配置管理

Secret

应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥。将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 Secret。

Secret 会以密文的方式存储数据,避免了直接在配置文件中保存敏感信息。Secret 会以 Volume 的形式被 mount 到 Pod,容器可通过文件的方式使用 Secret 中的敏感数据;此外,容器也可以环境变量的方式使用这些数据。

实践Secret

1.创建Secret

加密用户及密码: echo ‘123’ | base64 

编写secretyml文件

执行yml文件并查看,获取加密密码

2.使用secret

两种方式:1.以volume形式挂载在pod上;2.以环境变量形式使用

volume的形式挂载到pod

1.创建pod并编写yml文件

执行yml文件并进入到pod 查看secret

Volume形式可以动态更新密码

以环境变量方式使用secret

1.编写yml文件

执行文件并进入到Pod验证

K8S知识点总结的更多相关文章

  1. k8s入门你至少需要会哪些

    body { margin: 0; overflow: auto; font: normal 14px Verdana; background: rgba(255, 255, 255, 1); pad ...

  2. (转)Kubernetes部署WordPress+MySQL

    转:http://www.showerlee.com/archives/2336 这部分我们结合之前的k8s知识点给大家展示如何使用kubernetes部署wordpress+MySQL, 并利用NF ...

  3. [转帖]K8s 学习者绝对不能错过的最全知识图谱(内含 58个知识点链接)

    K8s 学习者绝对不能错过的最全知识图谱(内含 58个知识点链接)   https://www.cnblogs.com/alisystemsoftware/p/11429164.html 需要加强学习 ...

  4. K8s 学习者绝对不能错过的最全知识图谱(内含 56个知识点链接)

    导读:Kubernetes 作为云原生时代的“操作系统”,熟悉和使用它是每名用户的必备技能.本篇文章概述了容器服务 Kubernetes 的知识图谱,部分内容参考了网上的知识图谱,旨在帮助用户更好的了 ...

  5. K8S各知识点整理

    一.k8s组成部分 Master 1.   kube-apiserver 封装了核心对象的增删改查操作,以REST API接口方式提供给外部和内部组件调用.它维护的REST对象将持久化到Etcd中 2 ...

  6. K8s 学习者绝对不能错过的最全知识图谱(内含 58个知识点链接)

    作者 | 平名 阿里服务端开发技术专家 导读:Kubernetes 作为云原生时代的“操作系统”,熟悉和使用它是每名用户的必备技能.本篇文章概述了容器服务 Kubernetes 的知识图谱,部分内容参 ...

  7. K8S核心概念之SVC(易混淆难理解知识点总结)

    本文将结合实际工作当中遇到的一些问题和情况来解析SVC的作用以及一些比较易混淆和难理解的概念,方便日后工作用到或者遗忘时可以直接在自己曾经学习总结的博客当中直接查找到. 首先应该清楚SVC的作用是什么 ...

  8. [k8s]svc里知识点小结

    svc里面涉及到的概念较多一些,总结如下

  9. k8s实际操作中的小知识点

    1.批量执行yaml文件 # 把所有要执行的yaml文件放在同一个目录下,并且切换到这个目录下 kubectl apply -f . 2.利用pod的亲和和反亲和功能把pod调度到不同的node上 亲 ...

随机推荐

  1. 牛客国庆集训派对Day6 && CCPC-WannaFly-Camp #1 F. kingdom(DP)

    题目链接:https://www.nowcoder.com/acm/contest/206/F 题意:一棵 n 个点的树,根为 1,重儿子到父亲的费用为 0,其余为 1,问所有点到 1 的最大总费用是 ...

  2. Gson/Jackson/FastJson工具类

    import java.util.ArrayList; import java.util.List; import java.util.Map; import com.google.gson.Gson ...

  3. Java 显示调用隐式调用

    当你没有使用父类默认的构造方法时,此时在子类的构造方法中就需要显示的调用父类定义的构造方法.比如:父类:class Animal{ private String name; //如果你定义一个新的构造 ...

  4. 【Python之路】特别篇--组合搜索功能实现

    组合搜索: 根据特定标签内容,返回符合的数据. 效果图: 设计规划: 一.数据库表划分: 1.方向表,(运维自动化,Python开发,..) 2.分类表,(Python,Java,C#,.) 3.多对 ...

  5. Codeforces Round #456 (Div. 2) B题

    B. New Year's Evetime limit per test1 secondmemory limit per test256 megabytesinputstandard inputout ...

  6. filter(expr|obj|ele|fn)筛选出与指定表达式匹配的元素集合。

    filter(expr|obj|ele|fn) 概述 筛选出与指定表达式匹配的元素集合. 这个方法用于缩小匹配的范围.用逗号分隔多个表达式 参数 exprStringV1.0 字符串值,包含供匹配当前 ...

  7. http message

  8. (六)绘图,文本编程,定时器,菜单,图标icon,消息类型

    1,简单绘图 画直线 a,鼠标按下和抬起 void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代 ...

  9. Linux之GDB调试命令

    gdb启动 gdb 程序名 l 查看源代码(默认显示十行) l 文件名:行数 l 文件名:函数名 添加断点 break + 行数 (b 也行) b 15 if i == 15 条件断点 i b 查看断 ...

  10. mysql:unknown variable 'default-character-set=utf8'

    1.修改my.cnf后,执行 service mysql restart 重启数据库失败 service mysql restart Shutting down MySQL.. SUCCESS! St ...