首先,他是一个全新的基于容器技术的分布式架构领先方案。Kubernetes(k8s)是Google开源的容器集群管理系统(内部:Borg)。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提升了大规模容器集群管理的便捷性。
Kubernetes是一个完备的分布式系统支撑平台,具备完备的集群管理能力,多扩多层次的安全防御和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、內建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。同时Kubernetes提供完善的管理工具,涵盖了包括开发、部署测试、运维监控在内的各个环节。
Kubernetes中,Service是分布式集群架构的核心,一个Service对象拥有以下关键特征:php
拥有一个惟一指定的名字
拥有一个虚拟IP(Cluster IP、Service IP、或VIP)和端口号
可以体统某种远程服务能力
被映射到了提供这种服务能力的一组容器应用上node
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)mysql
在建立好RC后,Kubernetes会经过RC中定义的的Label筛选出对应Pod实例并实时监控其状态和数量,若是实例数量少于定义的副本数量,则会根据RC中定义的Pod模板来建立一个新的Pod,而后将新Pod调度到合适的Node上启动运行,知道Pod实例的数量达到预约目标,这个过程彻底是自动化。linux
- 容器编排
- 轻量级
- 开源
- 弹性伸缩
- 负载均衡git
Endpoint Slices
Kubernetes 集群中网络端点的可扩展跟踪。
服务发现与负载均衡
无需修改您的应用程序便可使用陌生的服务发现机制。Kubernetes 为容器提供了本身的 IP 地址和一个 DNS 名称,而且能够在它们之间实现负载平衡。
自我修复
从新启动失败的容器,在节点死亡时替换并从新调度容器,杀死不响应用户定义的健康检查的容器,而且在它们准备好服务以前不会它们公布给客户端。
自动装箱
根据资源需求和其余约束自动放置容器,同时不会牺牲可用性,将任务关键工做负载和尽力服务工做负载进行混合放置,以提升资源利用率并节省更多资源。
IPv4/IPv6 双协议栈
Allocation of IPv4 and IPv6 addresses to Pods and Services
水平伸缩
使用一个简单的命令、一个UI或基于CPU使用状况自动对应用程序进行伸缩。github
1.Master
k8s集群的管理节点,负责管理集群,提供集群的资源数据访问入口。拥有Etcd存储服务(可选),运行Api Server进程,Controller Manager服务进程及Scheduler服务进程,关联工做节点Node。Kubernetes API server提供HTTP Rest接口的关键服务进程,是Kubernetes里全部资源的增、删、改、查等操做的惟一入口。也是集群控制的入口进程;Kubernetes Controller Manager是Kubernetes全部资源对象的自动化控制中心;Kubernetes Schedule是负责资源调度(Pod调度)的进程sql
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引擎,负责本机容器的建立和管理工做docker
Node节点能够在运行期间动态增长到Kubernetes集群中,默认状况下,kubelet会想master注册本身,这也是Kubernetes推荐的Node管理方式,kubelet进程会定时向Master汇报自身情报,如操做系统、Docker版本、CPU和内存,以及有哪些Pod在运行等等,这样Master能够获知每一个Node节点的资源使用状况,冰实现高效均衡的资源调度策略。vim
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上须要运行容器服务后端
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
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
[root@master ~]# systemctl stop firewalld [root@master ~]# systemctl disable firewalld [root@master ~]# vim /etc/selinux/config
[root@master ~]# swapoff -a //临时禁用swap [root@master ~]# free -h [root@master ~]# vim /etc/fstab
[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
[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
[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
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
建立本地缓存(三台)
[root@master ~]# yum makecache fast
[root@master ~]# yum -y install kubeadm-1.15.0-0 kubelet-1.15.0-0 kubectl-1.15.0-0
[root@node01 ~]# yum -y install kubeadm-1.15.0-0 kubelet-1.15.0-0
[root@master ~]# systemctl enable kubelet
从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
[root@master images]# cat > image.sh <<EOF > #!/bin/bash > for i in /root/images/* > do > docker load < $i > done > EOF [root@master images]# chmod +x image.sh
[root@master images]# sh image.sh
[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是没法通讯的
[root@master images]# kubectl get cs
组件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 //查看当前节点信息(已经准备好了)
上传所需镜像包,也可使用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 //查看本地镜像
这时使用的命令是初始化群集以后生成的令牌(只有24小时的时效)
[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
[root@master ~]# vim .vimrc set tabstop=2 [root@master ~]# source .vimrc
[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
[root@master ~]# kubectl get pod -n kube-system #查看pod资源,相似于docker中的容器,确保返回的信息都是running #“-n kube-system”:是k8s的名称空间
[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
连接:http://www.javashuo.com/article/p-ykytdane-w.html