搭建kubernetes集群管理平台 灰太狼 2023-06-13 09:29 78阅读 0赞 # 一、 kubernetes和相关组件介绍 # 1、 kubernetes概述 Kubernetes是google开源的容器集群管理系统,基于docker构建一个容器的调度服务,提供资源调度、均衡容灾、服务注册、动态扩展等功能套件。基于容器的云平台 Kubernetes基于docker容器的云平台,简称k8s openstack基于kvm的容器云平台 2、 kubernetes架构设计图 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTg0MzY5OQ_size_16_color_FFFFFF_t_70] 3、 kubernetees常见组件介绍 master:kubernetes管理节点 apiserver:提供接口服务,用户通过apiserver来管理整个容器集群平台。apiserver负责和etcd交互(其他组件不会直接操作etcd,只有apiserver这么做)。整个kubernetes集群的所有交互都是以apiserver为核心。如:1、所有对集群进行的查询和管理都要通过api来进行。2、所有模块之间并不会互相调用,而是通过和apiserver交互来完成自己的工作,apiserver提供的验证和授权保证了整个集群的安全。 schedule:kubernetes的调度服务 replication controllers:复制,保证pod的高可用 replication controller是kubernetes系统中最有用的功能(实现多个pod副本),往往一个应用需要多个pod来支撑,并且可以保证其复制的副本数,即使副本所调度的宿主机异常,通过replication controller可以保证在其它宿主机启动同等数量的pod,replication controller可以通过repcon模板来创建多个pod副本,同样也可以直接复制已存在pod,需要通过label selector来关联。 minion:真正运行容器container的物理机,kubernetes中需要很多minion机器,来提供运算。 container:容器,可以运行服务和程序 pod:在kubernetes系统中,调度的最小颗粒不是单纯的容器,而是抽象一个个的pod。pod是一个可以被创建、销毁、调度、管理的最小部署单元。pod中可包括一个或一组容器。 kube-proxy:代理。做端口转发,相当于LVS-NAT模式中的负载调度器。proxy解决了统一宿主机,相同服务端口冲突的问题,还提供了对外服务的能力,proxy后端使用了随机、轮询负载均衡算法。 etcd:etcd存储kubernetes的配置信息。可以理解为k8s数据库,存储着k8s容器云平台中所有节点、pods、网络等信息 services:services是kubernetes最外围的单元,通过虚拟一个访问IP及服务端口,可以访问我们定义好的pod资源,目前的版本是通过IPtables的nat来转发实现的。转发的目标端口为kube\_proxy生成的随机端口 label:标签。用来区分pod、service、replication controller的key/value键值对,仅使用在pod、service、replication controller之间的关系识别,但对这些单元本身进行操作时得使用name标签。 deployment:用于更新pod和replica set。可以再deployment对象中只描述你所期望的理想状态,deployment控制器会将现在的实际状态转成期望状态。 例如:将所有的webapp:v1.0.9升级成webAPP:v1.1.0,只需要创建一个deployment,kubernetes会按照deployment自动进行升级。通过deployment可以用来创建新的资源。如pod,替换已经存在的资源等。 deployment集成了上线部署、滚动升级、创建副本、暂停上线任务、恢复上线任务、回滚到以前某个版本的deployment功能。在某种程度上deployment可以帮助我们实现无人值守的上线。 kubelet:kubelet和kube-proxy都运行在node节点 kubelet组件管理pod和pod中容器及容器的镜像和卷信息 kube-proxy实现kubernetes网络相关内容 总结:各个组件之间的关系 Kubernetes的架构由一个master和多个minion(node)组成,master通过api提供服务,接受kubectl的请求来调度和管理整个集群。 replication controller定义了多个pod或者容器需要运行。如果当前集群中运行的pod或容器达不到配置数量,replication controller会调度容器在多个minion上运行,保证集群中的pod数量。 service则定义真实对外提供服务,一个service会对应后端运行的多个container Kubernetes是个管理平台,minion上的proxy拥有提供真实服务公网IP。客户端访问kubernetes中提供的服务,直接访问到kube-proxy上。 Kubernetes中pod是一个基本单元,一个pod可以提供相同功能的多个container,这些容器都会被部署在同一个minion上。minion是运行kubelet中容器的物理机。minion接受master的指令创建pod或者容器。 # 二、 搭建kubernetes容器集群管理系统 # 1、 环境说明 ![在这里插入图片描述][20191115150735283.png] 注:node3属于扩容节点,初期只有node1和node2两个minion 2、 配置yum源 搭建kubernetes,需要很多依赖包和插件,这里有两种方式安装:通过网络源yum安装和通过本地源yum安装 方法一:本地源yum安装 上传提前下载好的k8s相关依赖包和插件,上传到服务器,并解压缩 把k8s-package.tar.gz上传到xuegod120 系统中:: \[root@xuegod120 ~\]\# tar zxvf k8s-package.tar.gz 创建k8s-yum源文件 \[root@xuegod120 ~\]\# vim /etc/yum.repos.d/k8s-package.repo \[k8s-package\] name=k8s-package baseurl=file:///root/k8s-package enabled=1 gpgcheck=0 配置centos-yum源文件 \[root@xuegod120 ~\]\# mount /dev/cdrom /mnt/ \[root@xuegod120 ~\]\# vim /etc/yum.repos.d/centos7.repo \[centos7\] name=CentOS7 baseurl=file:///mnt enable=1 gpgcheck=0 gpgkey=file:///etc/pki/rpm gpg/RPM GPG KEY CentOS 7 \[root@xuegod120 yum.repos.d\]\# mv /etc/yum.repos.d/CentOS Base.repo /opt/ 删除外 网源 方法二:网络yum源安装 推荐使用阿里云的网络源,不要用官方源。直接安装kubernetes即可 \[root@master-120 ~\]\# ll /etc/yum.repos.d/ 总用量 8 \-rw-r–r--. 1 root root 2523 6月 16 2018 CentOS-Base.repo \-rw-r–r--. 1 root root 664 6月 14 23:47 epel-aliyun.repo 3、 修改master和node节点主机名和hosts文件 \[root@docker-120 ~\]\# hostnamectl set-hostname master \[root@docker-130 ~\]\# hostnamectl set-hostname node1 \[root@docker-140 ~\]\# hostnamectl set-hostname node2 \[root@docker-150 ~\]\# hostnamectl set-hostname node3 \[root@docker-120 ~\]\# vim /etc/hosts \#所有节点都需要修改 192.168.1.120 master 192.168.1.130 node1 192.168.1.140 node2 192.168.1.150 node3 4、 在master和node节点安装k8s组件 master节点安装: \[root@master ~\]\# yum -y install kubernetes etcd flannel ntp 注:Flannel类似于交换机硬件中的VXLAN功能,为Docker提供一种可配置的虚拟网络 Flannel在每一台主机上运行一个 agent。 flanneld,负责在提前配置好的地址空间中分配子网租约。Flannel使用etcd来存储网络配置。 ntp 主要用于同步容器云平台中所有结点的时间。 云平台中结点的时间需要保持一致。 kubernetes 中包括了服务端和客户端相关的软件包 node节点安装: \[root@node1 ~\]\# yum -y install kubernetes docker flannel ntp \[root@node2 ~\]\# yum -y install kubernetes docker flannel ntp 5、 配置etcd配置文件(master节点) 修改etcd配置文件 \[root@master ~\]\# vim /etc/etcd/etcd.conf \[root@master ~\]\# grep -v ‘^\#’ /etc/etcd/etcd.conf ETCD\_DATA\_DIR="/var/lib/etcd/default.etcd" ETCD\_LISTEN\_CLIENT\_URLS=“http://localhost:2379,http://192.168.1.120:2379” ETCD\_NAME=“default” ETCD\_ADVERTISE\_CLIENT\_URLS=http://192.168.1.120:2379 注: ETCD\_NAME=“etcd” etcd节点名称,如果etcd集群只有一个node,这一项可以注释不用配置,默认名称为default,这个名字后面会用到。 ETCD\_DATA\_DIR="-data-dir /home/data/etcd" etcd存储数据的目录 ETCD\_LISTEN\_CLIENT\_URLS=“http://localhost:2379,http://192.168.1.120:2379” etcd对外服务监听地址,一般指定2379端口,如果为0.0.0.0将会监听所有接口 ETCD\_ARGS="" 需要额外添加的参数,可以自己添加,etcd的所有参数可以通过etcd -h查看。 etcd通讯使用2379端口 启动etcd服务,并设置开机启动 \[root@master kubernetes\]\# systemctl start etcd \[root@master kubernetes\]\# systemctl enable etcd 查看etcd是否启动 \[root@master kubernetes\]\# netstat -antup | grep 2379 tcp 0 0 127.0.0.1:2379 0.0.0.0:\* LISTEN 12557/etcd tcp 0 0 192.168.1.120:2379 0.0.0.0:\* LISTEN 12557/etcd 查看etcd fluster状态 \[root@master ~\]\# etcdctl cluster-health member 8e9e05c52164694d is healthy: got healthy result from http://192.168.1.120:2379 cluster is healthy 查看成员集群列表 \[root@master ~\]\# etcdctl member list 8e9e05c52164694d: name=default peerURLs=http://localhost:2380 clientURLs=http://192.168.1.120:2379 isLeader=true 6、 配置master相关配置文件(master节点) \[root@master ~\]\# cd /etc/kubernetes/ \[root@master kubernetes\]\# ll 总用量 24 \-rw-r–r-- 1 root root 767 7月 3 2017 apiserver \-rw-r–r-- 1 root root 655 7月 3 2017 config \-rw-r–r-- 1 root root 189 7月 3 2017 controller-manager \-rw-r–r-- 1 root root 615 7月 3 2017 kubelet \-rw-r–r-- 1 root root 103 7月 3 2017 proxy \-rw-r–r-- 1 root root 111 7月 3 2017 scheduler 注:master节点上运行的组件有:etcd服务(已配置)、apiserver、flannel、schedule、kubelet、config、controller-manager。 先配置config \[root@master kubernetes\]\# vim config \[root@master kubernetes\]\# grep -v ‘^\#’ config KUBE\_LOGTOSTDERR="–logtostderr=true" KUBE\_LOG\_LEVEL="–v=0" KUBE\_ALLOW\_PRIV="–allow-privileged=false" KUBE\_MASTER="–master=http://192.168.1.120:8080" 注: KUBE\_LOGTOSTDERR="–logtostderr=true" \#表示错误日志记录到文件还是输出到stderr。 KUBE\_LOG\_LEVEL="–v=0" \#\#日志等级。 KUBE\_ALLOW\_PRIV="–allow\_privileged=false" \#允许运行特权容器。false表示不允许特权容器 配置apiserver \[root@master kubernetes\]\# vim apiserver \[root@master kubernetes\]\# grep -v ‘^\#’ apiserver KUBE\_API\_ADDRESS="–insecure-bind-address=0.0.0.0" KUBE\_ETCD\_SERVERS="–etcd-servers=http://192.168.1.120:2379" KUBE\_SERVICE\_ADDRESSES="–service-cluster-ip-range=10.254.0.0/16" KUBE\_ADMISSION\_CONTROL="–admission-control=AlwaysAdmit" KUBE\_API\_ARGS="" 注: KUBE\_API\_ADDRESS="–insecure-bind-address=0.0.0.0" 监听的接口,如果配置为127.0.0.1则只监听localhost,配置为0.0.0.0会监听所有接口,这里配置为0.0.0.0。 KUBE\_ETCD\_SERVERS="–etcd-servers=http://192.168.1.63:2379" etcd服务地址,前面已经启动了etcd服务 KUBE\_SERVICE\_ADDRESSES="–service-cluster-ip-range=10.254.0.0/16" kubernetes可以分配的ip的范围,kubernetes启动的每一个pod以及serveice都会分配一个ip地址,将从这个范围分配。 admission-control(准入控制) 概述:admission controller本质上一段代码,在对kubernetes api的请求过程中,顺序为先经过认证&授权,执行准入操作,在对目标对象迚行操作。 常见apiserver参数: –admission-control 准入控制 AlwaysAdmit \#不做限制,允许所有结点访问apiserver ,对所有请求开绿灯。 配置kube-controller-manager \[root@master kubernetes\]\# vim controller-manager \[root@master kubernetes\]\# grep -v ‘^\#’ controller-manager KUBE\_CONTROLLER\_MANAGER\_ARGS="" 主:默认不需要修改即可 配置schedule \[root@master kubernetes\]\# grep -v ‘^\#’ scheduler KUBE\_SCHEDULER\_ARGS="" 主:默认不需要修改即可 配置flannel,指定容器云中docker容器的IP网段 \[root@master kubernetes\]\# vim /etc/sysconfig/flanneld \[root@master kubernetes\]\# grep -v ‘^\#’ /etc/sysconfig/flanneld FLANNEL\_ETCD\_ENDPOINTS=“http://192.168.1.120:2379” FLANNEL\_ETCD\_PREFIX="/k8s/network" FLANNEL\_OPTIONS="–iface=ens33" 注:这里修改flannel配置文件后,如果重启服务会卡在重启界面,没有影响。执行如下命令即可启动服务。 \[root@master kubernetes\]\# etcdctl set /k8s/network/config ‘\{“Network”:“10.255.0.0/16”\}’ \[root@master kubernetes\]\# etcdctl get /k8s/network/config ‘\{“Network”:“10.255.0.0/16”\}’ \{“Network”:“10.255.0.0./16”\} 6、启动master上的服务,设置开机启动 \[root@master kubernetes\]\# systemctl start kube-apiserver.service kube-scheduler.service kube-controller-manager.service flanneld \[root@master kubernetes\]\# systemctl enable kube-apiserver.service kube-scheduler.service kube-controller-manager.service flanneld \[root@master kubernetes\]\# systemctl status kube-apiserver.service kube-scheduler.service kube-controller-manager.service flannel 7、 配置node1节点服务 注:minion上需要配置:kube-proxy、flannel、kubelet、config 配置flannel \[root@node1 ~\]\# egrep -v “\#|$” /etc/sysconfig/flanneld FLANNEL\_ETCD\_ENDPOINTS=“http://192.168.1.120:2379” FLANNEL\_ETCD\_PREFIX="/k8s/network" FLANNEL\_OPTIONS="–iface=ens33" 配置kube-proxy \[root@node1 kubernetes\]\# vim proxy 注:默认不需要修改配置,主要是负责service的实现。实现内部从pod到servie 配置config \[root@node1 kubernetes\]\# vim config \[root@node1 kubernetes\]\# egrep -v ‘\#|$’ config KUBE\_LOGTOSTDERR="–logtostderr=true" KUBE\_LOG\_LEVEL="–v=0" KUBE\_ALLOW\_PRIV="–allow-privileged=false" KUBE\_MASTER="–master=http://192.168.1.120:8080" 配置kubelet \[root@node1 kubernetes\]\# egrep -v ‘\#|$’ kubelet KUBELET\_ADDRESS="–address=0.0.0.0" KUBELET\_HOSTNAME="–hostname-override=node1" KUBELET\_API\_SERVER="–api-servers=http://192.168.1.120:8080" KUBELET\_POD\_INFRA\_CONTAINER="–pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" KUBELET\_ARGS="" 注:KUBELET\_POD\_INFRA\_CONTAINER 指定pod基础容器镜像地址。这个是一个基础容器,每一个Pod启动的时候都会启动一个这样的容器。如果你的本地没有这个镜像,kubelet会连接外网把这个镜像下载下来。最开始的时候是在Google的registry上,因此国内因为GFW都下载不了导致Pod运行不起来。现在每个版本的Kubernetes都把这个镜像打包,你可以提前传到自己的registry上,然后再用这个参数指定。 启动node1服务 \[root@node1 kubernetes\]\# systemctl start flanneld.service kube-proxy.service kubelet.service docker \[root@node1 kubernetes\]\# systemctl enable flanneld.service kube-proxy.service kubelet.service docker 排错1: 如果启动flannel失败,查看log日志,提示如下: failed to retrieve network config: client: etcd cluster is unavailable or misconfigured; error \#0: dial tcp 192.168.1.120:2379: i/o timeout 原因:node1节点到etcd集群通过192.168.1.120:2379不通 解决方法:查看master节点的iptables防火墙是否没有关闭或有策略限制 \[root@master ~\]\# iptables -F \[root@master ~\]\# iptables -L -n 再次启动flannel即可 查看node1的网络信息 ![在这里插入图片描述][20191115150757113.png] 这里的地址就是通过master的如下文件进行分配和管控的 ![在这里插入图片描述][20191115150801527.png] 8、 配置node2 配置内容和node1相同,也可以直接通过scp命令将相关配置文件拷贝到node2上,重启服务即可 \[root@node1 ~\]\# scp /etc/sysconfig/flanneld root@node2:/etc/sysconfig/ \[root@node1 ~\]\# scp /etc/kubernetes/proxy root@node2:/etc/kubernetes/ \[root@node1 ~\]\# scp /etc/kubernetes/config root@node2:/etc/kubernetes/ \[root@node1 ~\]\# scp /etc/kubernetes/kubelet root@node2:/etc/kubernetes/ 注:拷贝的kubelet文件,需要修改hostname为node2,。 启动服务,设置开机启动 \[root@node2 ~\]\# systemctl start flanneld.service kubelet kube-proxy.service docker \[root@node2 ~\]\# systemctl enable flanneld.service kubelet kube-proxy.service docker 查看IP地址 ![在这里插入图片描述][20191115150810991.png] 9、 在master上查看node的信息 ![在这里插入图片描述][20191115150812722.png] # 三、 将node3节点扩容到kubernetes集群管理平台中 # 1、 基础环境搭建 修改主机名、修改hosts文件、使用yum安装kubernetes组件 2、 配置kubernetes相关配合文件 这里可不用配置,和node2节点一样,直接scp拷贝即可,需要修改kubelet文件的hostname \[root@node1 ~\]\# scp /etc/sysconfig/flanneld root@node3:/etc/sysconfig/ \[root@node1 ~\]\# scp /etc/kubernetes/proxy root@node3:/etc/kubernetes/ \[root@node1 ~\]\# scp /etc/kubernetes/config root@node3:/etc/kubernetes/ \[root@node1 ~\]\# scp /etc/kubernetes/kubelet root@node3:/etc/kubernetes/ 3、 启动服务,设置开机启动 \[root@node3 ~\]\# systemctl start flanneld.service kubelet.service kube-proxy.service docker \[root@node3 ~\]\# systemctl enable flanneld.service kubelet.service kube-proxy.service docker 或者使用for循环来启动和设置开机启动 for SERVICES in flanneld kube-proxy kubelet docker ; do systemctl restart $SERVICES systemctl enable $SERVICES systemctl status $SERVICES done # 四、 总结 # 1、 本实验中kubernetes集群4个节点,一个master+3个node。一共需要启动17个服务,6个端口号。 2、 master启动服务和端口 因为master和etcd是放在一起,所以master总共启动服务是5个,分别如下: etcd、flanneld、kube-apiser、kube-schedule、kube-controller master节点启动端口如下: etcd服务使用的2379端口 master服务使用的8080端口 3、 node启动服务和端口 启动服务如下: flanneld、kubelet、kube-proxy、docker 启动端口如下: kubelet监听端口:10248/10250/10255 kubeproxy监听端口:10249 三台node所以总计12个服务 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTg0MzY5OQ_size_16_color_FFFFFF_t_70]: https://img-blog.csdnimg.cn/2019111515065467.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTg0MzY5OQ==,size_16,color_FFFFFF,t_70 [20191115150735283.png]: https://img-blog.csdnimg.cn/20191115150735283.png [20191115150757113.png]: https://img-blog.csdnimg.cn/20191115150757113.png [20191115150801527.png]: https://img-blog.csdnimg.cn/20191115150801527.png [20191115150810991.png]: https://img-blog.csdnimg.cn/20191115150810991.png [20191115150812722.png]: https://img-blog.csdnimg.cn/20191115150812722.png
还没有评论,来说两句吧...