一. 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地址 | 服务 |
---|---|---|
master | 192.168.1.21 | docker |
node01 | 192.168.1.22 | docker |
node02 | 192.168.1.23 | docker |
环境准备
分别将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
2.关闭防火墙及禁用selinux
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
[root@master ~]# vim /etc/selinux/config
3. 禁用swap(三台)
[root@master ~]# swapoff -a
//临时禁用swap
[root@master ~]# free -h
[root@master ~]# vim /etc/fstab
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
把域名解析复制到其他主机
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
(1)指定yum安装kubernetes的yum源(三台)
cat < /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
创建本地缓存(三台)
[root@master ~]# yum makecache fast
(2)各节点安装所需安装包
1.master下载
[root@master ~]# yum -y install kubeadm-1.15.0-0 kubelet-1.15.0-0 kubectl-1.15.0-0
2.node01和node02下载
[root@node01 ~]# yum -y install kubeadm-1.15.0-0 kubelet-1.15.0-0
3.三台主机把 kubelet加入开机自启
[root@master ~]# systemctl enable kubelet
(3)master导入,之前准备好的镜像
从docker镜像站下载镜像
docker pull mirrorgooglecontainers/kube-apiserver:v1.14.1
docker pull mirrorgooglecontainers/kube-controller-manager:v1.14.1
docker pull mirrorgooglecontainers/kube-scheduler:v1.14.1
docker pull mirrorgooglecontainers/kube-proxy:v1.14.1
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd:3.3.10
docker pull coredns/coredns:1.3.1
本地上传镜像
[root@master ~]# mkdir images
[root@master ~]# cd images/
[root@master images]# ls
1.创建一个导入镜像的脚本
[root@master images]# cat > image.sh < #!/bin/bash
> for i in /root/images/*
> do
> docker load < $i
> done
> EOF
[root@master images]# chmod +x image.sh
2.导入镜像
[root@master images]# sh image.sh
3.初始化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
[root@master images]# kubectl get node
//查看当前节点信息
可以看出master的状态是未就绪(NotReady),之所以是这种状态是因为还缺少一个附件flannel,没有网络各Pod是无法通信的
4.也可以通过检查组件的健康状态
[root@master images]# kubectl get cs
5.添加网络组件(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网络运行正常)
[root@master images]# kubectl get pod -n kube-system
//查看名称空间为kube-system的pod
查看当前节点信息
kubectl get node
//查看当前节点信息(已经准备好了)
四. node两台节点,导入镜像并加入群集
(1)导入镜像
上传所需镜像包,也可以使用docker pull下载
[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
//查看本地镜像
(2)node01和node02加入群集
这时使用的命令是初始化群集之后生成的令牌(只有24小时的时效)
[root@node01 ~]# kubeadm join 192.168.1.21:6443 --token z0vknh.s6ib4eu4f8bre2nu --discovery-token-ca-cert-hash sha256:8da72cc83f45d1247f42ce888658129b43726fe2af4ffc0c4e79faedb4050359
(3)加入群集之后查看一下
[root@master images]# kubectl get node
五. 各节点优化一下
(1)设置table键的默认间距;
[root@master ~]# vim .vimrc
set tabstop=2
[root@master ~]# source .vimrc
(2)设置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
(3)确认k8s群集没有问题,并设置为开机自启
master主机操作如下:
[root@master ~]# kubectl get pod -n kube-system
#查看pod资源,类似于docker中的容器,确保返回的信息都是running
#“-n kube-system”:是k8s的名称空间
master和node节点上都需要进行以下操作,以便设置为开机自启:
[root@master ~]# systemctl enable kubelet
[root@master ~]# systemctl enable docker
设置为开机自启后,k8s群集的配置基本完成了,现在可以重启一下这三台服务器,如果重启后,执行下面的命令,状态都还是running,则表示绝对没有问题了。
[root@master ~]# kubectl get pod -n kube-system #重启后验证状态是否还都是running
参考的链接:https://www.jianshu.com/p/4dcfcde779e1
链接:https://blog.51cto.com/14154700/2447761