暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在Oracle Linux 7.x环境上搭建基于容器技术的K8s系统

凛冬未至 2018-01-05
967

正文共: 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文件来进行配置。

这部分内容,我会在稍后的Kubernetes案例中给大家进一步进行讲解和说明。


文章转载自凛冬未至,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论