本文介绍: 容器顾名思义是一个载体,我们生活当中使用的容器,一般指的是被子,碗等等,用来装东西的。在软件开发运维方面容器承载的是应用程序及其所有依赖项(例如jdkjar构建后的文件nginx)按照传统方式进行部署时,可以简单的分为两步,在操作系统安装环境依赖然后再跑程序。如果需要在另外一台服务器上进行部署还是需要重复上面的操作,安装依赖再运行程序。可能现在觉得两步骤并不麻烦,但当一个繁重的系统需要依赖很多环境配置中间件,那部署对于运维人员是一个重复且枯燥的体力活,而且一旦版本不一致还会导致其他问题的产生。

目录

概念

基础架构

单master节点

多master节点


容器是什么?

容器顾名思义是一个载体,我们生活当中使用的容器,一般指的是被子,碗等等,用来装东西的。在软件开发运维方面容器承载的是应用程序及其所有依赖项(例如jdkjar构建后的文件nginx

为什么要用容器化技术

按照传统方式进行部署时,可以简单的分为两步,在操作系统上安装环境依赖然后再跑程序。如果需要在另外一台服务器上进行部署还是需要重复上面的操作,安装依赖再运行程序。可能现在觉得两步骤并不麻烦,但当一个繁重的系统需要依赖很多环境配置中间件,那部署对于运维人员是一个重复且枯燥的体力活,而且一旦版本不一致还会导致其他问题的产生。

按照容器方式进行部署时,可以启动一个liunx基础容器,将环境依赖和程序在容器中安装运行,当需要在其他服务器部署时,把容器打包镜像tar移植部署,避免了繁琐的部署步骤

容器化技术的优点 ?

kubernetes是什么 ?

公司内随着容器的越来越多,容器的管理出现了一些问题健康检查不到位、容器的扩容、部署、回滚更新不够灵活。

kubernetes是一个开源的容器编排管理平台,它用来处理容器的自动化部署、自动恢复、水平伸缩等任务通过用户提供操作接口,可以对容器进行增删改查操作

Kubernetes 是希腊语『舵手』的意思,它最开始由 Google 的几位软件工程师创立。作为编排工具,从社区年龄来讲,Kubernetes 不占优势,Apache 推出的 Mesos 最早。从官方性方面也不占优势,Docker Swarmdocker官方提供的容器编排工具。但是后来因为是谷歌开源出来,社区很活跃,有很多人在使用,所以变成了以后整个行业的主要支柱。

DNS服务kubernetes中经历了三个阶段(SkyDNS-》KubeDNS-》CoreDNS):

【第一阶段】在kubernetes 1.2版本时,dns服务使用的是由SkyDNS提供的,由4个容器组成:kube2sky、skydns、etcdhealthz。etcd存储dns记录;kube2sky监控service变化,生成dns记录skydns读取服务,提供查询服务healthz提供健康检查

【第二阶段】在kubernetes 1.4版本开始使用KubeDNS,有3个容器组成:kubedns、dnsmasq和sidecar。kubedns监控service变化,并记录内存(存到内存高性能)中;dnsmasq获取dns记录,提供dns缓存,提供dns查询服务;sidecar提供健康检查

第三阶段】从kubernetes >=1.11版本开始,dns服务有CoreDNS提供,coredns支持自定义dns记录及配置upstream dns server,可以统一管理内部dns和物理dns。coredns只有一个coredns容器。下面是coredns的架构

有了pod进程组的存在,就可以根据pod来进行资源分配,不需要考虑以上情况

  1. 启动pause容器,初始化网络、设定命名空间
  2. 初始化容器,可以有多个串行机制来实现。例如:调整内核操作
  3. 运行主容器,如果有多个并行执行,各自维护各自的生命周期
  4. 在运行主容器过程中,会运行postStart,如果没有配置,就默认success
  5. 检测容器是否正常启动startupprobe
  6. 运行期间,如果配置了探针检测livenessprobe readinessprobe
  7. 容器退出prostop。1)清理注册信息。2)优雅关闭进程

pause容器时pod的父容器,主要负责僵尸进程回收管理,同时使同一个pod的不同容器共享存储、网络、PID、IPC等,容器之间可以使用localhost:port相互访问,可以使用volume等实现数据共享

为什么使用service

通过Ip访问pod,但是pod的Ip不固定,一旦pod发生重建,ip地址会变更

pod如果扩展多份,会造成客户端无法有效新增Pod,如果Pod进行缩容又会造成客户端访问错误

  • ClusterIP:在集群内部使用,默认值,只能从集群中访问。
  • NodePort:在所有安装了 Kube-Proxy 的节点上打开一个端口,此端口可以代理至后端 Pod,可以通过 NodePort 从集群外部访问集群内的服务,格式为 NodeIP:NodePort。
  • LoadBalancer:使用云提供商的负载均衡器公开服务,成本较高。
  • ExternalName:通过返回定义的 CNAME 别名,没有设置任何类型的代理,需要 1.7 或 更高版本 kube-dns 支持。

为什么使用Ingress?

使用NodePort类型的Service可以将集群内部服务暴露给集群外部客户端,但是存在以下几个问题

  • 一个端口只能一个服务使用,所有通过 Nodeport暴露的端口都需要提前规划;
  • 如果通过 Nodeport暴露端口过多,后期维护成本太大,且不易于管理;
  • 目前 Service底层使用的是 Iptables、IPVS,仅支持4层协议,无法完成https协议传输

volume无法解决的问题?

当某个数据卷不再被挂载使用时,里面的数据如何处理

如果想要实现只读挂载如何处理

如果想要只能一个Pod挂载如何处理

如何只允许某个Pod使用10G的空间

  • 文件存储:一些数据可能需要被多个节点使用,比如用户的头像、用户上传的文 件等,实现方式:NFS、NAS、FTP、CephFS等。
  • 块存储:一些数据只能被一个节点使用,或者是需要将一块裸盘整个挂载使用, 比如数据库、Redis等,实现方式:Ceph、GlusterFS、公有云
  • 对象存储:由程序代码直接实现的一种存储方式,云原生应用无状态化常用的实 现方式,实现方式:一般是符合S3协议的云存储,比如AWS的S3存储、Minio七牛云等。
创建一个污点(一个节点可以有多个污点):
kubectl taint nodes NODE_NAME TAINT_KEY=TAINT_VALUE:EFFECT
比如:
kubectl taint nodes k8s-node01 ssd=true:PreferNoSchedule

查看一个节点的污点:
kubectl get node k8s-node01 -o go-template --template {{.spec.taints}}
kubectl describe node k8s-node01 | grep Taints -A 10

删除污点(和label类似):
基于Key删除: kubectl taint nodes k8s-node01 ssd基于Key+Effect删除: kubectl taint nodes k8s-node01 ssd:PreferNoSchedule修改污点(Key和Effect相同):
kubectl taint nodes k8s-node01 ssd=true:PreferNoSchedule --overwrite

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注