
正文共: 6007字 8图
预计阅读时间: 16分钟
Kubernetes是Google开源的容器集群管理系统,其提供应用部署、维护、 扩展机制等功能,利用Kubernetes能方便地管理跨机器运行容器化的应用,其主要功能如下:
1) 使用Docker对应用程序包装(package)、实例化(instantiate)、运行(run)。
2) 以集群的方式运行、管理跨机器的容器。
3) 解决Docker跨机器容器之间的通讯问题。
4) Kubernetes的自我修复机制使得容器集群总是运行在用户期望的状态。
当前Kubernetes支持GCE、vShpere、CoreOS、OpenShift、Azure等平台,除此之外,也可以直接运行在物理机上。
实际上,使用Kubernetes只需一个部署文件,使用一条命令就可以部署多层容器(前端,后台等)的完整集群:
$ kubectl create -f single-config-file.yaml
Kubernetes主要概念
集群
集群是一组节点,这些节点可以是物理服务器或者虚拟机,之上安装了Kubernetes平台。下图展示这样的集群。注意该图为了强调核心概念有所简化。这里可以看到一个典型的Kubernetes架构图。

上图可以看到如下组件,使用特别的图标表示Service和Label:
Pod
Container(容器)
Label()(标签)
Replication Controller(复制控制器)
Service()(服务)
Node(节点)
Kubernetes Master(Kubernetes主节点)
Pod
Pod(上图绿色方框)安排在节点上,包含一组容器和卷。同一个Pod里的容器共享同一个网络命名空间,可以使用localhost互相通信。Pod是短暂的,不是持续性实体。你可能会有这些问题:
如果Pod是短暂的,那么我怎么才能持久化容器数据使其能够跨重启而存在呢?是的,Kubernetes支持卷的概念,因此可以使用持久化的卷类型。是否手动创建Pod,如果想要创建同一个容器的多份拷贝,需要一个个分别创建出来么?可以手动创建单个Pod,但是也可以使用Replication Controller使用Pod模板创建出多份拷贝,下文会详细介绍。如果Pod是短暂的,那么重启时IP地址可能会改变,那么怎么才能从前端容器正确可靠地指向后台容器呢?这时可以使用Service,下文会详细介绍。
Lable
正如图所示,一些Pod有Label()。一个Label是attach到Pod的一对键/值对,用来传递用户定义的属性。比如,你可能创建了一个"tier"和“app”标签,通过Label(tier=frontend, app=myapp)来标记前端Pod容器,使用Label(tier=backend, app=myapp)标记后台Pod。然后可以使用Selectors选择带有特定Label的Pod,并且将Service或者Replication Controller应用到上面。
ReplicationController
是否手动创建Pod,如果想要创建同一个容器的多份拷贝,需要一个个分别创建出来么,能否将Pods划到逻辑组里?Replication Controller确保任意时间都有指定数量的Pod“副本”在运行。如果为某个Pod创建了Replication Controller并且指定3个副本,它会创建3个Pod,并且持续监控它们。如果某个Pod不响应,那么Replication Controller会替换它。

如果之前不响应的Pod恢复了,现在就有4个Pod了,那么ReplicationController会将其中一个终止保持总数为3。如果在运行中将副本总数改为5,Replication Controller会立刻启动2个新Pod,保证总数为5。还可以按照这样的方式缩小Pod,这个特性在执行滚动升级时很有用。 当创建ReplicationController时,需要指定两个东西:1)、Pod模板:用来创建Pod副本的模板
2)、Label:ReplicationController需要监控的Pod的标签。
现在已经创建了Pod的一些副本,那么在这些副本上如何均衡负载呢?我们需要的是Service。
Service
如果Pods是短暂的,那么重启时IP地址可能会改变,怎么才能从前端容器正确可靠地指向后台容器呢?Service是定义一系列Pod以及访问这些Pod的策略的一层抽象。Service通过Label找到Pod组。因为Service是抽象的,所以在图表里通常看不到它们的存在,这也就让这一概念更难以理解。 现在,假定有2个后台Pod,并且定义后台Service的名称为‘backend-service’,lable选择器为(tier=backend, app=myapp)。backend-service 的Service会完成如下两件重要的事情: 会为Service创建一个本地集群的DNS入口,因此前端Pod只需要DNS查找主机名为‘backend-service’,就能够解析出前端应用程序可用的IP地址。
现在前端已经得到了后台服务的IP地址,但是它应该访问2个后台Pod的哪一个呢?Service在这2个后台Pod之间提供透明的负载均衡,会将请求分发给其中的任意一个。通过每个Node上运行的代理(kube-proxy)完成。

有一个特别类型的KubernetesService,称为'LoadBalancer',作为外部负载均衡器使用,在一定数量的Pod之间均衡流量。比如,对于负载均衡Web流量很有用。
Node
l 节点(上图橘色方框)是物理或者虚拟机器,作为Kubernetes worker,通常称为Minion。每个节点都运行如下Kubernetes关键组件:
Kubelet:是主节点代理。
l Kube-proxy:Service使用其将链接路由到Pod,如上文所述。
l Docker或Rocket:Kubernetes使用的容器技术来创建容器。
KubernetesMaster
集群拥有一个KubernetesMaster(紫色方框)。Kubernetes Master提供集群的独特视角,并且拥有一系列组件,比如Kubernetes API Server。API Server提供可以用来和集群交互的REST端点。master节点包括用来创建和复制Pod的Replication Controller。
简单的介绍完Kubernetes的产品架构还有基本概念,下面我将给大家演示如何在Oracle Linux 7.x上安装kubernetes。
操作系统:Red Hat Enterprise Linux Server release 7.2 (Maipo)
前提准备:在所有Kubernetes集群的节点上,Oracle Linux 7.x上安装Kubernetes需要完成如下的几个准备工作,注意Linux操作系统必须要Update4之后的版本才可以。
1、为了正确安装kubernetes,需要正确配置YUM,配置方法如下:
编辑/etc/yum.repos.d/public-yum-ol7.repo这个文件,重点是标红的地方
[ol7_addons]
name=Oracle Linux $releasever Add ons($basearch)
baseurl=http://yum.oracle.com/repo/OracleLinux/OL7/addons/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1
[ol7_preview]
name=Oracle Linux $releasever Preview($basearch)
baseurl=http://yum.oracle.com/repo/OracleLinux/OL7/preview/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1
如果没有repo文件,可以根据自己操作系统的版本从这个网址下载: http://yum.oracle.com/public-yum-ol7.repo
2、防火墙和iptables配置
在下载安装Kubernetes的时候,脚本会检查iptables的配置,需要执行如下的命令进行配置:
iptables -P FORWARD ACCEPT
如果服务器启动了防火墙,需要配置如下的策略:
Node节点:
firewall-cmd --add-masquerade--permanent
# firewall-cmd--add-port=10250/tcp --permanent
# firewall-cmd--add-port=8472/udp --permanent
Master节点
firewall-cmd --add-port=6443/tcp--permanent
配置后,重启防火墙。
# systemctlrestart firewalld
3、网络配置
Node节点上的Pod需要彼此能进行沟通,需要在操作系统Enable这个 br_netfilter模块,检查这个模块是否生效,用这个命令进行检查。
lsmod|grep br_netfilter
通过以下的命令设置br_netfilter生效。
# modprobebr_netfilter
# echo"br_netfilter" > etc/modules-load.d/br_netfilter.conf
4、设置Linux的SELinux 到强制模式:
5、编辑/etc/selinux/config文件,设置如下的内容:
SELINUX=Permissive
6、Kubernetes的安装和运行需要Docker的支持,所以需要先安装好Docker,
在所有的Kubernetes节点上都要安装好Docker。
# yuminstall docker-engine
# systemctlenable docker
# systemctlstart docker
7、登录Oracle的Docker网站: https://container-registry.oracle.com , 使用自己注册的账号,登录系统后,接受Oracle的Oracle Standard Terms and Restrictions协议。
8、需要在Oracle Docker 资源库网站注册一个账号,并且保证所有Kubernetes节点在安装的时候都能通过如下命令登录,并从Oracle的Docker Hub上下载镜像。
docker login container-registry-ash.oracle.com
登录后设置正确的环境变量:
# exportKUBE_REPO_PREFIX=container-registry-ash.oracle.com/kubernetes
# echo'export KUBE_REPO_PREFIX=container-registry-ash.oracle.com/kubernetes'> ~/.bashrc
安装Master节点
yum install kubeadm
kubeadm-setup.sh up
安装过程中会生成一些提示,这些提示包括,安装完后必须执行的命令,以及如何把其他的Node节点加入Kubernetes集群的命令。
安装完后需要执行如下的命令:
$ sudocp etc/kubernetes/admin.conf $HOME/
$ sudochown $(id -u):$(id -g) $HOME/admin.conf
echo 'exportKUBECONFIG=$HOME/admin.conf' >> $HOME/.bashrc
检查K8s的集群是否安装成功,执行如下的命令:
kubectl get pods -n kube-system
输出如下:

OK,Master节点安装完毕。
Node节点的安装
在安装Master节点的最后,会有把Node节点加入集群的命令,直接拷贝过来执行就可以了,如:
yum install kubeadm
kubeadm-setup.sh join --token d6f2cf.8268eaf87c8f5e3b192.0.2.10:6443 --discovery-token-ca-cert-hash \
sha256:9d83c7d2e3c15e763a7978cacdff0fc9bbae9544e62dc88242130507ab7a02ab
这个命令是子在Master节点自动生成的。
在Master节点执行命令,检查集群节点情况:
kubectl get nodes
伸个懒腰,Kubernetes的集群安装好了,我们接下来看看Kubernetes的基本命令和使用。
Kubernetes安装完毕了,现在我们来做一些简单的测试,看看我们的集群能否正常的工作。
1、在Pod上运行一个应用
kubectl run hello-world --image=nginxdemos/hello--port=80
kubectl get pods

2、扩展部署应用的数量
kubectl scale deployment hello-world --replicas=3
#kubectl get pods
NAME READY STATUS RESTARTS AGE hello-world-178523330-0cjk4 1/1 Running 0 18s hello-world-178523330-61d6n 1/1 Running 0 26m hello-world-178523330-dzmtd 1/1 Running 0 18s
我们看到我们的应用扩展成了多个。
3、为了让外部的用户可以访问到这个应用,我们需要在Kubernetes上为应用建立Service,并且暴露外部访问的端口。
kubectl expose deployment hello-world --type=NodePort --name=hello-service
查看系统给我们暴露的端口:

我们清晰地看到现在Pod上应用的80端口被映射到了本机的30513端口,我们访问本机的30513端口就可以看到我们的Web应用了。

4、删除我们建立的部署和service,资源被释放
kubectl delete services hello-service
kubectl delete deployment hello-world

通过上面简单的一些测试,我们的Kubernetes的集群已经可以正常使用了,当然以上的测试还是非常简单的,更复杂的配置可以通过YAML文件来进行配置。




