Kubernetes是什么?node
首先,它是一个全新的基于容器技术的分布式架构领先方案。这个方案尽然很新,但它是谷歌十几年以来大规模应用容器技术的经验积累和升华的一个重要成果。确切地说,kubernetes是谷歌严格保密十几年的秘密武器Borg的一个开源版本。Borg是谷歌的一个久负盛名的内部使用的大规模集群管理系统,它基于容器技术,目的是实现资源管理的自动化,以及跨多个数据中心的资源利用率的最大化。mysql
2015年4月,传闻许久的Borg论文伴随kubernetes(K8S)的高调宣传被谷歌首次公开,你们才得以了解它的更多内幕。正是因为站在Borg这个前辈的肩膀上,吸收了Borg过去十年间的经验与教训,因此kubernetes一经开源就一举成名,并迅速称霸了容器技术领域。linux
若是咱们的系统设计遵循了kubernetes的设计思想,那么传统系统架构中哪些和业务没有多大关系的底层代码或功能模块,均可以马上从咱们的视线中消失,咱们没必要再费心于负载均衡的选型和部署实施问题,没必要再考虑引入或本身开发一个复杂的服务治理框架,没必要再头疼与服务监控和故障处理模块的开发。总之,使用kubernetes提供的解决方案,咱们节约了很多于30%的开发成本,同时能够将精力更加集中于业务自己,并且因为kubernetes提供了强大的自动化机制,因此系统后期的运维难度和运维成本大幅下降。git
随着 Docker 技术的发展和普遍流行,云原生应用和容器调度管理系统也成为 IT 领域大热的词汇。事实上,在 Docker 技术火爆以前,云原生应用的思想已经由云计算技术的领导者和分布式系统架构的推广者普遍传播。例如早在 2011 年 Heroku 的工程师提出了云原生应用的 12 要素,只不过以虚拟机技术做为云原生应用的基础实施。因为虚拟机镜像大、镜像标准不统一以及打包流程和工具不统一,致使了业界没法普遍接受的云原生应用标准,限制了云原生应用的流行。而 Docker 的出现正好解决了这些限制云原生应用构建、交付和运行的瓶颈,使得构建云原生应用成为了使用 Docker 的开发者天然而然的选择。github
Kubernetes 是为生产环境而设计的容器调度管理系统,对于负载均衡、服务发现、高可用、滚动升级、自动伸缩等容器云平台的功能要求有原生支持。因为 Kubernetes 在K和s间有8个字母,所以常简称 k8s。事实上,随着对 k8s 系统架构与设计理念的了解深刻,会发现 K8s 系统正是到处为运行云原生应用而设计考虑;同时,随着对 k8s 系统使用的加深和推广,也会有愈来愈多有关云原生应用的设计模式产生出来,使得基于 k8s 系统设计和开发生产级的复杂云原生应用变得像启动一个单机版容器服务那样简单易用。sql
使用 Kubernetes 的理由有不少,最基本的一个理由就是:IT 是新技术驱动行业。Docker 这个新兴的容器化技术当前已经被不少公司所采用,其从单机走向集群已成必然,而云计算的蓬勃发展正在加速这一进程。Kubernetes 做为当前惟一被业界普遍承认和看好的 Docker 分布式系统解决方案。能够预见,在将来几年内,会有大量的新系统选择它,不论是运行在企业本地服务器上仍是被托管到公有云上。docker
使用 Kubernetes 又会收获哪些好处呢?vim
首先,使用 Kubernetes 就是在全面拥抱微服务架构。微服务架构的核心就是将一个巨大的单体应用分解为不少小的互相链接的微服务,一个微服务背后可能有多个实例副本在支撑,副本的数量可能会随着系统的负荷变化而进行调整,内嵌的负载均衡器在 k8s 平台中有多个实例副本在支撑,副本的数量可能会随着系统的负荷变化而进行调整,内嵌的负载均衡器 k8s 平台中发挥了重要的做用。微服务架构使得每一个服务均可以由专门的开发团队来开发,开发者能够自由选择开发技术,这对于大规模团队来讲颇有价值。另外,每一个微服务独立开发、升级、扩展,使得系统具有很高的稳定性和快速迭代进化能力。centos
其次,Kubernetes 系统架构具有了超强的横向扩容能力。对于互联网公司来讲,用户规模就等价于资产,谁拥有更多的用户,谁就能在竞争中胜出,所以超强的横向扩容能力是互联网业务系统的关键指标之一。不用修改代码,一个 Kubernetes 集群便可从只包含几个Node 的小集群平滑扩展到拥有成百上千 Noder 大规模集群,利用 Kubernetes 提供的工具,甚至能够在线完成集群的扩容。只要微服务设计的得好,结合硬件或者公有云资源的线性增长,系统就可以承受大量用户并发访问所带来的压力。设计模式
Kubernetes中的大部分概念如Node、Pod、Replication Controller、Server、Deploymeng、Job、DaemonSet 等均可以看做一种资源对象,几乎全部的资源对象均可以经过 Kubernetes提供的 kubectl 工具执行增、删、改、查等操做,并将其保存在 etcd 中持久化存储。从这个角度来看,Kubernets 实际上是一个高度自动化的资源控制系统,它经过跟踪对比 etcd 存储里保存的资源指望状态与当前环境中的实际资源状态的差别来实现自动控制和自动纠错的高级功能。
Kubernetes 里的 Master 指的是集群控制节点,每一个 Kubernetes 集群里须要有一个Master 节点来负责整个集群的管理的控制,基本上 Kubernetes 全部的控制命令进是发给Master,Master 负责具体的执行过程,后面全部执行的命令基本都是在 Master 节点上运行的。Master 节点一般会占据一个独立的 X86 服务器,一个主要的缘由是它过重要了,它是整个集群的大脑,若是它宕机或者不可用,那么全部的控制命令都将失效。
Master 节点上运行着如下一组关键进程:
Kube-apiserver:提供了 HTTP Rest 接口的关键服务进程,是 Kubernetes 里全部资源的增、删、改、查等操做的惟一入口,也是集群控制入口进程。 Kube-controller-manager:是 Kubernetes 里全部资源对象的自动化控制中心,能够理解为资源对象的管家。 Kube-scheduler:负责资源调度的进程,至关于公交公司的调度室。
其实 Master 节点上每每还启动了一个 etcd server 进程,由于 Kubernetes 里的全部资源对象的数据所有是保存在 etcd 中的。
除了 Master、Kubernetes 集群中的其余机器被称为 Node 节点,在较早的版本中也被称为 Minion。与 Master 同样,Node 节点能够是一台物理主机,也能够是一台虚拟机。Node节点才是 Kubernetes 集群中的工做负载节点,每一个 Node 都会被 Master 分配一些负载。当某个 Node 宕机时,其上的工做负载会被 Master 自动转移到其余节点上去。
每一个 Node 节点都运行着如下一组关键进程:
Kubelet:负责 Pod 对应的容器的建立、启停等任务,同时与 Master 节点密切协做,实现集群管理的基本功能。 Kube-proxy:实现 Kubernetes Service 的通讯与负载均衡机制的重要组件。
Pod:是kubernetes最重要也是最基本的概念。每一个Pod都会包含一个 “根容器”,还会包含一个或者多个紧密相连的业务容器。
Kubernetes为每一个Pod都分配了惟一的IP地址,称之为PodIP,一个Pod里的多个容器共享PodIP地址。要求底层网络支持集群内任意两个Pod之间的直接通讯,一般采用虚拟二层网络技术来实现(Flannel)。
以下是个人集群部署策略,1个master + 2个node(minion1.2以前的叫法)。个人存储集群etcd是单点集群,不推荐此作法。网络使用的是flannel虚拟二次网络。
Kubernetes具备完备的集群管理能力:
包括多层次的安全防御和准入机制 多租户应用支撑能力 透明的服务注册和服务发现机制 内建智能负载均衡器 强大的故障发现和自我修复能力 服务滚动升级和在线扩容能力 可扩展的资源自动调度机制 以及多粒度的资源管理能力
同时,kubernetes提供了完善的管理工具,这些工具涵盖了包括开发、部署测试、运维监控在内的各个环节。
在kubernetes中,service(服务)是分布式集群架构的核心,一个service对象拥有以下关键特征:
拥有一个惟一指定的名字(好比mysql-service)。 拥有一个虚拟IP(Cluster IP、service IP或VIP)和端口号。 可以提供某种远程服务能力。 被映射到了提供这种服务能力的一组容器应用上。
Kubernetes.io开发了一个交互式教程,经过WEB浏览器就能使用预先部署好的一个Kubernetes集群,快速体验kubernetes的功能和应用场景。
连接:https://kubernetes.io/docs/tutorials/kubernetes-basics/
K8s官方下载地址:https://github.com/kubernetes
主机名 操做系统 IP地址 master Centos 7.4-x86_64 192.168.2.102 node1 Centos 7.4-x86_64 192.168.2.108 node2 Centos 7.4-x86_64 192.168.2.228
systemctl disable firewalld systemctl stop firewalld
[root@localhost ~]# hostnamectl master //192.168.2.102 [root@localhost ~]# hostnamectl node1 //192.168.2.108 [root@localhost ~]# hostnamectl node2 //192.168.2.228
更改Hostname为 master、node一、node2,配置IP地址,配置3台测试机的/etc/hosts文件(在三台服务器上同步)
[root@master ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.2.102 master 192.168.2.108 node1 192.168.2.228 node2 [root@master ~]#
[root@master ~]# ntpdate ntp1.aliyun.com 13 Sep 14:48:02 ntpdate[1596]: adjust time server 120.25.115.20 offset -0.015854 sec [root@master ~]# hwclock 2018年09月13日 星期四 14时49分51秒 -0.646898 秒
[root@master ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@master yum.repos.d]# vim kubernetes.repo [kubernetes] name=kubernetes Repo baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg enabled=1
[root@master ~]# wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg [root@master ~]# rpm --import rpm-package-key.gpg [root@master yum.repos.d]# yum repolist
[root@master yum.repos.d]# scp CentOS-Base.repo docker-ce.repo kubernetes.repo node1:/etc/yum.repos.d/
[root@master ~]# yum -y install docker-ce kubelet kubeadm kubectl
[root@master ~]# vim /usr/lib/systemd/system/docker.service 手动添加一行 Environment="HTTPS_PROXY=http://www.ik8s.io:10080" Environment="NO_PROXY=127.0.0.0/8,172.0.0.0/16"
[root@master ~]# systemctl daemon-reload 启动docker [root@master ~]# systemctl start docker 设置开机启动 [root@master ~]# systemctl enable docker [root@master ~]# docker info 保证输出的都是1 [root@master ~]# cat /proc/sys/net/bridge/bridge-nf-call-ip6tables 1 [root@master ~]# cat /proc/sys/net/bridge/bridge-nf-call-iptables 1 [root@master ~]# rpm -ql kubelet /etc/kubernetes/manifests #清单目录 /etc/sysconfig/kubelet #配置文件 /etc/systemd/system/kubelet.service /usr/bin/kubelet #主程序 设置开机启动 [root@master ~]# systemctl enable kubelet
[root@master ~]# kubeadm init --kubernetes-version=v1.11.1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
报错信息,解决办法:
[root@master ~]# vim /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS="--fail-swap-on=false" [root@master ~]# kubeadm init --kubernetes-version=v1.11.1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
注意这一条命令须要保存好(添加集群使用)
kubeadm join 192.168.2.102:6443 --token ns4kps.j8cuqwf78emp5a5b --discovery-token-ca-cert-hash sha256:b71b7e52c318959bab3f05f02f6fe51d6396d8c54ea6849ec7556927d1c6c88a [root@master ~]# docker image ls
[root@master ~]# ss –ntl
[root@master ~]# mkdir -p $HOME/.kube [root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 检测组件运行是否正常 [root@master ~]# kubectl get cs
[root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady master 44m v1.11.3
[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml [root@master ~]# curl -sSL "https://github.com/coreos/flannel/blob/master/Documentation/kube-flannel.yml?raw=true" | kubectl create -f -
[root@master ~]# docker image ls
[root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready master 2h v1.11.3
[root@master ~]# kubectl get pods -n kube-system
[root@master ~]# scp /usr/lib/systemd/system/docker.service node1:/usr/lib/systemd/system/docker.service [root@master ~]# scp /etc/sysconfig/kubelet node1:/etc/sysconfig/ [root@master ~]# scp /usr/lib/systemd/system/docker.service node2:/usr/lib/systemd/system/docker.service [root@master ~]# scp /etc/sysconfig/kubelet node2:/etc/sysconfig/
[root@node1 ~]# wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
[root@node1 ~]# rpm --import rpm-package-key.gpg
[root@node1 ~]# yum -y install docker-ce kubelet kubeadm
[root@node1 ~]# systemctl start docker [root@node1 ~]# systemctl enable docker kubelet [root@node1 ~]# docker info
[root@node1 ~]# kubeadm join 192.168.2.102:6443 --token ns4kps.j8cuqwf78emp5a5b --discovery-token-ca-cert-hash sha256:b71b7e52c318959bab3f05f02f6fe51d6396d8c54ea6849ec7556927d1c6c88a --ignore-preflight-errors=Swap
[root@node1 ~]# docker image ls
[root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready master 3h v1.11.3 node1 Ready 7m v1.11.3 [root@master ~]# kubectl get pods -n kube-system -o wide
[root@node2 ~]# wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
[root@node2 ~]# rpm --import rpm-package-key.gpg
[root@node2 ~]# yum -y install docker-ce kubelet kubeadm
[root@node2 ~]# systemctl start docker [root@node2 ~]# systemctl enable docker kubelet [root@node2 ~]# docker info
[root@node2 ~]# kubeadm join 192.168.2.102:6443 --token ns4kps.j8cuqwf78emp5a5b --discovery-token-ca-cert-hash sha256:b71b7e52c318959bab3f05f02f6fe51d6396d8c54ea6849ec7556927d1c6c88a --ignore-preflight-errors=Swap
[root@master ~]# kubectl get nodes
[root@master ~]# kubectl get pods -n kube-system -o wide