k8s docker集群搭建

什么是kubernetes

  首先,他是一个全新的基于容器技术的分布式架构领先方案。Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg)。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。

  Kubernetes是一个完备的分布式系统支撑平台,具有完备的集群管理能力,多扩多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、內建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。同时Kubernetes提供完善的管理工具,涵盖了包括开发、部署测试、运维监控在内的各个环节。

Kubernetes中,Service是分布式集群架构的核心,一个Service对象拥有如下关键特征:

  • 拥有一个唯一指定的名字
  • 拥有一个虚拟IP(Cluster IP、Service IP、或VIP)和端口号
  • 能够体统某种远程服务能力
  • 被映射到了提供这种服务能力的一组容器应用上

容器提供了强大的隔离功能,所有有必要把为Service提供服务的这组进程放入容器中进行隔离。为此,Kubernetes设计了Pod对象,将每个服务进程包装到相对应的Pod中,使其成为Pod中运行的一个容器。为了建立Service与Pod间的关联管理,Kubernetes给每个Pod贴上一 个标签Label,比如运行MySQL的Pod贴上name=mysql标签,给运行PHP的Pod贴上name=php标签,然后给相应的 Service定义标签选择器Label Selector,这样就能巧妙的解决了Service于Pod的关联问题。

在集群管理方面,Kubernetes将集群中的机器划分为一个Master节点和一群工作节点Node,其中,在Master节点运行着集群管理相关的 一组进程kube-apiserver、kube-controller-manager和kube-scheduler,这些进程实现了整个集群的资源 管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理能力,并且都是全自动完成的。Node作为集群中的工作节点,运行真正的应用程序,在 Node上Kubernetes管理的最小运行单元是Pod。Node上运行着Kubernetes的kubelet、kube-proxy服务进程,这 些服务进程负责Pod的创建、启动、监控、重启、销毁以及实现软件模式的负载均衡器。

Kubernetes架构和组件:

kubernetes由以下组件组成:

  •  etcd: 高可用存储共享配置和服务发现,作为与minion 机器上的flannel配套使用,作用是使每台 minion上运行的docker拥有不同的ip段,最终目的是使不同minion上正在运行的docker containner都有一个与别的任意一个containner(别的minion上运行的docker containner)不一样的IP地址。
  •   flannel: 网络结构支持
  •   kube-apiserver: 不论通过kubectl还是使用remote api 直接控制,都要经过apiserver
  •   kube-controller-manager: 对 replication controller, endpoints controller, namespace controller, and serviceaccounts controller的循环控制,与kube-apiserver交互,保证这些controller工作
  •   kube-scheduler: Kubernetes scheduler的作用就是根据特定的调度算法将pod调度到指定的工作节点(minion)上,这一过程也叫绑定(bind)
  •   kubelet: Kubelet运行在Kubernetes Minion Node上. 它是container agent的逻辑继任者
  •   kube-proxy: kube-proxy是kubernetes 里运行在minion节点上的一个组件, 它起的作用是一个服务代理的角色

Kubernetes的核心概念

1.Master

  k8s集群的管理节点,负责管理集群,提供集群的资源数据访问入口。拥有Etcd存储服务(可选),运行Api Server进程,Controller Manager服务进程及Scheduler服务进程,关联工作节点Node。Kubernetes API server提供HTTP Rest接口的关键服务进程,是Kubernetes里所有资源的增、删、改、查等操作的唯一入口。也是集群控制的入口进程;Kubernetes Controller Manager是Kubernetes所有资源对象的自动化控制中心;Kubernetes Schedule是负责资源调度(Pod调度)的进程

2.Node

  Node是Kubernetes集群架构中运行Pod的服务节点(亦叫agent或minion)。Node是Kubernetes集群操 作的单元,用来承载被分配Pod的运行,是Pod运行的宿主机。关联Master管理节点,拥有名称和IP、系统资源信息。运行docker eninge服务,守护进程kunelet及负载均衡器kube-proxy.

  • 每个Node节点都运行着以下一组关键进程
  • kubelet:负责对Pod对于的容器的创建、启停等任务
  • kube-proxy:实现Kubernetes Service的通信与负载均衡机制的重要组件
  • Docker Engine(Docker):Docker引擎,负责本机容器的创建和管理工作

   Node节点可以在运行期间动态增加到Kubernetes集群中,默认情况下,kubelet会想master注册自己,这也是Kubernetes 推荐的Node管理方式,kubelet进程会定时向Master汇报自身情报,如操作系统、Docker版本、CPU和内存,以及有哪些Pod在运行等 等,这样Master可以获知每个Node节点的资源使用情况,冰实现高效均衡的资源调度策略。、

3.Pod

  运行于Node节点上,若干相关容器的组合。Pod内包含的容器运行在同一宿主机上,使用相同的网络命名空间、IP地址和端口,能够通过 localhost进行通。Pod是Kurbernetes进行创建、调度和管理的最小单位,它提供了比容器更高层次的抽象,使得部署和管理更加灵活。一 个Pod可以包含一个容器或者多个相关容器。

  Pod其实有两种类型:普通Pod和静态Pod,后者比较特殊,它并不存在Kubernetes的etcd存储中,而是存放在某个具体的 Node上的一个具体文件中,并且只在此Node上启动。普通Pod一旦被创建,就会被放入etcd存储中,随后会被Kubernetes Master调度到摸个具体的Node上进行绑定,随后该Pod被对应的Node上的kubelet进程实例化成一组相关的Docker容器冰启动起来, 在。在默认情况下,当Pod里的某个容器停止时,Kubernetes会自动检测到这个问起并且重启这个Pod(重启Pod里的所有容器),如果Pod所 在的Node宕机,则会将这个Node上的所有Pod重新调度到其他节点上。

4.Replication Controller

  Replication Controller用来管理Pod的副本,保证集群中存在指定数量的Pod副本。集群中副本的数量大于指定数量,则会停止指定数量之外的多余容器数量, 反之,则会启动少于指定数量个数的容器,保证数量不变。Replication Controller是实现弹性伸缩、动态扩容和滚动升级的核心。

5.Service

  Service定义了Pod的逻辑集合和访问该集合的策略,是真实服务的抽象。Service提供了一个统一的服务访问入口以及服务代理和发现机制,关联多个相同Label的Pod,用户不需要了解后台Pod是如何运行。

6.Label

 Kubernetes中的任意API对象都是通过Label进行标识,Label的实质是一系列的Key/Value键值对,其中key于 value由用户自己指定。Label可以附加在各种资源对象上,如Node、Pod、Service、RC等,一个资源对象可以定义任意数量的 Label,同一个Label也可以被添加到任意数量的资源对象上去。Label是Replication Controller和Service运行的基础,二者通过Label来进行关联Node上运行的Pod。

 

基于kubernetes构建Docker集群环境实战

环境:

redhat系统机器三台:

   172.25.81.1: 用来安装kubernetes master

   172.25.81.2 用作kubernetes minion (minion1)

   172.25.81.3: 用作kubbernetes minion (minion2)

<1>三台主机都安装以下软件

[root@server1 k8s]# yum install -y kubeadm-1.12.2-0.x86_64.rpm kubelet-1.12.2-0.x86_64.rpm kubectl-1.12.2-0.x86_64.rpm kubernetes-cni-0.6.0-0.x86_64.rpm cri-tools-1.12.0-0.x86_64.rpm

 

<2>三台主机都关闭SWAP分区

 1.暂时关闭SWAP,重启后恢复
    swapoff   -a
2. 永久关闭SWAP
   vim /etc/fstab

#/dev/mapper/rhel-swap   swap                    swap    defaults        0 0   注释掉SWAP分区项,即可

[root@server1 k8s]# swapoff -a

[root@server1 k8s]# vim /etc/fstab

#/dev/mapper/rhel-swap   swap                    swap    defaults        0 0

<3>设置kubelet开机自启(三台都操作)

<4>加载镜像(三台都操作)

[root@server1 k8s]# kubeadm config images list     ##列出需要的镜像

拉取需要用到的镜像(三台都操作)

[root@server1 k8s]# docker load -i kube-apiserver.tar

[root@server1 k8s]# docker load -i kube-controller-manager.tar

[root@server1 k8s]# docker load -i kube-scheduler.tar

[root@server1 k8s]# docker load -i kube-proxy.tar

[root@server1 k8s]# docker load -i pause.tar

[root@server1 k8s]# docker load -i etcd.tar

[root@server1 k8s]# docker load -i coredns.tar

[root@server1 k8s]# docker load -i flannel.tar

[root@server1 k8s]# vim kube-flannel.yml

[root@server1 k8s]# kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=172.25.81.1

重新打开一个server1的shell:

[root@server1 ~]# useradd k8s

[root@server1 ~]# vim /etc/sudoers

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
k8s     ALL=(ALL)       NOPASSWD: ALL

[root@server1 ~]# su - k8s

[k8s@server1 ~]$ mkdir -p $HOME/.kube

[k8s@server1 ~]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

[k8s@server1 ~]$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

[k8s@server1 ~]$ kubectl completion bash

[k8s@server1 ~]$ vim .bashrc

source <(kubectl completion bash)

[k8s@server1 ~]$ logout

[root@server1 k8s]# cp *.yml /home/k8s/

[root@server1 k8s]# su - k8s

[k8s@server1 ~]$ kubectl apply -f kube-flannel.yml

 

server2:

[root@server2 ~]# modprobe ip_vs_wrr
[root@server2 ~]# modprobe ip_vs_sh
[root@server2 ~]# kubeadm join 172.25.81.1:6443 --token ebv26o.i958zj0lvhg8bp3p --discovery-token-ca-cert-hash sha256:7b831a474f95d0688020a3b2b3a7ad681efe574e6215a2875811105c375c699f

server3:

[root@server3 k8s]# modprobe ip_vs_wrr
[root@server3 k8s]# modprobe ip_vs_sh
[root@server3 k8s]# kubeadm join 172.25.81.1:6443 --token ebv26o.i958zj0lvhg8bp3p --discovery-token-ca-cert-hash sha256:7b831a474f95d0688020a3b2b3a7ad681efe574e6215a2875811105c375c699f

 

[k8s@server1 ~]$ kubectl get nodes

[k8s@server1 ~]$ kubectl get pod --all-namespaces

配置真机路由功能开启使虚拟机可以上网:

[root@foundation81 kiosk]# iptables -t nat -I POSTROUTING -s 172.25.81.0/24 -j MASQUERADE

[k8s@server1 ~]$ ping www.baidu.com

[k8s@server1 ~]$ kubectl describe pod kube-scheduler-server1 -n kube-system

 

当有服务的状态处于CrashLoopBackOff时,可以尝试删掉该pod重新查看

[k8s@server1 ~]$ kubectl delete pod kube-controller-manager-server1 -n kube-system

直到所有服务的状态都是Running为止

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值