栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

linux企业运维——Kubernetes(一):Kubernetes集群部署

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

linux企业运维——Kubernetes(一):Kubernetes集群部署

1、k8s简介

        Kubernetes(k8s)是 Google 开源的容器集群管理系统,其设计源于 Google 在容器编排方面积累的丰富经验,并结合社区创新的最佳实践。Kubernetes 在 Docker容器技术的基础上,大大地提高了容器化部署应用简单高效。经过几年的快速发展,Kubernetes 已经成为建设容器云平台的首选方案。

1.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 做某些事情,精细化权限分配额。

1.2 kubernetes设计架构

        Kubernetes集群包含有多个节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统。(一个server端其他都是node节点(node节点:提供docker调度的))

(1)node节点

        Pod: k8s调度最小单位是pod。(pod:正常情况下他里面是一个容器,可以配置多个容器在一个pod里面,只要在一个pod内,它里面的容器可以共享的,可以提供共同的存储)

        kubelet: 每个node上面都会有一个进程叫kubelet来维护每个pod状态,如果pod有问题,他会自动的重启。(维护容器的生命周期)

        kube-proxy: kube-proxy会结合防火墙来实现我们网络的通信。

(2)管理节点

       API Server: 负责整个集群的认证授权。

       scheduler:  调度,这个里面会有一系列的调度策略。 调度的时候那些资源是符合要求的,如果没有资源就不会调。(把我们的Pod合理的调度到相应的node上去)

        Etcd: 整个集群的信息是存到etcd里面的,包括网络的配置什么的。

    

 1.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(elk)提供集群日志采集、存储与查询

        Kubernetes设计理念和功能其实就是一个类似Linux的分层架构

        核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境。 

        应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)

        管理层:系统调度,系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)

        接口层:kubectl命令行工具、客户端SDK以及集群联邦。

        生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴。

2、k8s的部署

        将server2,3,4清理即可,因为server1是harbor仓库端不用清理!!
        我们首先将之前实验的docker缓存清理!
        清理完后,记得重启服务!

1  [root@server2 ~]# docker stack ls
2  [root@server2 ~]# docker stack rm myservice  #自己有什么就删除什么
3  [root@server2 ~]# docker stack rm portainer   ##把资源全部删除
4  [root@server3 ~]# docker swarm leave --force  ##离开swarm集群,节点离开
5  [root@server4 ~]# docker swarm leave --force  ##离开swarm集群
6  [root@server2 ~]# docker swarm leave --force  ##强制离开swarm集群,因为他是管理节点,集群只剩他一个节点了
7  [root@server2 ~]# docker container prune   ##清除所有不用的容器
8  [root@server2 ~]# docker network prune   ##清除所有不用的网络
9  [root@server2 ~]# docker volume prune   ##清除所有不用的卷
10 [root@server2 ~]# cd /etc/systemd/system/docker.service.d/
11 [root@server2 ~]# ls
12 [root@server2 ~]# rm -f 10-machine.conf
   重启服务!
13 [root@server2 ~]# systemctl daemon-reload
14 [root@server2 ~]# systemctl restart docker

        server3,4同样需要清理卷、网络、容器。清理配置文件7-14条。否则在部署、配置的时候有冲突。

2.1 修改驱动

server2:

cd /etc/docker
vim  daemon-json文件如下:

{
  "registry-mirrors": ["https://reg.westos.org"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts" {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}

docker info 

.. Cgroup Driver: cgroupfs(查看驱动是cgroupfs我们需要把他改成systemd,统一用systemd来控制)

        我们需要重启服务,用docker info 查看驱动改变了即可!

1  systemctl restart docker
2  docker info

        将改好的daemon.json 文件传到server3,4,然后server3,4  systemctl restart docker 重启服务即可!

1  [root@server2 docker]# scp daemon.json server3:/etc/docker/
2  [root@server2 docker]# scp daemon.json server4:/etc/docker/

        server3,4  systemctl restart docker 重启服务即可!

2.1 禁用swap分区

        在server2,3,4端都禁止即可!

1  swapon -s        ##查看当前有激活的
2  swapoff -a       ##关掉所有的交换分区
2  vim /etc/fstab   
注释掉/etc/fstab文件中的swap定义     防止开机自启 

2.3 安装部署,用的kubeadm软件

        kubeadm:把k8s的所有组件全部用容器的方式运行,我们下载镜像直接运行容器就可以了

        配置yum源:

1  [root@server2 ~]# cd /etc/yum.repos.d/
2  [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
3  [root@server2 yum.repos.d]#  yum list kubeadm

        yum list kubeadm这个查看到的版本是1.21.1-0的。 

        需要开启真机的路由,使得虚拟机能上网!
        在server2,3,4上都需要下载kubelet ,kubeadm, kubectl(操作集群的客户端,这个在想要操作集群的节点上去安装就好)这几个组件。
        并设置开启服务,开机自启。

1  [root@server2 ~]# yum install kubelet kubeadm kubectl
2  [root@server2 ~]# systemctl enable --now kubelet
3  [root@server2 ~]# systemctl enable --now docker
3  [root@server2 yum.repos.d]# scp k8s.repo server3:/etc/yum.repos.d/
4  [root@server2 yum.repos.d]# scp k8s.repo server4:/etc/yum.repos.d/

         查看当前默认配置。

1  kubeadm config print init-defaults    ##所打印的是k8s的默认配置

        管理端需要拉取镜像,并指定阿里云的网址,默认是谷歌下载。

1  [root@server2 yum.repo.d]# kubeadm config images list --image-repository registry.aliyuncs.com/google_containers       ## 列出所需镜像,就可以显示最新新版是v1.21.1
2  [root@server2 yum.repo.d]# kubeadm(自动拉取) config images pull --image-repository registry.aliyuncs.com/google_containers  (要是指定版本,还需要在后面加--kubernetes-version v1.21.0,我们要部署的这个版本和镜像的版本要保持一致就好了)     ## 我们现在需要拉取镜像,可以直接拉取我们要部署实在集群里面部署的,我们在部署的时候他需要下载这些镜像运行容器,如果每个节点自己拉取,那么速度会受到很大影响,所以我们把镜像提前放到私有仓库里面,这样每个节点需要拉取镜像的速度就会更快一点。

     (所以我们需要在server1上把这个镜像部署到我们的私有仓库里面去。

        lftp 172.25.254.250

        .. cd /pub/docs/k8s

        ..  get k8s-v1.21.tar

        ..  exit

        docker load -i k8s-v1.21.tar)

         拉取得时候,会提示coredns:1.8.0错误!因为下载不成功!

         所以我们需要在server1上拉取这个镜像并上传到仓库k8s中!!

         [root@server1 ~]#  docker images | grep k8s

         我们在harbor(私有仓库)里面专门创建一个项目来放置这些镜像,k8s的 ,要选公开!!!不然就是私有的必须要认证了。

        然后需要上传这些镜像。 

 1  [root@server1 ~]#  docker images | grep k8s |awk(调用系统指令system)'system("docker push "$1":"$2"")'(在docker images | grep k8s中取第一行和第二行上传)

         这样所有需要的镜像就都在我们的镜像里面了。 

 这个时候我们的仓库就变了,我们的指向应该指向reg.westos.org/k8s.指向我们的私有仓库。

1  [root@server2 yum.repo.d]# kubeadm config images list --image-repository reg.westos.org/k8s --kubernetes-version v1.21.0    ##列出私有仓库的内容
2  [root@server2 yum.repo.d]# kubeadm config images pull --image-repository reg.weestos.org/k8s --kubernetes-version v1.21.0   ##从刚刚的私有仓库里面拉取镜像
2.4 初始化集群

        用registry.aliyuncs.com/google_container有一个拉取不下来会报错!所以用刚才将所有镜像都上传的私有仓库来初始化就不会出错!而且速度快

1  [root@server2 ~]#  kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.westos.org/k8s --kubernetes-version v1.21.0      ##集群初始化 
\  --pod-network-cidr=10.244.0.0/16(使用flannel的时候必须加,和网络组件有关,我们需要用flannel网络组件来通讯:负责集群之间网络的通讯,flannel需要指定pod的网络子网段,pod的子网段)
\  --kubernetes-version v1.21.0(指定我们所部署的版本)

         

        如果需要操作集群的话,他推荐我们使用普通用户,要使用普通用户的话,我们需要在普通用户家目录 里面创建一个.kube这样的隐藏目录然后用sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config(这个里面是证书)命令把他拷贝进去。

         如果你是超户的话,需要直接告诉他我的配置文件在什么地方就好了。/etc/kubernetes/admin.conf因为这个文件普通用户看不到,需要使用超户的权限把他拷进去。

1  [root@server2 yum.repo.d]# export KUBEConFIG=/etc/kubernetes/admin.conf
2  [root@server2 yum.repo.d]# kube get node 

 

         kube get node 可以查看到还没有准备好notready

        我们需要指定namespace,默认的pod都在这个namespace里面。查看namespace

1  [root@server2 yum.repo.d]# kubectl -n kube-system get pod   ##查看状态

        coredns: dns的辅助插件,他负责整个集群的解析。他是需要使用网络组件才能够激活的,不然他无法通信,所以他的状态一直是Pending。所以加下来我们就需要部署这个网络组件。

3. 安装flannel网络组件 3.1 拉取flannel最新版本

        因为在做实验的时候,有可能flannel已经更新了,所以根据自己的版本去做,版本号写对即可!!

        网址:https://github.com/coreos/flannel

        登录仓库命令:

1  [root@server1 ~]# cd harbor/
2  [root@server1 harbor]# docker login reg.westos.org
.. Username:admin
.. Passwd:

        登录之后在网页访问自己的仓库:172.25.19.1/harbor/projects/1/repositorles  

       我们在server1拉取flannel并上传到私有仓库!(k8s为了安全,不会在外网上拉取,所以在使用的时候一定要搭建私有仓库,其他 所有的k8s节点都是从搭建的私有仓库里面下载的。我们的仓库不要起扫描器,扫描数据就会变,导致镜像不断增大)

1  [root@server1 ~]# docker pull quay.io/coreos/flannel:v0.14.0    ##拉取所需镜像
2  [root@server1 ~]# docker tag quay.io/coreos/flannel:v0.14.0 reg.westos.org/library/flannel:v0.14.0     ##修改镜像的标签
3  [root@server1 ~]# docker push reg.westos.org/library/flannel:v0.14.0   ##上传镜像

 

 

 3.2 下载yml文件

         直接从网上wget将yml文件下载下来如下:

        从网址:https://github.com/coreos/flannel

 

1  [root@server2 yum.repos.d]# cd
2  [root@server2 ~]# yum install -y wget
3  [root@server2 ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/documentation/kube-flannel.yml
  ##下载网络软件插件
4  [root@server2 ~]# ls
.. kube-flannel.yml
5  [root@server2 ~]# vim kube-flannel.yml  ##这里面有镜像,我们需要在server1上提前把镜像下载好

        kube-flannel.yml文件只需要改一下镜像的版本!
修改如下: 

 

 

1  [root@server2 ~]# echo "source<(kubectl completion bash)>" >> ~/.bashrc   ##为了方便,我们需要设置kubectl命令的补齐功能
2  [root@server2 ~]# source .bashrc    ##运行一下
3  [root@server2 ~]# kubectl
4  [root@server2 ~]# kubectl apply -f kube-flannel.yml

        再次查看k8s的pod状态,都是running状态了!

1  [root@server2 ~]# kubectl get pod -n kube-system

 3.3 加入k8s集群

        将刚才初始化生成的指令复制下来,在server3,4上执行,使得他们加入集群!

 

 

 

         最后在master端查看节点状态.
要是都是ready就代表成功!!

1  [root@server2 ~]# kubectl get nodes

 

 

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/333928.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号