k8s的基本概念
(一)k8s
1、k8s:自动部署,自动扩展和管理容器化部署的应用程序的一个开源系统
(1)k8s是负责自动化运维管理多个容器化程序的集群,是一个功能强大的容器编排工具
(2)k8s以分布式和集群化的方式进行容器管理
(3)版本:1.20版本
(4)k8s是Google的borg系统作为原型,后期经由go语言编写的开源软件
(5)网站
①官网:https://kubernetes.io
②源码包:https://github.com/kubernetes/kubernetes
2、k8s的优点
(1)传统的部署方式:一般意义上的二进制部署(安装、运行、运行维护)需要专业的人员,如果出现了故障还需要人工重新拉起来,如果任务量增大,只能水平的扩展(再部署一台)
(2)容器化部署:可以用dockerfile编写好的自定义的容器,随时基于镜像都可以进行,数量少还可以管理,数量一旦增加,管理起来太复杂,而且docker一般是单机运行,没有容灾(高可用)
(3)k8s部署:简单、高效的部署容器化的应用
3、k8s的作用
(1)解决了docker的单机部署和无法集群化的特点
(2)解决了随着容器数量的增加,对应增加的管理成本
(3)容器的高可用,提高了一种容器的自愈机制
(4)解决了容器没有预设模版,记忆无法快速、大规模部署,以及大规模的容器调度
(5)k8s提供了集中化配置管理的中心
(6)解决了容器的生命周期的管理工具,可以集中统一的管理容器
(7)提供了图形化工具,可以用图形化工具对容器进行管理
4、k8s是基于开源的容器集群管理系统,在docker容器技术的基础之上,为容器化的应用提供、部署、运行、资源调度、服务发现、动态伸缩等一系列完整的功能
5、k8s是大规模容器管理
(1)对docker等容器技术从应用的包——部署——运行——停止——销毁,全生命周期管理
(2)集群方式运行,跨机器的容器管理
(3)解决了docker的跨机器运行的网络问题
(4)k8s可以自动修复,使得整个容器集群可以在用户期待的状态下运行
(二)k8s的特性
1、弹性伸缩:可以基于命令,或者图形化界面基于CPU的使用情况,自动的对部署的程序进行扩容和缩容,以最小的成本运行服务
2、自我修复:节点故障时,可以重新启动失败的容器,替换和重新部署
3、自带服务发现和负载均衡:k8s为多个容器提供一个统一的访问入口(内部地址和内部的DNS名称),自动负载均衡关联的所有容器
4、自动发布和回滚:k8s采用滚动的策略更新应用(一个一个来),如果更新过程中出现问题,可以根据回滚点进行回滚
5、集中化配置管理和秘钥管理,k8s集群内的各个组件都是要进行密钥对验证,但是k8s的安全性不高,核心的组件(mysql、nginx等)最好不要部署在k8s上,k8s一般部署自定义应用
6、存储编排
(1)可以自动化的把容器部署在节点上
(2)也可以通过命令行或者yml文件(自定义pod,pod就是容器)实现指定节点部署
(3)也可以通过网络存储,NFS、gfs
7、对任务进行批次处理,提供一次性的任务,定时任务,满足需要批量处理和分析的场景
(三)k8s的核心组件(重点)
作用 | |
master组件(主节点): | |
kube-apiserver | 1、k8s集群之中每个组件都要靠密钥对来进行验证,组件之间的通信靠apiserver 2、API是应用接口服务,k8s的所有资源请求和调用操作都是靠kube-apiserver开完成 3、所有对象资源的增删改查和监听的操作都是kube-apiserver处理完成之后交给etcd来进行 4、kube-apiserver是k8s所有请求的入口服务,apiserver接受k8s的所有请求(命令行和图形化界面),然后根据用户的具体请求,通知对应的组件展示或者运行命令 5、APIserver相当于整个集群的大脑 |
kube-controller-manager | 1、运行管理控制器:是k8s集群中处理常规任务的后台线程,是集群中所有资源对象的自动化控制中心 2、一个资源对应一个控制器,controller-manager负责管理这些控制器 |
node controller | 节点控制器:负责节点的发现以及节点故障时的发现和响应 |
replication controller | 副本控制器:控制关联pod的副本数,可以随时扩缩容 |
endpoints controller | 断点控制器:监听service和对应pod的副本变化,端点就是服务暴露出的访问点,要访问这个服务,必须要知道他的endpoints,就是内部每个服务的IP地址+端口 |
service account和 roken controllers | 服务账户和令牌控制:为命令控件创建默认账户和API访问令牌,也就是访问不同的命名空间 |
resourcequota controller | 资源控制器:对命名空间的资源使用进行控制,也可以对单个pod的资源进行控制 |
namespace controller | 命名空间的控制器:管理命名空间的生命周期 |
service controller | 服务节点控制器:k8s集群和外部的主机之间的接口控制器 |
kube-scheduler | 资源调度组件:根据调度算法为新创建的pod选择一个合适的node节点,可以理解为k8s的所有节点的调度器,部署和调度node |
预先策略 | 人工定制,指定node |
优先策略 | 限制条件,根据调度算法选择一个合适的node,node的节点的资源情况,node的资源控制的情况等等,选一个资源最富裕的、负载最小的node来部署 |
ETCD | k8s的存储服务(存储集群的所有信息),etcd分布式键值存储系统(key:value),k8s的关键配置和用户配置,先通过APIserver调用etcd当中的存储信息,然后再实施(这个集群当中,能对etcd存储进行对读写权限的,只有API-server) |
node组件: | |
kubelet | 1、node节点的监视器,以及master节点的通讯器,也可以理解为master在node节点上的一个眼线 2、kubelet会定时向API-server汇报自己的node上的运行服务的状态,API-server会把节点状态保存在etcd存储当中 |
3、接受来自master节点的调度命令 4、如果发现自己的状态和master节点的状态不一致,会调用docker的接口,同步数据 5、对节点上容器的生命周期进行管理,保证节点上的镜像不会占满磁盘空间,对退出的容器的资源进行回收 | |
kube-proxy | 1、pod节点的网络代理,实现每个node节点上的网络代理,实现节点上的网络规划和四层负载的负载均衡、负责写入访问映射的规则(iptables-快淘汰),IPVS实现服务映射 2、pod不是容器,pod是基于容器创建的 3、本身不直接给pod提供网络代理,proxy是service资源 的载体,proxy代理的是service的地址 4、kube-proxy实际上代理的是pod的集群网络(虚拟网络),k8s的每个node节点上都有一个kube-proxy组件 |
docker | 容器引擎,运行容器,负责本机的容器创建和管理 |
1、k8s要创建pod时,kube-scheduler调度到节点上(node节点),节点上的kubelet指示docker启动特定的容器, 2、kubelet把容器的信息收集,发送给主节点,只需要在主节点发布指令,节点上的kubelet就会指示docker拉取镜像,启动或者停止容器 | |
pod | 1、pod运行在节点上的,是k8s当中创建或者部署的最小、最简单的基本单位,一个pod代表集群上正在运行的一个进程 2、同一个pod内的每个容器就是一个豌豆 3、pod是由一个或者多个容器组成,pod中的容器共享网络、存储和计算资源,可以部署在不同的docker主机上 4、一个pod里面可以运行多个容器,也可以是一个容器,在生产环境中,一般都是单个容器或者具有关联关系的多个容器组成一个pod |
deployment | 无状态应用部署,作用:管理和控制pod,以及replicaset副本数(运行几个容器),管控他的运行状态 |
replicaset | 保证pod的副本数量,受控于deployment。 |
在k8s中,部署服务,实际上就是pod,deployment部署的服务就是pod,replicaset就是来定义pod的容器数量,可以保证pod的不可重复性,在当前的命名空间不可重复,不同的命名空间资源是隔离,名称可以重复,官方推荐使用deployment进行服务部署 | |
daemonset | 确保所有节点运行同一类的pod |
statefulset | 有状态应用部署 |
job | 可以在pod中设置一次性任务,运行完即退出 |
cronjob | 一直在运行的周期性任务 |
service(CLUSTER-IP) | 1、在k8s集群中,每创建一个pod之后,都会为其中运行的容器分配一个集群内的IP地址,由于业务的变更,容器可能会发生变化,IP地址也会发生变化,service的作用就是提供整个pod对外统一的IP地址, 2、service就是一个网关(路由器),通过访问service就可以访问pod内部的容器集群 3、service能实现负载均衡和代理,kube-proxy来实现负载均衡,service是k8s微服务的核心,屏蔽了服务的细节,统一的对外暴露的端口,真正实现了微服务 4、service的流量调度:userspace(用户空间,已经废弃)、iptables(即将废弃)、ipvs(目前1.20都用ipvs) |
label | 标签,k8s特色管理方式,用于分类管理资源对象,label标签可以用户自定义(node、pod、service、namespace) |
label选择器 | 等于、不等于,相当于使用定义的标签名 |
ingress | 1、k8s集群对外暴露提供访问的接口(属于应用层),七层代理转发的是http请求,访问方式是http、https 2、service是四层转发,转发的是流量(重) https://www.guogi.com:80—ingress—service—pod—容器 |
namespace | 1、在k8s上可以通过namespace来实现资源隔离,项目隔离 2、通过namespace可以把集群划分为多个资源不可共享的虚拟集群组,不同命名空间里面的资源名称可以重复 |
(四)基于https密钥对搭建docker-harbor
1、安装docker、docker-harbor和docker-compose
2、修改配置文件harbor.yml
(1)生成密钥对:openssl genrsa -des3 -out server.key 2048
openssl genrsa -des3 -out server.key 2048 | |
openssl genrsa | 生成密钥对RSA |
-des3 | 加密的算法,triple DES加密的算法,生成的私钥进行加密 |
-out server.key | 生成私钥文件 |
2048 | 密钥的位数是2048位 |
(2)生成证书签名的请求文件:openssl req -new -key server.key -out server.csr
(3)备份、清除原来的密钥对:openssl rsa -in server.key.old -out server.key
(4)生成签名证书:openssl x509 -req -days 1000 -in server.csr -signkey server.key -out server.crt
(4)登录:https://20.0.0.10
3、docker通过https连接,上传镜像
(1)创建目录:mkdir -p /etc/docker/certs.d/hub.test.com
(2)远程复制date目录下的文件:scp -r /data/ root@20.0.0.61:/
(3)任意拉取镜像:docker pull nginx
(4)修改配置文件
cp server.crt server.key server.csr /etc/docker/certs.d/hub.test.com/
vim /lib/systemd/system/docker.service
--insecure-registry=hub.test.com
(5)映射
(6)安装telnet,测试https通信:telnet hub.test.com 443
yum -y install telnet
(7)上传镜像
docker tag nginx:latest hub.test.com/library/nginx:hyde
docker login -u admin -p 123456 https://hub.test.com
docker push hub.test.com/library/nginx:hyde
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!