Docker Manager for Kubernetes

一、Kubernetes介绍

Kubernets是Google开源的容器集群系统,是基于Docker构建一个容器的调度服务,提供资源调度,均衡容灾,服务注册,动态伸缩等功能套件;

Kubernets提供应用部署,维护,扩展机制等功能,利用Kubernetes能方便地管理跨主机运行容器化的应用,其主要功能如下:

  1. 使用Docker对应用程序包装(package),实例化(instantiate),运行(run);
  2. 将多台Docker主机抽象为一个资源,以集群的方式运行,管理跨机器的容器,包括任务调度,弹性伸缩,滚动升级等功能。
  3. 使用编排系统(YAML file)快速构建容器集群,提供负载均衡,解决容器直接关联及通信问题;
  4. 解决Docker跨主机容器之间的通信问题。
  5. 自动管理和修复容器,简单说,比如创建一个集群,里面有十个容器,如果某个容器异常关闭,那么,会尝试重启或重新分配容器,始终保证会有十个容器在运行,反而杀死多余的。

Kubernetes的我修复机制使得容器集群总是运行在用户期望的状态当前Kubernetes支持GCE、vShpere、CoreOS、OpenShift。

二、Kubernetes和Mesos的区别

1)Mesos是Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核;
  Kubernetes是Google开源的容器集群管理系统,实现基于Docker构建容器,利用Kubernetes能很方面管理多台Docker主机中的容器。

2)Mesos负责管理集群管资源(动态运行时,某机器有额外的资源,通知master来分配);
   Kubernetes抽象出新的容器组合模型并且对其编排管理(把容器自由组合提供服务这事儿搞定了,从而微服务,serverless等才真
   正的优雅地在开发和运维之间不吵架地被实现),而且kubernetes把以前运维的很多很难搞的东西都变得容易了。比如OpenStack,
   Kubernetes是把OpenStack里面的VM换成了容器,但是实现地更漂亮,更精简,更抽象和本质化,用起来也更容易。

3)Mesos相比Kubernetes发展的时间更久,总体情况更成熟,在生产环境有更多的使用经验,国外使用Mesos的公司有Twitter,Apple,
   Airbnb,Uber等,国内也有大批知名公司在使用Mesos,比如:小米、当当、豆瓣、去哪儿、携程、唯品会、知乎、新浪微博、爱奇艺、
   七牛、唯品会、bilibili、中国联通、中国移动、中国电信、华为、数人云等等。中大型公司会更倾向于使用Mesos,
   因为本身这些公司有一定的开发能力,Mesos提供了良好的API而且有非常多成熟的Framework跑在Mesos上,Mesos+Marathon+Zookeeper
   正常情况可以满足绝大部分需求,只需要写JSON或者DSL定义好service/application就好,只有一些特殊情况才确实需要写自己的Framework。

   而kubernetes(k8s)现在也正在慢慢成熟起来,它在生产环境显然还需要更多时间来验证。京东目前已经在kubernetes上跑15W+容器了。

   Mesos现在越来越适应并且被添加上了很多Kubernete的概念同时支持了很多Kubernetes的API。因此如果你需要它们的话,它将是对你的
   Kubernetes应用去获得更多能力的一个便捷方式(比如高可用的主干、更加高级的调度命令、去管控很大数目结点的能力),同时能够很好的
   适用于产品级工作环境中(毕竟Kubernetes任然还是一个初始版本)。

4)如果你是一个集群世界的新手,Kubernetes是一个很棒的起点。它是最快的、最简单的、最轻量级的方法去摆脱束缚,同时开启面向集群开发的实践。
   它提供了一个高水平的可移植方案,因为它是被一些不同的贡献者所支持的(    例如微软、IBM、Red Hat、CoreOs、MesoSphere、VMWare等等)。

   如果你已经有已经存在的工作任务(Hadoop、Spark、Kafka等等),Mesos给你提供了一个可以让你将不同工作任务相互交错的框架,然后混合进一个
   包含Kubernetes 应用的新的东西。

   如果你还没有用Kubernetes 系列框架完成项目的能力,Mesos给了你一个减压阀。

三、Kubernetes详解

Docker Manager for Kubernetes

kubernetes角色组成

  1. Pod

在kubernetes系统中,调度的最小颗粒不是单纯的容器,而是抽象一个Pod,Pod是一个可以被创建,销毁,调度,管理的最小的部署单元,比如一个或一组容器。Pod是kubernetes的最小操作单元,一个pod可以由一个或多个容器组成;同一个Pod只能运行在同一个主机上,共享相同的volumes、network、namespace;

  1. ReplicationController(RC)

RC用来管理Pod,一个RC可以由一个或多个pod组成,在RC被创建后,系统会根据定义好的副本数来创建Pod数量。在运行过程中,如果Pod数量小于定义的,就会重启停止的或重新分配Pod,反之则杀多余的。当然,也可以动态伸缩运行的Pods规模或熟悉。RC通过label关联对应的Pods,在滚动升级中,RC采用一个一个替换要更新的整个Pods中的Pod。

Replication Controller是Kubernetes系统中最有用的功能,实现复制多个Pod副本,往往一个应用需要多个Pod来支撑,并且可以保证其复制的
副本数,即使副本所调度分配的宿主机出现异常,通过Replication Controller可以保证在其它主宿机启用同等数量的Pod。Replication Controller
可以通过repcon模板来创建多个Pod副本,同样也可以直接复制已存在Pod,需要通过Label selector来关联

  1. Service

Service定义了一个Pod逻辑集合的抽象资源,Pod集合汇总的容器提供相同的功能。集合根据定义的Label和selector完成,当创建一个Service后,会分配一个Cluster ip,这个IP与定义的端口提供这个集合一个统一的访问接口,并且实现负载均衡

Services是Kubernetes最外围的单元,通过虚拟一个访问IP及服务端口,可以访问我们定义好的Pod资源,目前的版本是通过iptables的nat转发来实现,
转发的目标端口为Kube_proxy生成的随机端口,目前只提供GOOGLE云上的访问调度,如GCE。

  1. Label

Label是用于区分Pod、Service、RC的key/value键值对;仅使用在Pod、Service、Replication Controller之间的关系识别,但对这些单元本身进行操作时得使用name标签。Pod、Service、RC可以有多个label,但是每个label的key只能对应一个;主要是将Service的请求通过lable转发给后端提供服务的Pod集合;

kubernetes组件组成

  1. kubectl

客户端命令行工具,将接受的命令格式化后发送给kube-apiserver,作为整个系统的操作入口。

  1. kube-apisrver

作为整个系统的控制入口,以REST API服务提供接口

  1. kube-controller-manager

用来执行整改系统的后台任务,包括节点状态状况,pod个数,pods和service的关联等。

  1. kube-scheduler

负责节点资源管理,接受来自kube-apiserver创建Pods任务,并分配到某个节点

  1. etcd

负责节点间的服务发现和配置共享

  1. kube-proxy

运行在每个计算节点上,负责Pod网络代理。定时从etcd获取到service信息来做相应的策略

  1. kubelet

运行在每个计算节点上,作为agent,接受分配该节点的Pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver。

  1. DNS

一个可选DNS服务,用于为每个Service对象创建DNS记录,选择所有的Pod就可以通过DNS访问服务来。

Kubelet

Docker Manager for Kubernetes

根据上图可知Kubelet是Kubernetes集群中每个Minion和Master API Server的连接点,Kubelet运行在每个Minion上,是Master API Server和Minion之间的桥梁,接收Master API Server分配给它的commands和work,与持久性键值存储etcd,file,server和http进行交互,读取配置信息。Kubelet的主要工作是管理Pod和容器的生命周期,其包括Docker,Client,Root Directory,Pod Worders,Etcd Client,Cadvisor Client以及Health Checker组件,具体工作如下:

  1. 通过Worker给Pod异步运行特定的Action
  2. 设置容器的环境变量
  3. 给容器绑定Volume
  4. 给容器绑定Port。
  5. 根据指定的Pod运行一个单一容器
  6. 杀死容器。
  7. 给指定的Pod创建network容器
  8. 删除Pod的所有容器
  9. 同步Pod的状态
  10. 从Cadvisor获取container info、 pod info、root info、machine info。
  11. 检测Pod的容器健康状态信息
  12. 在容器中运行命令

四、Kubernetes部署

基本环境

主机名               IP           节点及功能                  系统版本
k8s-master      10.211.55.12    Master,etcd,registry   centos 7.2
node1           10.211.55.21    Node1                    centos 7.2
node2           10.211.55.22    Node1                    centos 7.2
设置三台机器的主机名

Master上执行:
[root@localhost ~]# hostnamectl --static set-hostname  k8s-master

Node1上执行:
[root@localhost ~]# hostnamectl --static set-hostname  node1
  
Node2上执行:
[root@localhost ~]# hostnamectl --static set-hostname  node2

在三台机器上都要设置hosts,均执行如下命令:
[root@k8s-master ~]# vim /etc/hosts
10.211.55.12    k8s-master
10.211.55.12    etcd
10.211.55.12    registry
10.211.55.21    node1
10.211.55.22    node2

关闭三台机器上的防火墙

[root@k8s-master ~]# systemctl disable firewalld.service
[root@k8s-master ~]# systemctl stop firewalld.service

部署Master

1)先安装docker环境
[root@k8s-master ~]# yum install -y docker

配置Docker配置文件,使其允许从registry中拉取镜像
[root@k8s-master ~]# vim /etc/sysconfig/docker      #添加下面一行内容
......

OPTIONS='--insecure-registry registry:5000'

[root@k8s-master ~]# systemctl start docker

2)安装etcd
k8s运行依赖etcd,需要先部署etcd,下面采用yum方式安装:
[root@k8s-master ~]# yum install etcd -y

yum安装的etcd默认配置文件在/etc/etcd/etcd.conf,编辑配置文件:
[root@k8s-master ~]# cp /etc/etcd/etcd.conf /etc/etcd/etcd.conf.bak
[root@k8s-master ~]# cat /etc/etcd/etcd.conf
#[member]
ETCD_NAME=master                                            #节点名称
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"                  #数据存放位置
#ETCD_WAL_DIR=""
#ETCD_SNAPSHOT_COUNT="10000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
#ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"             #监听客户端地址
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
#ETCD_CORS=""
#
#[cluster]
#ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380"
if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."
#ETCD_INITIAL_CLUSTER="default=http://localhost:2380"
#ETCD_INITIAL_CLUSTER_STATE="new"
#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://etcd:2379,http://etcd:4001"           #通知客户端地址
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_SRV=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""

启动etcd并验证状态
[root@k8s-master ~]# systemctl start etcd

[root@k8s-master ~]# ps -ef|grep etcd
etcd     28145     1  1 14:38 ?        00:00:00 /usr/bin/etcd --name=master --data-dir=/var/lib/etcd/default.etcd --listen-client-urls=http://0.0.0.0:2379,http://0.0.0.0:4001
root     28185 24819  0 14:38 pts/1    00:00:00 grep --color=auto etcd
[root@k8s-master ~]# lsof -i:2379
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
etcd    28145 etcd    6u  IPv6 1283822      0t0  TCP *:2379 (LISTEN)
etcd    28145 etcd   18u  IPv6 1284133      0t0  TCP localhost:53203->localhost:2379 (ESTABLISHED)
........

[root@k8s-master ~]# etcdctl set testdir/testkey0 0
0
[root@k8s-master ~]# etcdctl get testdir/testkey0
0
[root@k8s-master ~]# etcdctl -C http://etcd:4001 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://etcd:2379
cluster is healthy
[root@k8s-master ~]# etcdctl -C http://etcd:2379 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://etcd:2379
cluster is healthy

3)安装kubernets
[root@k8s-master ~]# yum install kubernetes

配置并启动kubernetes
在kubernetes master上需要运行以下组件:Kubernets API Server、Kubernets Controller Manager、Kubernets Scheduler

[root@k8s-master ~]# cp /etc/kubernetes/apiserver /etc/kubernetes/apiserver.bak
[root@k8s-master ~]# vim /etc/kubernetes/apiserver
###
kubernetes system config
#
The following values are used to configure the kube-apiserver
#

The address on the local server to listen to.

KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"

The port on the local server to listen on.

KUBE_API_PORT="--port=8080"

Port minions listen on
KUBELET_PORT="--kubelet-port=10250"

Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="--etcd-servers=http://etcd:2379"

Address range to use for services
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"

default admission control policies
#KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

Add your own!

KUBE_API_ARGS=""

[root@k8s-master ~]# cp /etc/kubernetes/config /etc/kubernetes/config.bak
[root@k8s-master ~]# vim /etc/kubernetes/config
###
kubernetes system config
#
The following values are used to configure various aspects of all
kubernetes services, including
#
  kube-apiserver.service
  kube-controller-manager.service
  kube-scheduler.service
  kubelet.service
  kube-proxy.service
logging to stderr means we get it in the systemd journal
KUBE_LOGTOSTDERR="--logtostderr=true"

journal message level, 0 is debug
KUBE_LOG_LEVEL="--v=0"

Should this cluster be allowed to run privileged docker containers
KUBE_ALLOW_PRIV="--allow-privileged=false"

How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://k8s-master:8080"

启动服务并设置开机自启动
[root@k8s-master ~]# systemctl enable kube-apiserver.service
[root@k8s-master ~]# systemctl start kube-apiserver.service
[root@k8s-master ~]# systemctl enable kube-controller-manager.service
[root@k8s-master ~]# systemctl start kube-controller-manager.service
[root@k8s-master ~]# systemctl enable kube-scheduler.service
[root@k8s-master ~]# systemctl start kube-scheduler.service

部署node

1)安装docker
[root@node1 ~]# yum install -y docker

配置Docker配置文件,使其允许从registry中拉取镜像
[root@node1 ~]# vim /etc/sysconfig/docker      #添加下面一行内容
......

OPTIONS='--insecure-registry registry:5000'

[root@node1 ~]# systemctl start docker

2)安装kubernets
[root@node1 ~]# yum install kubernetes

配置并启动kubernetes
在kubernetes master上需要运行以下组件:Kubelet、Kubernets Proxy
[root@node1 ~]# cp /etc/kubernetes/config /etc/kubernetes/config.bak
[root@node1 ~]# vim /etc/kubernetes/config
###
kubernetes system config
#
The following values are used to configure various aspects of all
kubernetes services, including
#
  kube-apiserver.service
  kube-controller-manager.service
  kube-scheduler.service
  kubelet.service
  kube-proxy.service
logging to stderr means we get it in the systemd journal
KUBE_LOGTOSTDERR="--logtostderr=true"

journal message level, 0 is debug
KUBE_LOG_LEVEL="--v=0"

Should this cluster be allowed to run privileged docker containers
KUBE_ALLOW_PRIV="--allow-privileged=false"

How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://k8s-master:8080"

[root@node1 ~]# cp /etc/kubernetes/kubelet /etc/kubernetes/kubelet.bak
[root@node1 ~]# vim /etc/kubernetes/kubelet
###
kubernetes kubelet (minion) config

The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=0.0.0.0"

The port for the info server to serve on
KUBELET_PORT="--port=10250"

You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=node1"                  #特别注意这个,在另一个node2节点上,要改为k8s-node-2

location of the api-server
KUBELET_API_SERVER="--api-servers=http://k8s-master:8080"

pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

Add your own!

KUBELET_ARGS=""

启动服务并设置开机自启动
[root@node1 ~]# systemctl enable kubelet.service
[root@node1 ~]# systemctl start kubelet.service
[root@node1 ~]# systemctl enable kube-proxy.service
[root@node1 ~]# systemctl start kube-proxy.service

在master上查看集群中节点及节点状态
[root@k8s-master ~]# kubectl -s http://k8s-master:8080 get node
NAME         STATUS    AGE
k8s-node-1   Ready     10m
k8s-node-2   Ready     1m
[root@k8s-master ~]# kubectl get nodes
NAME         STATUS    AGE
k8s-node-1   Ready     10m
k8s-node-2   Ready     1m

kubernetes常用命令

`
查看node主机
[root@k8s-master ~]# kubectl get node //有的环境是用monion,那么查看命令就是”kubectl get minions”

查看pods清单
[root@k8s-master ~]# kubectl get pods

查看service清单
[root@k8s-master ~]# kubectl get services //或者使用命令”kubectl get services -o json”

查看replicationControllers清单
[root@k8s-master ~]# kubectl get replicationControllers

删除所有pods(同理将下面命令中的pods换成services或replicationControllers,就是删除所有的services或replicationContronllers)
[root@k8s-master ~]# for i in kubectl get pod|tail -n +2|awk '{print $1}'; do kubectl delete pod $i; done

Original: https://www.cnblogs.com/baishuchao/p/9420290.html
Author: baishuchao
Title: Docker Manager for Kubernetes

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611350/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Linux—进程管理

    Linux 进程管理 1、进程管理介绍 1.1 什么是进程? 进程(Process)是计算机中的 程序关于某 数据集合上的一次 运行活动,是系统进行 资源分配和调度的 基本单位,是…

    Linux 2023年6月7日
    089
  • [LINUX] 在 Win10 上搭建好用的终端开发环境:windows terminal + git bash + zsh + oh-my-zsh

    1、安装 git for windows 2、安装终端 2.1 Windows Terminal 2.1.1 安装 Windows Terminal 2.1.2 设置 Window…

    Linux 2023年6月8日
    0104
  • shell多线程运行程序

    #!/bin/bash function my_cmd(){ sleep 1 } date tmp_fifofile="/tmp/$$.fifo" mkfifo…

    Linux 2023年6月6日
    0113
  • powershell 运行带路径的exe

    &"C:\Program Files\Python38\python.exe" demo_view.py 起因是nodejs16安装时,顺带装了pyth…

    Linux 2023年5月28日
    089
  • 更改网卡名称

    CentOS7使用了”一致性网络命名方法” 更改配置文件内容 关闭”一致性网络设备命名法” 更新GRUB、内核配置 grub2-mk…

    Linux 2023年6月6日
    093
  • Linux 目录挂载服务

    Linux 服务器挂载文件目录通常有三种形式,手动挂载、自动挂载、Autofs 自动挂载,下面对这三个挂载做一下介绍,接受一下这三个区别以及使用场景: 准备服务器和客户端: ser…

    Linux 2023年6月6日
    095
  • PMP 考试常见工具与技术点总结

    转载请注明出处: 网络图:项目进度活动之间的逻辑关系,用来推算关键路径,最大浮动时间等; 横道图(甘特图):以图示的方式,通过活动列表和时间刻度,来展示项目获得那个顺序和持续时间 …

    Linux 2023年6月14日
    091
  • Redis

    一、Redis的介绍 什么是Redis Redis是一个开源的使用ANSI C语言编写Key-Value内存数据库 读写性能强,支持多种数据类型 把数据存储在内存中的高速缓存 Re…

    Linux 2023年6月14日
    084
  • Linux文本处理相关命令

    一、文本处理命令 Linux sort命令用于将文本文件内容加以排序。 sort 可针对文本文件的内容,以行为单位来排序。 语法格式如下: sort [参数]…[文件] 相关参…

    Linux 2023年5月27日
    096
  • [云原生]Kubernetes-Service详解(第7章)

    * – 一、Service介绍 – 二、Service类型 – 三、Service使用 + 3.1 实验环境准备 + 3.2 ClusterIP…

    Linux 2023年6月13日
    0109
  • 机器学习入门笔记02–流行学习与图嵌入理论基础

    核化线性降维 线性降维方法假设从高维空间到低维空间的函数映射是线性的,然而,在不少现实任务中,可能需要非线性映射才能找到恰当的低维嵌入。 流行学习 “流形”…

    Linux 2023年6月6日
    084
  • 代码中的软件工程复习

    编写高质量代码的基本方法 通过控制结构简化代码 通过数据结构简化代码 一定要有错误处理 注意性能优先的代价 拒绝修修补补不断重构代码 性能优先策略带来的隐藏代价 软件工程师的人力成…

    Linux 2023年6月8日
    095
  • DHCP服务

    一、dhcp介绍 dhcp 应用层协议 动态主机配置协议 作用: 为主机动态分配tcp/ip参数(ip地址、掩码、网关、DNS服务器地址) Linux实现dhcp服务 软件: dh…

    Linux 2023年6月7日
    085
  • centos安装torch==1.4.0与相关细节

    对于某些直接安装torch==1.4.0报错的情况(没错,就是我遇到了) 在网上查找了,大概的解决方法是先安装一个低版本的torch和torchvision, torchvisio…

    Linux 2023年6月7日
    098
  • 运维自动化之ansible,轻松实现企业级自动化运维

    Original: https://www.cnblogs.com/magecxy/p/15561194.htmlAuthor: 程序员面试吧Title: 运维自动化之ansibl…

    Linux 2023年5月27日
    088
  • Linux解压命令

    .tar解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)———————————————….

    Linux 2023年6月13日
    076
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球