封尘网

让学习成为一种习惯!

cockpit配置kubernetes管理单节点上的容器

昨天的实验中,能过单台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服务;

提醒:本文最后更新于 785 天前,文中所描述的信息可能已发生改变,请谨慎使用。