目录:
一.k8s简介
Kubernetes(k8s)是 Google 开源的容器集群管理系统,其设计源于 Google 在容器编排方面积累的丰富经验,并结合社区创新的最佳实践。Kubernetes 在 Docker容器技术的基础上,大大地提高了容器化部署应用简单高效。经过几年的快速发展,Kubernetes 已经成为建设容器云平台的首选方案。
1.Kubernetes的主要功能
(1)自我修复
在节点故障时重新启动失败的容器,替换和重新部署容器,保证预期的副本数量;杀死健康检测失败的容器,并且在未准备好之前不会处理客户端请求,确保业务 Online。
(2)弹性伸缩
使用命令、UI 或基于 CPU 使用情况自动快速扩容和缩容应用程序实例,确保应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成为运行服务。
(3)自动部署和回滚
Kubernetes 采用滚动更新策略更新应用,一次更新一个 Pod,而非同时删除所有 Pod,如果更新过程中出现问题,Kubernetes 将回滚更改,升级保证业务不受影响。
(4)存储编排
挂载外部存储系统,无论是来自本地存储、公有云,还是网络存储都作为集群资源的一部分使用,极大提高存储使用灵活。
(5)服务发现和负载均衡
Kubernetes 为多个容器提供一个统一访问入口(内部 IP 和一个 DNS 名称),并且负载均衡关联到所有容器,使得用户无需考虑容器 IP 变动的问题。集群内应用可以通过 DNS 名称访问另一个应用,方便微服务之间通信。
(6)机密和配置管理
管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。
(7)资源监控
Node 节点组件集成 cAdvisor 资源收集工具,可通过 Heapster 汇总整个集群节点资源数据,然后存储到 InfluxDB 时序数据库,再有 Grafana 展示,可以快速实现对集群资源监控,满足基本监控需求。
(8)提供认证和授权
支持属性访问控制(ABAC)、角色访问控制(RBAC)认证授权策略,控制用户是否有权限使用 Kubernetes API 做某些事情,精细化权限分配额。
2.kubernetes设计架构
Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统。
3.Kubernetes主要由以下几个核心组件组成
etcd:保存了整个集群的状态
apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上
kubelet:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI)
kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡
除了核心组件,还有一些推荐的Add-ons:
kube-dns:负责为整个集群提供DNS服务
Ingress Controller:为服务提供外网入口
Heapster:提供资源监控
Dashboard:提供GUI
Federation:提供跨可用区的集群
Fluentd-elasticsearch:提供集群日志采集、存储与查询
Kubernetes设计理念和功能其实就是一个类似Linux的分层架构
核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)
管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
接口层:kubectl命令行工具、客户端SDK以及集群联邦
生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等
Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等
二.k8s的部署
将server2,3,4清理即可,因为server1是harbor仓库端不用清理!!
我们首先将之前实验的docker缓存清理!
清理完后,记得重启服务!
docker service ls
docker service rm game2048 #自己有什么service就删除什么
cd /etc/systemd/system/docker.service.d/
rm -f 10-machine.conf
docker network prune
docker volume prune
docker image prune
docker container prune
重启服务!
systemctl daemon-reload
systemctl restart docker
重启服务:
1.禁用swap分区
在server2,3,4端都禁止即可!
swapoff -a
vim /etc/fstab
注释掉/etc/fstab文件中的swap定义 防止开机自启
2.修改驱动
cd /etc/docker
修改daemon-json文件如下
{
"registry-mirrors": ["https://reg.westos.org"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
重启服务,docker info 查看驱动改变即可!
systemctl daemon-reload
systemctl restart docker
docker info
将改好的daemon.json 文件传到server3,4,然后重启服务即可!
![请添加图片描述](https://img-blog.csdnimg.cn/1237baa145c54aecbeffcd13e6277c37.png请添加图片描述
systemctl restart docker
3.安装部署软件kubeadm
配置yum源
root@server2 ~]# cd /etc/yum.repos.d/
[root@server2 yum.repos.d]# vim k8s.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
当然需要开启真机的路由,使得虚拟机能上网!
在server2,3,4上都需要下载kubelet kubeadm kubectl
并设置开启服务,开机自启
[root@server2 ~]# yum install kubelet kubeadm kubectl
[root@server2 ~]# systemctl enable --now kubelet
[root@server2 yum.repos.d]# scp k8s.repo server3:/etc/yum.repos.d/
[root@server2 yum.repos.d]# scp k8s.repo server4:/etc/yum.repos.d/
查看默认配置信息
kubeadm config print init-defaults
管理端需要拉取镜像,并指定阿里云的网址
[root@server2 ~]# kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
## 列出所需镜像
[root@server2 ~]# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
## 拉取镜像
拉取得时候,会提示coredns:1.8.0错误!因为下载不成功!
所以我们需要在server1上拉取这个镜像并上传到仓库k8s中!!
我们在harbor仓库建立一个属于k8s的 !要选公开!!!
我们需要在server1上拉取下来并上传到仓库
这个coredns:v1.8.0版本一定要写对
docker pull coredns:1.8.0
docker tag coredns/coredns:1.8.0 reg.westos.org/k8s/coredns:v1.8.0
docker push reg.westos.org/k8s/coredns:v1.8.0
比如第一次是没有加版本v在后续初始化过程就会报错!!如下图所示
所以更改如下:
刚在server2上拉取得registry.aliyuncs.com/google_containers改标签为reg.westos.org/k8s/
直接用shell命令搞定!
docker images | grep ^registry.aliyuncs.com | awk '{print $1":"$2}' | awk -F/ '{print $0}'
docker images | grep ^registry.aliyuncs.com | awk '{print $1":"$2}' | awk -F/'{system("docker tag "$0" reg.westos.org/k8s"$3"")}'
再次查看修改标签成功!
docker images | grep ^registry.aliyuncs.com | awk '{print $1":"$2}'
上传镜像到仓库!
docker images | grep ^reg.westos.org/k8s | awk '{system("docker push "$1":"$2"")}'
在wewb端仓库可以看到上传成功!
4.初始化集群
用registry.aliyuncs.com/google_container有一个拉取不下来会报错!所以用刚才将所有镜像都上传的私有仓库来初始化就不会出错!而且速度快!
[root@server2 ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.westos.org/k8s
生成的kubeadm join *********
需要用来加入集群!
将k8s的指定配置文件写进环境变量
vim .bash_profile
因为我们需要用kubectl指令来完成后续动作,所以需要在~/.bashrc
中将kubectl补齐的指令写进去
最好再下载一下系统自带的补齐工具
yum install -y bash-*
此时我们就可以用kubectl 用tab键补齐后面的指令!
我们会发现有状态是pending而不是runnning
[root@server2 ~]# kubectl get pod -n kube-system
为什么?
那是因为我们没有安装flannel网络组件
三.安装flannel网络组件
1.拉取flannel最新版本
因为在做实验的时候,有可能flannel已经更新了,所以根据自己的版本去做,版本号写对即可!!
网址:https://github.com/coreos/flannel
或者:链接: kube-flannel.yml 提取码: s452
我们在server1拉取flannel并上传到私有仓库!
[root@server1 ~]# docker pull quay.io/coreos/flannel:v0.14.0
[root@server1 ~]# docker tag quay.io/coreos/flannel:v0.14.0 reg.westos.org/library/flannel:v0.14.0
[root@server1 ~]# docker push reg.westos.org/library/flannel:v0.14.0
2.下载yml文件
直接从网上wget将yml文件下载下来如下:
yum install -y wget
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
vim kube-flannel.yml
kube-flannel.yml文件只需要改一下镜像的版本!
修改如下:
kubectl apply -f kube-flannel.yml
再次查看k8s的pod状态
都是running状态了!
[root@server2 ~]# kubectl get pod --namespace kube-system
3.加入k8s集群
将刚才初始化生成的指令复制下来,在server3,4上执行,使得他们加入集群!
最后在master端查看节点状态
要是都是ready就代表成功!!
[root@server2 ~]# kubectl get nodes
查询状态,以及pod 等都显示正常,到这里集群部署就结束了。