淘先锋技术网

首页 1 2 3 4 5 6 7

一. Kubernetes 系统简介

首先,他是一个全新的基于容器技术的分布式架构领先方案。Kubernetes(k8s)是Google开源的容器集群管理系统(内部:Borg)。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
  Kubernetes是一个完备的分布式系统支撑平台,具有完备的集群管理能力,多扩多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、內建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。同时Kubernetes提供完善的管理工具,涵盖了包括开发、部署测试、运维监控在内的各个环节。

Kubernetes中,Service是分布式集群架构的核心,一个Service对象拥有如下关键特征:

拥有一个唯一指定的名字
拥有一个虚拟IP(Cluster IP、Service IP、或VIP)和端口号
能够体统某种远程服务能力
被映射到了提供这种服务能力的一组容器应用上

Service的服务进程目前都是基于Socket通信方式对外提供服务,比如Redis、Memcache、MySQL、Web Server,或者是实现了某个具体业务的一个特定的TCP Server进程,虽然一个Service通常由多个相关的服务进程来提供服务,每个服务进程都有一个独立的Endpoint(IP+Port)访问点,但Kubernetes能够让我们通过服务连接到指定的Service上。有了Kubernetes内奸的透明负载均衡和故障恢复机制,不管后端有多少服务进程,也不管某个服务进程是否会由于发生故障而重新部署到其他机器,都不会影响我们队服务的正常调用,更重要的是这个Service本身一旦创建就不会发生变化,意味着在Kubernetes集群中,我们不用为了服务的IP地址的变化问题而头疼了。
  容器提供了强大的隔离功能,所有有必要把为Service提供服务的这组进程放入容器中进行隔离。为此,Kubernetes设计了Pod对象,将每个服务进程包装到相对应的Pod中,使其成为Pod中运行的一个容器。为了建立Service与Pod间的关联管理,Kubernetes给每个Pod贴上一个标签Label,比如运行MySQL的Pod贴上name=mysql标签,给运行PHP的Pod贴上name=php标签,然后给相应的Service定义标签选择器Label Selector,这样就能巧妙的解决了Service于Pod的关联问题。
  在集群管理方面,Kubernetes将集群中的机器划分为一个Master节点和一群工作节点Node,其中,在Master节点运行着集群管理相关的一组进程kube-apiserver、kube-controller-manager和kube-scheduler,这些进程实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理能力,并且都是全自动完成的。Node作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod。Node上运行着Kubernetes的kubelet、kube-proxy服务进程,这些服务进程负责Pod的创建、启动、监控、重启、销毁以及实现软件模式的负载均衡器。
  在Kubernetes集群中,它解决了传统IT系统中服务扩容和升级的两大难题。你只需为需要扩容的Service关联的Pod创建一个Replication Controller简称(RC),则该Service的扩容及后续的升级等问题将迎刃而解。在一个RC定义文件中包括以下3个关键信息。
目标Pod的定义
目标Pod需要运行的副本数量(Replicas)
要监控的目标Pod标签(Label)

在创建好RC后,Kubernetes会通过RC中定义的的Label筛选出对应Pod实例并实时监控其状态和数量,如果实例数量少于定义的副本数量,则会根据RC中定义的Pod模板来创建一个新的Pod,然后将新Pod调度到合适的Node上启动运行,知道Pod实例的数量达到预定目标,这个过程完全是自动化。

1. Kubernetes优势:

- 容器编排
     - 轻量级
     - 开源
     - 弹性伸缩
     - 负载均衡

2. Kubernetes 特性

Endpoint Slices
Kubernetes 集群中网络端点的可扩展跟踪。
服务发现与负载均衡
无需修改您的应用程序即可使用陌生的服务发现机制。Kubernetes 为容器提供了自己的 IP 地址和一个 DNS 名称,并且可以在它们之间实现负载平衡。
自我修复
重新启动失败的容器,在节点死亡时替换并重新调度容器,杀死不响应用户定义的健康检查的容器,并且在它们准备好服务之前不会它们公布给客户端。
自动装箱
根据资源需求和其他约束自动放置容器,同时不会牺牲可用性,将任务关键工作负载和尽力服务工作负载进行混合放置,以提高资源利用率并节省更多资源。
IPv4/IPv6 双协议栈
Allocation of IPv4 and IPv6 addresses to Pods and Services
水平伸缩
使用一个简单的命令、一个UI或基于CPU使用情况自动对应用程序进行伸缩。

3. Kubernetes的Master和Node节点

1.Master

k8s集群的管理节点,负责管理集群,提供集群的资源数据访问入口。拥有Etcd存储服务(可选),运行Api Server进程,Controller Manager服务进程及Scheduler服务进程,关联工作节点Node。Kubernetes API server提供HTTP Rest接口的关键服务进程,是Kubernetes里所有资源的增、删、改、查等操作的唯一入口。也是集群控制的入口进程;Kubernetes Controller Manager是Kubernetes所有资源对象的自动化控制中心;Kubernetes Schedule是负责资源调度(Pod调度)的进程

2.Node

Node是Kubernetes集群架构中运行Pod的服务节点(亦叫agent或minion)。Node是Kubernetes集群操作的单元,用来承载被分配Pod的运行,是Pod运行的宿主机。关联Master管理节点,拥有名称和IP、系统资源信息。运行docker eninge服务,守护进程kunelet及负载均衡器kube-proxy.
每个Node节点都运行着以下一组关键进程
kubelet:负责对Pod对于的容器的创建、启停等任务
kube-proxy:实现Kubernetes Service的通信与负载均衡机制的重要组件
Docker Engine(Docker):Docker引擎,负责本机容器的创建和管理工作

Node节点可以在运行期间动态增加到Kubernetes集群中,默认情况下,kubelet会想master注册自己,这也是Kubernetes推荐的Node管理方式,kubelet进程会定时向Master汇报自身情报,如操作系统、Docker版本、CPU和内存,以及有哪些Pod在运行等等,这样Master可以获知每个Node节点的资源使用情况,冰实现高效均衡的资源调度策略。

4. Kubernetes Node运行节点,运行管理业务容器,包含如下组件:

(1)Kubelet

负责管控容器,Kubelet会从Kubernetes API Server接收Pod的创建请求,启动和停止容器,监控容器运行状态并汇报给Kubernetes API Server。

(2)Kubernetes Proxy

负责为Pod创建代理服务,Kubernetes Proxy会从Kubernetes API Server获取所有的Service信息,并根据Service的信息创建代理服务,实现Service到Pod的请求路由和转发,从而实现Kubernetes层级的虚拟转发网络。

(3)Docker

Node上需要运行容器服务

k8s最基本的硬件要求

CPU: 双核
Mem: 2G
3台dockerhost
时间必须同步

实验环境

主机名IP地址服务
master192.168.1.21dockerhost
node01192.168.1.22dockerhost
node02192.168.1.23dockerhost

环境准备

分别将3台虚拟机命名,设置好对应IP,并将其写入域名解析/etc/hosts中,关闭防火墙,iptables,禁用selinux。还有要做到,时间必须一致。全部禁用swap

1.给三台docker命名

k8.1

[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# su -

k8.2

[root@localhost ~]# hostnamectl set-hostname node01
[root@localhost ~]# su -

k8.3

[root@localhost ~]# hostnamectl set-hostname node02
[root@localhost ~]# su -

验证docker是否能使用及版本是否一样

[root@master ~]# docker -v

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CHX19Tvx-1675331617435)(E:/ndm/tuchuang-master/tuchuang-master/img/image-20200102093813472.png)]

2.关闭防火墙及禁用selinux

[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
[root@master ~]# vim /etc/selinux/config

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vsYBIIWa-1675331617436)(E:/ndm/tuchuang-master/tuchuang-master/img/image-20200102115453524.png)]

3. 禁用swap(三台)

[root@master ~]# swapoff -a
//临时禁用swap
[root@master ~]# free -h
//查看内存
[root@master ~]# vim /etc/fstab
//禁用swap交换内存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-66jAXW4m-1675331617436)(E:/ndm/tuchuang-master/tuchuang-master/img/image-20200102094039749.png)]

4.添加域名解析(三台)

[root@master ~]# echo 192.168.1.21 master >> /etc/hosts
[root@master ~]# echo 192.168.1.22 node01 >> /etc/hosts
[root@master ~]# echo 192.168.1.23 node02 >> /etc/hosts

5.做免密登陆(三台)

[root@master ~]# ssh-keygen -t rsa
//生成密钥

复制密钥到其他主机

54  ssh-copy-id node01
55  ssh-copy-id node02

把域名解析复制到其他主机484701*****Ww

63  scp /etc/hosts node01:/etc
64  scp /etc/hosts node02:/etc

6.打开路由转发和iptables桥接功能(三台)

[root@master ~]# vim /etc/sysctl.d/k8s.conf
//开启iptables桥接功能
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

[root@master ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf 
//**打开路由转发

[root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf 
[root@master ~]# sysctl -p 
//刷新一下

如果以上命令执行失败可能是缺少模块,可执行以下命令

[root@master ~]# modprobe br_netfiler

把路由转发和iptables桥接复制到其他主机

[root@master ~]# scp /etc/sysctl.d/k8s.conf  node01:/etc/sysctl.d/
[root@master ~]# scp /etc/sysctl.d/k8s.conf  node02:/etc/sysctl.d/
[root@master ~]# scp /etc/sysctl.conf  node02:/etc/
[root@master ~]# scp /etc/sysctl.conf  node01:/etc/

记得node01和node02也要执行以下命令

[root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf 
[root@master ~]# sysctl -p

master节点安装部署k8s

指定yum安装kubernetes的yum源(三台)

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

下载完成之后,查看一下仓库是否可用

[root@master ~]# yum repolist

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IuHMNcO1-1675331617436)(E:/ndm/tuchuang-master/tuchuang-master/img/image-20200102095945934.png)]

创建本地缓存(三台)

[root@master ~]# yum makecache fast

各节点安装所需安装包

master下载

[root@master ~]# yum -y install kubeadm-1.15.0-0 kubelet-1.15.0-0 kubectl-1.15.0-0

node01和node02下载

[root@node01 ~]# yum -y install kubeadm-1.15.0-0 kubelet-1.15.0-0

三台主机把 kubelet加入开机自启

[root@master ~]# systemctl enable kubelet

master导入,之前准备好的镜像

[root@master ~]# mkdir images
[root@master ~]# cd images/
[root@master images]# ls

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xflCx6gF-1675331617436)(E:/ndm/tuchuang-master/tuchuang-master/img/image-20200102101531123.png)]

创建一个导入镜像的脚本

[root@master images]# cat > image.sh <<EOF
#!/bin/bash
for i in /root/images/*
do
docker load < $i 
done

[root@master images]# chmod +x image.sh

导入镜像

[root@master images]# sh image.sh

初始化Kubernetes集群

[root@master ~]#  kubeadm init --kubernetes-version=v1.15.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap

如果以上的命令报错,找出问题后先重置一下(下面的命令),然后再执行以上命令

[root@master ~]# kubeadm reset
//重置kubeadm

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xivJmKa3-1675331617437)(E:/ndm/tuchuang-master/tuchuang-master/img/image-20200102122213788.png)]

[root@master images]# kubectl get node
//查看当前节点信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iaAsBDNm-1675331617437)(E:/ndm/tuchuang-master/tuchuang-master/img/image-20200102110808239.png)]

可以看出master的状态是未就绪(NotReady),之所以是这种状态是因为还缺少一个附件flannel,没有网络各Pod是无法通信的

也可以通过检查组件的健康状态

[root@master images]# kubectl get cs

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TCMjSfxO-1675331617437)(E:/ndm/tuchuang-master/tuchuang-master/img/image-20200102122413443.png)]

添加网络组件(flannel)

组件flannel可以通过https://github.com/coreos/flannel中获取

[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

以上只是方式之一,在网络状况良好的情况下建议使用上述方法(调用远端文件执行一下),若网速较差,建议使用以下方法

[root@master images]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#将github官网指定的.yml配置文件下载到本地
[root@master images]# ls | grep flannel.yml   #确定下载到了当前目录
kube-flannel.yml
[root@master images]# kubectl apply -f kube-flannel.yml  #指定下载的.yml文件执行相应命令

上述方法,二选一进行配置即可。

看到很多东西被创建是还不够的,还需要查看flannel是否处于正常启动并运行的状态,才算正在的部署完成

[root@master images]# kubectl get pods --all-namespaces
//查看所有的名称空间的pod(可以看到flannel网络运行正常)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3vs04rKK-1675331617437)(E:/ndm/tuchuang-master/tuchuang-master/img/image-20200102122732587.png)]

[root@master images]# kubectl get pod -n kube-system
//查看名称空间为kube-system的pod

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0NcG87Ou-1675331617437)(E:/ndm/tuchuang-master/tuchuang-master/img/image-20200102122826221.png)]
查看当前节点信息

kubectl get node
//查看当前节点信息(已经准备好了)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m5AxgZCu-1675331617438)(E:/ndm/tuchuang-master/tuchuang-master/img/image-20200102111853910.png)]

node两台节点,导入镜像并加入群集

导入镜像

上传所需镜像包,也可以使用docker pull下载

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iuWG0jqf-1675331617438)(E:/ndm/tuchuang-master/tuchuang-master/img/image-20200102133744555.png)]

[root@node01 images]# docker load < kube-proxy-1-15.tar && docker load -i myflannel-11-0.tar  && docker load -i pause-3-1.tar
[root@node01 images]# docker images
//查看本地镜像

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kRZK6v0o-1675331617438)(E:/ndm/tuchuang-master/tuchuang-master/img/image-20200102134006724.png)]

node01和node02加入群集

这时使用的命令是初始化群集之后生成的令牌(只有24小时的时效)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cj4vaxzq-1675331617438)(E:/ndm/tuchuang-master/tuchuang-master/img/image-20200102134336922.png)]

[root@node01 ~]# kubeadm join 192.168.1.21:6443 --token z0vknh.s6ib4eu4f8bre2nu     --discovery-token-ca-cert-hash sha256:8da72cc83f45d1247f42ce888658129b43726fe2af4ffc0c4e79faedb4050359

加入群集之后查看一下

[root@master images]# kubectl get node

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uqyJMaOe-1675331617438)(E:/ndm/tuchuang-master/tuchuang-master/img/image-20200102114628989.png)]

各节点优化一下

设置table键的默认间距;

[root@master ~]# echo set tabstop=2 > .vimrc
[root@master ~]# vim .vimrc
set tabstop=2
[root@master ~]# source .vimrc

设置kubectl命令自动补全

[root@master ~]# yum  -y install bash-completion
[root@master ~]# source /usr/share/bash-completion/bash_completion 
[root@master ~]# source <(kubectl completion bash)
[root@master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc

确认k8s群集没有问题,并设置为开机自启

master主机操作如下

[root@master ~]# kubectl get pod -n kube-system   
#查看pod资源,类似于docker中的容器,确保返回的信息都是running
#“-n kube-system”:是k8s的名称空间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Olhah8oR-1675331617438)(E:/ndm/tuchuang-master/tuchuang-master/img/image-20200102142028971.png)]

master和node节点上都需要进行以下操作,以便设置为开机自启

[root@master ~]# systemctl enable kubelet
[root@master ~]# systemctl enable docker

设置为开机自启后,k8s群集的配置基本完成了,现在可以重启一下这三台服务器,如果重启后,执行下面的命令,状态都还是running,则表示绝对没有问题了。

[root@master ~]# kubectl get pod -n kube-system    #重启后验证状态是否还都是running