kubernetes

k8s:

kubernetes:中间8个字母省略,就是k8s。

自动部署,自动扩展和管理容器化部署的应用程序的一个开源系统。

k8s是负责自动化运维管理多个容器化程序的集群,是一个功能强大的容器编排工具。

分布式和集群化的方式进行容器管理。

1.15   1.18   1.20

1.20版常用

k8s是google的borg系统作为原型,后期经由go语音编写的开源软件。

docker微服务,可以满足微服务使用,那么为什么还要使用k8s呢。

1、传统的部署方式:一般意义上的二进制部署,安装-运行-运行维护,需要专业的人员,如果出了故障,还需要人工重新拉起来。而且如果业务量增大,只能水平的扩展,再部署一个。

2、容器化,我们可以用dockerfile编写好自定义的容器,随时基于镜像都可以运行。数量少,还能管的过来,数量一旦太多,管理起来太复杂。而且,docker一般都是单机运行,没有高可用。

k8s的作用:简单、高效的部署容器化的应用。

1、解决了docker单机部署和无法集群化的特点。

2、解决了随着容器数量的增加,对应增加的管理成本。

3、容器的高可用,提供了一种容器的自愈机制。

4、解决了容器没有预设模版,以及无法快速,大规模部署。以及大规模的容器调度。

5、k8s提供了集中化配置管理的中心。

6、解决了容器的生命周期的管理工具。

7、提供了图形化工具,可以用图形化工具对容器进行管理。

k8s是基于开源的容器集群管理系统,在docker容器技术的基础之上。

为容器化的集群提供部署,运行,资源调度,服务发现,动态伸缩等一系列完整的功能

大规模容器管理:

1、对docker等容器技术从应用的包------部署-------运行-------停止-------销毁,全生命周期管理。

2、集群方式运行,跨机器的容器管理。

3.解决docker的跨机器运行的网络问题。

4.k8s可以自动修复,使得整个容器集群可以在用户期待的状态下运行。

k8s的特性:

1、弹性伸缩:基于命令,或者图形化界面基于cpu的使用情况,自动的对部署的程序进行扩容和缩容。以最小的成本运行服务。

2、自我修复:节点故障时,重新启动失败的容器,替换和重新部署。

3、自带服务发现和负载均衡,k8s为多个容器提供一个统一的访问入口(内部地址和内部的DNS名称),自动负载均衡关联的所有容器。

nginx-1

nginx-2    192.168.233.10:3000    nginx  <------客户端

nginx-3

4、自动发布和回滚:k8s采用滚动的策略更新应用。如果更新过程中出现问题,可以根据回滚点来进行回滚。

nginx-1  先更新1  最新的版本

nginx-2  再更新2  有问题可以自动回滚到上个版本

nginx-3  还是老版本

5、集中化的配置管理和秘钥管理。

k8s集群内的各个组件都是要进行密钥对验证的。但是k8s的安全性不够,核心的组件不建议部署(mysql、nginx不建议部署),建议部署自定义应用。

6、存储编排

 1、可以自动化的把容器部署在节点上。

 2、也可以通过命令行或者yml文件(自定义pod)实现指定节点部署。

 3、也可以通过网络存储,NFS(共享目录)GFS(文件系统)

7、可以把任务进行批次处理。提供一次性的任务,定时任务,满足需要批量处理和分析的场景。

k8s的核心组件:

1、kube-apiserver:k8s集群之中每个组件都是要通过密钥对来进行验证,组件主机的通信apiserver。API是应用接口服务,k8s所有资源请求和调用操作都是kube-apiserver来完成。

所有对象资源的增、删、改,查和监听的操作都是kube-apiserver处理之后交给etcd来进行。

api-server是k8s所有请求的入口服务,api-server接收k8s的所有请求(命令行和图形化界面),然后根据用户的具体请求,通知对应的组件展示或者运行命令。

APIserver相当于整个集群的大脑。

2、kube-controller-manager:运行管理控制器。是k8s集群中处理常规任务的后台线程。是集群中所有资源对象的自动化控制中心。一个资源对应一个控制器,controller-manager负责管理这些控制器。

 1、node controller(节点控制器):负责节点的发现以及节点故障时的发现和响应。

 2、replication controller(副本控制器):控制关联pod的副本数,可以随时扩缩容。

 3、Endpoints controller(端点控制器):监听service和对应pod的副本变化。端点就是服务暴露出来的访问点。要访问这个服务,必须要知道它的Endpoints。就是内部每个服务的ip地址+端口。

 4、service account和token controller(服务账户和令牌控制)

 为命名空间创建默认账户和API访问令牌。

 namespace,访问不同的命名空间。

 5、resourcequota controller(资源控制器):可以对命名空间的资源使用进行控制,也可以对pod的资源进行控制。

 6、namespace controller(命名空间的控制器):管理命名空间的生命周期。

 7、service controller(服务节点控制器):k8s集群和外部的主机之间的接口控制器。

3、kube-scheduler:资源调度组件,根据调度算法为新创建的pod选择一个合适的node节点。

可以理解为k8s的所有node节点的调度器,部署和调度node。

预先策略:人工定制,指定的node节点上部署

优先策略:限制条件

根据调度算法选择一个合适的node,node节点的资源情况,node的资源控制的情况等等,选一个资源最富裕,负载最小的node来部署。

4、ETCD:k8s的存储服务,etcd分布式键值对存储系统(key:value),k8s的关键配置和用户配置,先通过APIserver调用etcd当中的存储信息,然后再实施。(整个集群当中,能对etcd存储进行读写权限的,只有API-server)。

一般在主节点上

node组件:

1、kubelnet:node节点的监视器,以及与MASTER节点的通讯器,也可以理解为master在node节点上的眼线。

kubelnet会定时向API server汇报自己的node上运行的服务的状态,API-server会把节点状态保存ETCD存储当中。

接受来自master节点的调度命令。

如果发现自己的状态和master节点的状态不一致,会调用docker的接口,同步数据。

对节点上容器的生命周期进行管理,保证节点上的镜像不会占满磁盘空间,退出的容器的资源,进行回收。

2、kube-proxy:

实现每个node节点上的pod节点的网络代理。负责节点上的网络规划和四层负载均衡工作。复制写入iptables(快淘汰)ipvs实现服务映射。

注:pod不是容器(基于容器创建的pod)

kube-proxy:本身不直接给pod提供网络代理,proxy是service资源的载体。

kubernetes_第1张图片

(proxy代理的是service地址)

kube-proxy:实际上代理的是pod的集群网络(虚拟网络)

k8s的每个node节点上都有一个kube-proxy组件。

3、docker:容器引擎,运行容器,负责本机的容器的创建和管理。

pod是基于容器创建的,但是不是容器。

k8s要创建pod时,kube-schedule调度节点上(node节点),节点上的kubelet只是docker启动特定的容器。

kubelet把容器的信息收集,发送给主节点。主需要在主节点发布指令,节点上kubelet就会指示docker拉取镜像,启动或者停止容器。

4、pod运行在节点上。是k8s当中创建或者部署的最小/最简单的基本单位。一个pod代表集群上正在运行的一个进程。

同一个pod内的每一个容器就是一颗颗豌豆。

pod是由一个或者多个容器组成,pod中的容器共享网络,存储和计算资源。可以部署在不同的docker主机上。

注:一个pod里面可以运行多个容器,也可以是一个容器。

在生产环境中,一般都是单个容器或者具有关联关系的多个容器组成一个pod。

deployment:无状态应用部署,作用就是管理和控制pod,以及replicaset(运行几个容器)。管控它的运行状态。

repilcaset:保证pod的副本数量,受控于deployment。

在k8s中,部署服务,实际上就是pod,deployment部署的服务就是pod,repilcaset就是来定义pod的容器数量。

可以保证pod的不可重复性。在当前命名空间不能重复。不同命名空间名称可以重复。

官方推荐使用deployment进行服务部署。

daemonset:确保所有节点运行同一类的pod。

statefulset:有状态应用部署(了解)。

job:可以在pod中设置一次性的任务,运行完即退出。

cronjob:一直在运行的周期性任务。(了解)

service(pod节点对外暴露):

在k8s集群当中,创建一个pod之后,都会为其中运行的容器分配一个集群内的IP地址,由于业务的变更,容器可能会发生变化,IP地址也会发生变化,service的作用就是提供整个pod对外统一的IP地址。(多个容器组成的一个内部的IP地址,网关)

service就是一个网关(路由器),通过访问service就可以访问pod内部的容器集群。

service能实现负载均衡和代理------kube-proxy------来实现负载均衡

service是k8s微服务的核心,屏蔽了服务的细节,统一的对外暴露的端口,真正实现了“微服务”。

service的流量调度:userspace(用户空间,废弃),iptables(即将废弃)。ipvs(目前1.20都用ipvs)

label:标签,k8s的特色管理方式,分类管理资源对象。

node  pod  service  namespace等

label标签可以用户自定义。

lable选择器:等于,不等于,相当于使用定义的标签名。

ingress和service的区别(重要):

ingress:k8s集群对外暴露提供访问的接口,属于应用层,七层代理,转发的是http请求,http/https

service是四层转发,转发的是流量。

www.gq.com:80------------>ingress----------->service----------->pod------------>容器。

namespace:在k8s上可以通过namespace来实现资源隔离,项目隔离。

通过namespace可以把集群划分为多个资源不可共享的虚拟集群组。

不同命名空间里面的资源名称是可以重复的。

如图:

kubernetes_第2张图片

https验证harbor

kubernetes_第3张图片

kubernetes_第4张图片

kubernetes_第5张图片

kubernetes_第6张图片

openssl genrsa -des3 -out server.key 2048

openssl genrsa:生成秘钥  RSA

-des3:加密的算法,Triple DES加密的算法,生成的私钥进行加密

-out server.key:生成私钥文件

2048:秘钥的位数是2048位。

openssl req -new -key server.key -out server.csr

kubernetes_第7张图片

kubernetes_第8张图片

kubernetes_第9张图片

安装仓库

kubernetes_第10张图片

kubernetes_第11张图片

kubernetes_第12张图片

完成

浏览器访问

kubernetes_第13张图片

选择高级,继续

kubernetes_第14张图片

登录之后,查看证书的详细信息

kubernetes_第15张图片

kubernetes_第16张图片

另外一台主机也通过加密的认证方式登录(也需要有docker)

kubernetes_第17张图片

创建目录

回到主机1

kubernetes_第18张图片

回到181主机

kubernetes_第19张图片

复制完成之后查看

kubernetes_第20张图片

 修改docker的service文件

vim /lib/systemd/system/docker.service

变为https的方式

kubernetes_第21张图片

重启

kubernetes_第22张图片

做域名映射

20.0.0.180 hub.test.com

安装telnet检查一下

kubernetes_第23张图片

kubernetes_第24张图片

实现通信之后,把镜像传输进去即可

kubernetes_第25张图片

你可能感兴趣的:(kubernetes,容器,云原生)