基于dockerfile构建nginx镜像与k8s各组件功能说明
本文目录:
1.基于dockerfile构建nginx镜像
2.掌握容器的cpu和内存的资源限制
3.整理k8s master和node节点各组件的功能
kube-apiserver
kube-controller-manager
kube-scheduler
kubelet
kube-proxy
etcd
网络组件
-------------------------------------------------------------------------------------------------------
一、基于dockerfile构建nginx镜像
1、Dockerfile指令
2、基于dpckerfile编写nginx镜像
#nginx image
#父镜像
FROM ubuntu:20.04
#容器说明,管理者信息 #maintainer dengrh "847308@qq.com" LABEL "maintainer"="dengrh 847308@qq.com" LABEL "name" = "dengrh"
#将本地文件替换到容器里,aliyun源替换到容器 COPY aliyun.repo /etc/yum.repos.d/aliyun.repo
#给容器安装基本编译环境 RUN apt update && apt install -y iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute gcc openssh-server iotop unzip zip make vim && mkdir /data/nginx -p
#添加并解压nginx到容器
ADD nginx-1.18.0.tar.gz /usr/local/src
#编译安装nginx, 将nginx安装目录制作软连接到 /usr/bin 并删除源码安装包,减小容器体积
RUN cd /usr/local/src/nginx-1.20.2 && ./configure --prefix=/apps/nginx && make && make install && ln -sv /apps/nginx/sbin/nginx /usr/bin && rm -rf /usr/local/src/nginx-1.20.2
ADD nginx.conf /apps/nginx/conf/nginx.conf
#公司代码保存目录
#ADD static.tar.gz /data/nginx/html
#将nginx容器的正确和错误日志打到容器的标准输出上,便可通过 docker logs 容器ID 查看nginx日志 RUN ln -sv /dev/stdout /apps/nginx/logs/access.log RUN ln -sv /dev/stderr /apps/nginx/logs/error.log
#统一权限,uid,路径,组和用户 RUN groupadd -g 2022 nginx && useradd -g nginx -s /usr/sbin/nologin -u 2022 nginx && chown -R nginx.nginx /apps/nginx /data/nginx
#声明服务的端口 EXPOSE 80 443
#推荐可执行程序的方式 CMD ["/apps/nginx/sbin/nginx","-g","daemon off;"]
3、启动nginx容器
docker run -it -p 81:80 --rm 7a78e9f30e91 bash
4、访问nginx页面
二、掌握容器的cpu和内存的资源限制
Cgroup及资源限制
容器如果不加资源限制,容器就可以使用宿主机所有资源, 如果一个容器或几个容器占用内存资源过多,导致宿主机没有内存资源分配。
导致其他容器在申请资源的时候,没有可用资源,OM会把资源占用过多的进程强制 kill 掉。
K8s资源限制
在k8s中,容器 需要一个最小的可用资源,如100m CPU,256M内存。在k8s中会将容器调度到宿主机可用资源符合容器调度条件的的宿主机上。
容器运行起来后可设置一个容器运行资源上限。如500m CPU,1024m内存。该容器最多只能使用这么多资源。
k8s资源池
used:可用资源
requests:申请的资源
limits:最大资源
total capacity:剩余资源
参数:
--cpus:限制容器使用的最大cpu核心
-m:限制容器使用的最大物理内存
命令:
限制容器最多使用256兆内存
#docker run -it --rm -m 256m --name docker1 容器ID --vm 2-bytes 256M
CPU限制4
#docker run -it --rm --name docker1 容器ID --cpu 4 --vm 4
加大CPU到1.5核心
后跟宿主机cgroup对需要改的容器的CPU资源限制文件路径
docker stats查看 ( CPU%在 150% 左右浮动)
减小CPU到1核心
docker stats查看( CPU% 在 100% 左右浮动)
物理内存资源限制存放路径 memory.limit_in_bytes
调大物理内存资源限制(只能调高)
docker stats查看
三、k8s master和node节点各组件的功能
kub -api server:
Kubernetes API server 验证并配置API对象的数据,这些对象包括pods、services、replicationcontrollers等、以 REST API 服务形式提供接口,作为增个系统的控制入口。
简介:
1. api-server默认端口 6443 可通过启动参数 “--secure-port”的值来修改默认值
2. 默认IP地址为非本地网络端口,通过启动参数“--bind-address” 设置该值
3. 该端口用于接收客户端,dashboard等外部 https 请求
4.用于基于Tocken文件客户端证书及 HTTP Base 的认证
5.用于基于策略的授权
官方:https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-apiserver/
如图:
用户向api server发起创建容器的请求,由 api server 检查权限是否符合并将该事件发给 etcd。
api server 通过 api server 的地址与 api server 保持监听,查询是否存在事件,若存在,kube-scheduler 会通过 api server 从 etcd 获取事件,并检查宿主机资源是否符合要求,若符合则进行调度,将调度结果返回给api-server,再写到etcd,最后 node 节点就可以通过api server拿到该事件。
kube-controller-manager:
执行整个系统的后台任务,包括节点状态状况、Pod个数、Pods和Service的关联等。
kube-Controller-Manager还包括了一些子控制器(副本控制器,系统控制器、命名空间控制器和服务账号控制器等),控制器作为集群内部的管理控制中心、负责集群内的Node、Pod副本、服务端点(Endopint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResoourceQuota)的管理,当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复流程,确保集群中的pod副本始终处于理想工作状态。
官方:https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-controller-manager/
◽ controller-manager控制器每间隔5秒检查一次节点的状态
◽ 如果controller-manager控制器没有收到自节点的心跳,则将该node节点被标记为不可达
◽ controller-manager将标记为无法放置之前等待40秒
◽ 如果该node节点被标记为无法访问后5分钟还没恢复,controller-manager会删除当前node节点的所有pod并在其他可用节点重建这些pod
如图:
kube-controller-manager也是通过api server从etcd 中读取etcd中的数据,得知有哪些节点挂了。
而kubelet是一个客户端,主要是维护当前主机的pod状态,汇报状态,汇报信息。若当前主机的pod节点挂了,kubelet会将该信息通过api server 写到 etcd,然后 kube-scheduler 或 kube-controller-manager 就可以通过 api server 获取 etcd 中该事件的信息,并由 kube-scheduler 进行容器重建。
kube-scheduler:
负责节点资源管理,接收来自kube-apiserver创建Pods任务,并分配到某个节点
kube-proxy:
kubernetes网络代理运行在node上,他反映了node上Kubernetes API中定义的服务,并可以通过一组后端进行简单的TCP、UDP和SCTP转发,用户必须使用api server创建一个服务来配置代理,其实就是kube-pory通过主机上维护网络规则并执行连接转发来实现Kubernetes服务访问。
官方:https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-proxy/
◽ Kube-proxy运行在每个节点上,监听API Server中服务对象的变化,再通过管理 IP tables 或者 IPVS 规则来实现网络的转发。
◽Kube-proxy不同的版本支持三种工作模式
User Space:k8s v1.1 之前使用,k8s 1.2及以后淘汰
IP tables:k8s 1.1版本开始支持,1.2开始为默认
IPVS:k8s 1.9 引入到1.11版本为正式版本,五幺安装ipvsadm,ipset工具包和加载 ip_vs 内核模块
以上是K8s集群图:
kube-proxy 运行在每个计算机节点上,负责pod网络代理,定时从etcd获取service信息做相应策略。
用户如果要创建一个容器,想要暴漏某些端口的时候,就需要 kube-proxy 与 api server 进行交互。 该请求会由 api server 将该事件写到 etcd,通过 kube-scheduler 进行调度将容器分配给 node1 ,node1 上的 kube-proxy 就发现本机有一事件需要创建该容器的端口映射,然后接收 etcd 的请求,然后调用内核更新本机的一些网络规则(ip tables或ipvs)。当pod请求写到 ectd 后, kubelect也会拿到该事件,需要在本主机上创建一个容器,会调用docker拉取镜像并创建容器(docker调用containerd创建容器)。
etcd:
由CoreOS公司开发,目前是kubernetes默认使用的key-value数据存储系统,用于保存kubernetes的所有集群数据。etcd支持分布式集群功能,生成环境使用时需要为etcd数据提供备份机制。
官方: https://kubernetes.io/zh/docs/tasks/administer-cluster/configure-upgrade-etcd/
https://etcd.io/ 官网
https://github.com/etcd-io/etcd github
kubelet:
官网:https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kubelet/
https://kubernetes.io/zh/docs/reference/kubectl/kubectl/
kubelet是运行在每个worker节点的代理组件,作为agent,接收分配该节点的Pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver。,具体功能如下
◽ 向master汇报node节点的状态信息
◽ 接收指令并在pod中创建docker容器
◽ 准备pod所需要的数据卷
◽ 返回pod的运行状态
◽ 在node节点执行容器监控检查
DNS:
DNS负责为整个集群提供DNS服务,从而实现服务直接的访问