昨天的实验中,能过单台Centos7上部署docker和redhat的UI管理工具cockpit实现了网页创建容器的方法;图形的方法确实是简化了很多敲命令的过程,但是这样一个部署多个容器的话那就麻烦了,一个个点;所以这次结合kubernetes实现快速部署多个容器组成的集群;
ubernetes是google公司基于docker所做的一个分布式集群,主要的核心组件;
kube-apiserver
- 负责对外提供k8s API服务,它运行在master节点上。
- 任何对资源的增删改查都要交给APIServer处理后才能提交给etcd。
- APIServer总体上由两部分组成:HTTP/HTTPS服务和一些功能性插件。
这些功能性插件又分为两种:
一部分与底层IaaS平台(Cloud Provide)相关;
另一部分与资源管理控制(Admission Control)相关。
kube-scheduler:
- Scheduler的作用是根据特定的调度算法将pod调度到minion节点上,这一过程也被称为绑定。
- Scheduler调度器的输入是待调度的pod和可用的工作节点列表,输出则是一个已经绑定了pod的节点,
这个节点是通过调度算法在工作节点列表中选择的最优节点。
kubelet
- kubelet组件工作在k8s的minion上,负责管理和维护在这台主机上运行着的所有容器。
- kubelet与cAdvisor交互来抓取docker容器和主机的资源信息。
kubelet垃圾回收机制,包括容器垃圾回收和镜像垃圾回收。
kubelet工作节点状态同步。
kube-controller-manager:
- Controller Manager运行在集群的Master节点上,是基于pod API的一个独立服务,
- 它重点实现service Endpoint(服务端点)的动态更新。
- 管理着k8s集群中各种控制节点,包括之前提到的replication Controller和node Controller。
- 与APIServer相比,APIServer负责接受用户请求并创建对应的资源,而Controller Manager在系统中扮演的角色是在一旁旁默默的管控这些资源,确保他们永远保持在预期的状态。
- 它采用各种管理器定时的对pod、节点等资源进行预设的检查,然后判断出于预期的是否一致,若不一致,则通知APIServer采取行动,比如重启、迁移、删除等。
kube-proxy
- Proxy服务也运行在每个Minion上,提供两种功能,一是提供算法将客服端流量负载均衡到service对应的一组后端pod。
- 二是使用etcd的watch机制,实现服务发现功能,维护一张从service到Endpoint的映射关系,从而保证后端pod的ip变化不会对访问者的访问造成影响;当外部请求发生时,Proxy会根据Load Balancer将请求分发到后端正确的容器处理;
继续在昨天的机器上部署kubernetes
检查YUM仓库中的kubernetes的信息[版本]
[root@node5 ~]# yum info kubernetes|tail -13
Installed Packages
Name : kubernetes
Arch : x86_64
Version : 1.5.2
Release : 0.2.gitc55cf2b.el7
Size : 0.0
Repo : installed
From repo : extras
Summary : Container cluster management
URL : k8s.io/kubernetes
License : ASL 2.0
Description : Container cluster management
安装相应的服务
yum install etcd kubernetes -y
修改配置文件:/etc/kubernetes/apiserver
8 #KUBE_API_ADDRESS="--insecure-bind-address=127.0.0.1" 改成下面的 0.0.0.0
9 KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
24 #KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
改成下面的,去掉了ServiceAccount
25 KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
如果不去掉这个ServiceAccount 创建容器时会报错:
[root@node5 ~]# kubectl create -f pods/nginx_pod.yaml
Error from server (ServerTimeout): error when creating "pods/nginx_pod.yaml": No API token found for service account "default", retry after the token is automatically created and added to the service account
修改配置文件:/etc/etcd/etcd.conf
#ETCD_LISTEN_CLIENT_URLS="http://localhost:2379" 改成下面的 0.0.0.0
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
把服务添加到启动项,并启动服务:
for SERVICE in etcd kube-apiserver kube-controller-manager kube-scheduler kube-proxy kubelet; do
systemctl start $SERVICE
systemctl enable $SERVICE
done
启动完成后就可以点击https://10.0.10.135:9090/ 集群可以看到一些信息了;以后这个UI管理工具可以实现对Pod单元的删除,或者service服务的删除,和进入容器,查看日志、监控容器状态等操作;
准备前先检查你的本地仓库里是否有以下两个镜像:
[root@node5 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.access.redhat.com/rhel7/pod-infrastructure latest 34d3450d733b 9 weeks ago 205 MB
reg.docker.tb/harbor/nginx latest 05a60462f8ba 4 months ago 181.4 MB
一个是Nginx的镜像,一个是管理Pod的基础镜像,这个是Kubernetes默认使用的。如果没有它会自动下载,第一次下载可能会很慢,我这里老是被墙了,所以直接在私有仓库里下载有了;
接下来创建一个实例:nginx_pod.yaml
[root@node5 ~]# cat pods/nginx_pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: reg.docker.tb/harbor/nginx:latest
ports:
- "8000:80"
利用上面的配置文件创建容器:
[root@node5 ~]# kubectl create -f pods/nginx_pod.yaml
pod "nginx" created
[root@node5 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 6s
可以看到已经运行了一个pod服务,容器的名字为nginx; 但是这个pod只有内网IP,无法外部访问本机测试一下;
[root@node5 ~]# kubectl describe pod nginx|grep "^IP"
IP: 172.17.0.2
[root@node5 ~]# curl http://172.17.0.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
下一次,我们再实现通过宿主机IP地址加端口的形式访问到容器的Nginx服务;