共计 8632 个字符,预计需要花费 22 分钟才能阅读完成。
大家好,欢送来到小菜集体 solo 学堂。在这里,常识收费,不吝排汇!关注收费,不吝入手!
死鬼~ 看完记得给我来个三连哦!
本文次要介绍
kubernetes 集群的搭建
如有须要,能够参考
如有帮忙,不忘 点赞 ❥
微信公众号已开启,小菜良记,没关注的同学们记得关注哦!
浏览这篇文章先须要对 docker 的基本知识有所理解!相干浏览请移步:Docker 上手,看完感觉本人又行了!
置信点进来的小伙伴应该都对 k8s 有所耳闻,甚至于曾经应用上了。而如果是因为对题目感到好奇的小伙伴也别急着划走,因为我劝你肯定要学习 Kubernetes(k8s)。而题目也并非题目党,因为 k8s 集群大体上分为两大类:
- 一主多从:一台 master 节点和多台 node 节点,搭建比较简单,然而有可能呈现 master 单机故障
- 多主多从: 多台 master 节点和多台 node 节点,搭建比拟麻烦,然而安全性高
不论是 一主多从 异或者是 多主多从,这里至多都是须要三台服务器,而且每台服务器的规格至多得在 2G 内存 2 颗 CPU
配置起步,而咱们如果纯属为了平时练习应用,破费一笔钱去投资服务器,可能有局部人是不违心的,所以这里就响应了题目~ 接下来小菜将带给你比拟节俭的计划去学习 k8s 集群的搭建!
结尾说到,我劝你肯定要学习 k8s 这并非是一句空话。当下,云原生也并非是一个新名词,它曾经指定了一条新的开发路线,麻利、可扩大、可复制、最大化利用 …便是这条路线的代名词!这篇文章不单单介绍 Kubernetes 的搭建,如果对 Kubernetes 有所相熟的同学能够间接跳转到 Kubernetes 集群搭建 的局部,如果不相熟的同学倡议先看看前半部分,先对 Kubernetes 有所理解一下。
Kubernetes
一、K8s 事先理解
有些同学可能感到有点奇怪,为什么一会说 kubernetes,一会说 k8s,这两个是同一个货色吗?答案是必定的
Kubernetes 简称 k8s,是用 8 来代替 8 个字符 “ubernete” 的缩写
这个一个用来治理云平台中多个主机上的容器化利用,它的目标便是让部署容器化的利用简略且高效,它提供了利用部署,布局,更新,保护的一种机制。
咱们先来看看部署利用的迭代过程:
- 传统部署: 间接将应用程序部署在物理机上
- 虚拟化部署: 能够在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境
- 容器化部署: 与虚拟机相似,然而共享了操作系统
看了以上部署形式,想想看你们公司当初是用的哪一种~ 说到容器化部署,学过 docker 的同学必定第一工夫想到docker,docker 的容器化部署形式的确给咱们带来了很多便当,然而问题也是存在的,有时候这些问题会被咱们刻意性的回避,因为 docker 切实是有点好用,让人有点不忍心对它产生质疑,然而又不得不面对:
- 一个容器故障停机了,怎么样保障高可用让另外一个容器立即启动去替补上停机的容器
- 当并发访问量上来的时候,是否能够做到主动扩容,并发访问量上来的时候是否能够做到主动缩容
- …
容器的问题的确有时候挺值得沉思的,而这些容器治理的问题统称为 容器编排 问题,咱们能想到的问题,天然有人去解决,例如 docker 自家就推出了 Docker Swarm 容器编排工具,Apache 退出了 Mesos 资源对立管控工具,Google 推出了Kubernetes
容器编排工具,而这也是咱们要说到的配角!
1)K8s 长处
- 自我修复:一旦某一个容器解体,可能在 1 秒左右迅速启动新的容器
- 弹性伸缩:能够依据须要,主动对集群中正在运行的容器数量进行调整
- 服务发现:服务能够通过主动发现的模式找到它所依赖的服务
- 负载平衡:如果一个服务启动了多个容器,可能主动实现申请的负载平衡
- 版本回退:如果发现新公布的程序版本有问题,能够立刻回退到原来的版本
- 存储编排:能够依据容器本身的需要主动创立存储卷
2)K8s 形成组件
一个残缺的 Kubernetes 集群是由 管制节点 master、工作节点 node 形成的,因而这种集群形式也分为 一主多从 和 多主多从,而每个节点上又会装置不同组件以提供服务。
1、Master
集群的管制立体,负责集群的决策(治理)。它旗下存在以下组件
- ApiServer:资源操作的惟一入口,接管用户输出的命令,提供认证、受权、Api 注册和发现等机制
- Scheduler:负责集群资源调度,依照预约的调度策略将 pod 调度到相应的 node 节点上
- ControllerManager:负责保护集群的状态,比方程序部署安顿,故障检测,主动扩大,滚动更新等
- Etcd:负责存储集群中各种资源对象的信息
2、Node
集群的数据立体,负责为容器提供运行环境(干活)。它旗下存在以下组件
- Kubelet:负责保护容器的生命周期,即通过管制 docker 来创立、更新、销毁容器
- KubeProxy:负责提供集群外部的服务发现和负载平衡
看完了以上介绍,那咱们接下来就开始进行 k8s 集群的搭建!
二、k8s 集群搭建
1)Centos7 装置
首先咱们须要软件:
- VMware Workstation Pro
- Centos 7.0 镜像
虚拟机软件可百度查找下载,如若没有分割小菜,小菜给你提供
镜像可拜访阿里云进行下载,如下图:下载地址
实现虚拟机的装置后咱们便可在 VMware 中装置 Centos7
- 咱们抉择 创立新的虚拟机
- 抉择自定义装置
典型装置:VMware 会将支流的配置利用在虚拟机的操作系统上,对于老手来很敌对。
自定义装置:自定义装置能够针对性的把一些资源增强,把不须要的资源移除。防止资源的节约。
- 兼容性个别向下兼容
- 抉择咱们下载好的 centos 镜像
- 给本人的虚拟机调配名称和装置地址,咱们须要装置三台,所以名称我这里别离命名为(master、node01、node02)
- 给本人的虚拟机分配资源,最低要求个别是 2 核 2G 内存
- 这里应用 NAT 网络类型
桥接:抉择桥接模式的话虚拟机和宿主机在网络上就是平级的关系,相当于连贯在同一交换机上。
NAT:NAT 模式就是虚拟机要联网得先通过宿主机能力和里面进行通信。
仅主机:虚拟机与宿主机间接连起来
- 接下来始终下一步,而后点击实现即可
- 装置完后咱们便能够在页面看到以下后果,点击开启此虚拟机:
- 抉择 install CentOS7
- 而后就能够看到装置过程:
- 过一会便会看到让咱们抉择语言的界面,这里抉择中文并持续
- 软件抉择咱们能够选
基础设施服务器
,装置地位可选主动分区
- 而后咱们须要点击 网络和主机名 进入网络配置
- 咱们在 tarbar 栏点击 编辑 -> 虚构网络编辑器 查看虚拟机的子网 IP
- 这边咱们手动自定义增加 Ipv4 的地址,DNS 服务器可填阿里云的
咱们调配的地址须要排除 255
和 02
这两个地址,别离是播送和网关地址。
我是这样配置的:
master 节点:
192.168.108.100
node01 节点:
192.168.108.101
node02 节点:
192.168.108.102
- 配置完抉择保留并点击实现,而后设置主机名
我是这样配置的:
master 节点:
master
node01 节点:
node01
node02 节点:
node02
- 实现以上配置后,大抵是如下样子
- 点击开始装置后,咱们来到了以下页面,而后配置以下两个信息
实现以上配置后,重启便能够应用,其余两个节点也是同样的配置,能够间接抉择克隆,网络配置和主机名 记得改~ 而后咱们便失去以下配置的三个服务器:
主机名 | IP | 配置 |
---|---|---|
master | 192.168.108.100 | 2 核 2G 内存 30G 硬盘 |
node01 | 192.168.108.101 | 2 核 2G 内存 30G 硬盘 |
node02 | 192.168.108.102 | 2 核 2G 内存 30G 硬盘 |
2)环境配置
实现以上服务器的搭建后,咱们能够利用 shell 工具 进行连贯,开始搭建 k8s 环境
- 主机名解析
为了集群节点间的间接调用,咱们须要配置一下主机名解析,别离在三台服务器上编辑 /etc/hosts
- 同步工夫
集群中的工夫必须要准确统一,咱们能够间接应用 chronyd
服务从网络同步工夫,三台服务器需做同样的操作
- 禁用 iptables 和firewalld服务
kubernetes 和 docker 在运行中会产生大量的 iptables 规定,为了不让零碎规定跟它们混同,间接关闭系统的规定。三台虚拟机需做同样操作:
# 1 敞开 firewalld 服务
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
# 2 敞开 iptables 服务
[root@master ~]# systemctl stop iptables
[root@master ~]# systemctl disable iptables
- 禁用selinux
selinux是 linux 零碎下的一个平安服务,如果不敞开它,在装置集群中会产生各种各样的奇葩问题
# 永恒敞开
[root@master ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config
# 长期敞开
[root@master ~]# setenforce 0
- 禁用 swap 分区
swap 分区指的是虚拟内存分区,它的作用是在物理内存应用完之后,将磁盘空间虚构成内存来应用启用 swap 设施会对系统的性能产生十分负面的影响,因而 kubernetes 要求每个节点都要禁用 swap 设施然而如果因为某些起因的确不能敞开 swap 分区,就须要在集群装置过程中通过明确的参数进行配置阐明
# 长期敞开
[root@master ~]# swapoff -a
# 永恒敞开
[root@master ~]# vim /etc/fstab
正文掉 swap 分区那一行
- 批改 linux 的内核参数
咱们须要批改 linux 的内核参数,增加网桥过滤和地址转发性能,编辑 /etc/sysctl.d/kubernetes.conf
文件,增加如下配置:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
增加后进行以下操作:
# 从新加载配置
[root@master ~]# sysctl -p
# 加载网桥过滤模块
[root@master ~]# modprobe br_netfilter
# 查看网桥过滤模块是否加载胜利
[root@master ~]# lsmod | grep br_netfilter
同样是在三台服务器都进行操作,胜利信息如下:
- 配置 ipvs 性能
在 kubernetes 中service有两种代理模型,一种是基于 iptables 的,一种是基于 ipvs 的
相比拟的话,ipvs的性能显著要高一些,然而如果要应用它,须要手动载入 ipvs 模块
# 装置 ipset 和 ipvsadm
[root@master ~]# yum install ipset ipvsadmin -y
# 增加须要加载的模块写入脚本文件
[root@master ~]# cat <<EOF > /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
# 为脚本文件增加执行权限
[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
# 执行脚本文件
[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
# 查看对应的模块是否加载胜利
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
- 实现以上配置后重启服务器
[root@master ~]# reboot
3)docker 装置
第一步:
# 获取镜像源
[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
第二步:
# 装置特定版本的 docker-ce
# 必须指定 --setopt=obsoletes=0,否则 yum 会主动装置更高版本
[root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
第三步:
# 增加一个配置文件
# Docker 在默认状况下应用的 Cgroup Driver 为 cgroupfs,而 kubernetes 举荐应用 systemd 来代替 cgroupfs
[root@master ~]# mkdir /etc/docker
第四步:
# 增加阿里云 yum 源, 可从阿里云容器镜像治理中复制镜像减速地址
[root@master ~]# cat <<EOF > /etc/docker/daemon.json
{"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF
第五步:
# 启动 docker
[root@master ~]# systemctl enable docker && systemctl start docker
实现以上 5 步,也就实现了 docker 的装置,离胜利更近一步~
4)集群初始化
1、因为 kubernetes 的镜像源在国外,速度比较慢,因而咱们须要切换成国内的镜像源
# 编辑 /etc/yum.repos.d/kubernetes.repo 增加一下配置
[root@master ~]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
2、而后装置 kubeadm、kubelet 和kubectl 三个组件
yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0
kubectl-1.17.4-0 -y
3、配置 kubelet 的 group
# 编辑 /etc/sysconfig/kubelet,增加上面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
4、这步是来初始化集群的,因而只需在 master 服务器上执行即可
,下面那些是每个服务器都须要执行!
# 创立集群
# 因为默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址
[root@master ~]# kubeadm init \
--apiserver-advertise-address=192.168.108.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.17.4 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12
#应用 kubectl 工具
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
而后咱们须要将node 节点退出集群中,在 node 服务器
上执行上述红框的命令:
[root@master ~]# kubeadm join 192.168.108.100:6443 --token xxx \
--discovery-token-ca-cert-hash sha256:xxx
便可在 master 节点 获取到节点信息:
然而咱们这个时候查看集群状态都是为NotReady
,这是因为还没有配置网络插件
5、装置网络插件
kubernetes反对多种网络插件,比方 flannel、calico、canal 等等,这里抉择应用flanne
下载 flanneld-v0.13.0-amd64.docker:下载地址
下载实现后,上传至 master 服务器 执行以下命令
docker load < flanneld-v0.13.0-amd64.docker
执行实现后便可看到多了个 flannel 镜像:
而后咱们须要获取 flannel 的配置文件来部署 flannel 服务
[root@master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 应用配置文件启动 fannel
[root@master ~]# kubectl apply -f kube-flannel.yml
# 再次查看集群节点的状态
[root@master ~]# kubectl get nodes
这个时候所有节点的状态都是Ready
的状态,到此为止,咱们的 k8s 集群就算搭建实现了!
5)集群性能验证
接下来就是咱们的验证工夫,之前咱们学 docker 的时候往往会启动一个 nginx 容器来测试是否可用,k8s 咱们也同样来部署一个 nginx 来测试下服务是否可用~
(上面例子为测试例子,如果不分明每个指令的作用也不要紧,前面咱们会出篇 k8s 的教学文章来阐明 k8s 如果应用!)
- 首先咱们创立一个 deployment
[root@master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine
deployment.apps/nginx created
[root@master ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 31s
- 而后创立一个 service 来让外界可能拜访到咱们 nginx 服务
[root@master ~]# kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePort
service/nginx exposed
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx NodePort 10.110.224.214 <none> 80:31771/TCP 5s
而后咱们通过 node 节点的 IP 加上 service 裸露进去的 nodePort 来拜访咱们的 nginx 服务:
也能够间接在集群中通过 service 的 IP 加上映射进去的 port 来拜访咱们的服务:
从后果上看两种拜访都是可用的,阐明咱们的 nginx 服务部署胜利,无妨点个关注助助兴~
公众号搜寻:小菜良记
更多干货值得浏览哦!
那么为什么咱们能够拜访到 nginx?咱们无妨联合下面说到的 k8s 组件来梳理一下各个组件的调用关系:
- kubernetes 启动后,无论是 master 节点 亦或者 node 节点,都会将本身的信息存储到 etcd 数据库中
- 创立 nginx 服务,首先会将装置申请发送到 master 节点上的 apiServer 组件中
- apiServer 组件会调用 scheduler 组件来决定应该将该服务装置到哪个 node 节点上。这个时候就须要用到 etcd 数据库了,scheduler会从 etcd 中读取各个 node 节点的信息,而后依照肯定的算法进行抉择,并将后果告知给 apiServer
- apiServer 调用 controllerManager 去调度 node 节点,并装置 nginx 服务
-
node 节点上的 kubelet 组件接管到指令后,会告诉docker,而后由 docker 来启动一个 nginx 的pod
pod 是 kubernetes 中的最小操作单元,容器都是跑在 pod 中
- 以上步骤实现后,nginx 服务便运行起来了,如果须要拜访 nginx,就须要通过 kube-proxy 来对 pod 产生拜访的代理,这样内部用户就能拜访到这个 nginx 服务
以上便是运行一个服务的全过程,不晓得看完之后有没有一种 肃然起敬
的感觉,设计是在太奇妙了,因而到这里,难道就不筹备看 k8s 应用下文!如果筹备看的话,小手将关注点起来哦!
END
以上便是 k8s 集群的搭建过程,有了 k8s 的环境,你还怕学不会 k8s 的应用吗!在本人的虚拟机上纵情折腾,弄坏了也就一个复原快照的事~ 我是小菜,路漫漫,与你一起求索!
明天的你多致力一点,今天的你就能少说一句求人的话!
我是小菜,一个和你一起学习的男人。
💋
微信公众号已开启,小菜良记,没关注的同学们记得关注哦!