一. Kubernetes 系统简介

首先,他是一个全新的基于容器技术的分布式架构领先方案。Kubernetes(k8s)是Google开源的容器集群管理系统(内部:Borg)。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
  Kubernetes是一个完备的分布式系统支撑平台,具有完备的集群管理能力,多扩多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、內建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。同时Kubernetes提供完善的管理工具,涵盖了包括开发、部署测试、运维监控在内的各个环节。
Kubernetes中,Service是分布式集群架构的核心,一个Service对象拥有如下关键特征:

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

Service的服务进程目前都是基于Socket通信方式对外提供服务,比如Redis、Memcache、MySQL、Web Server,或者是实现了某个具体业务的一个特定的TCP Server进程,虽然一个Service通常由多个相关的服务进程来提供服务,每个服务进程都有一个独立的Endpoint(IP+Port)访问点,但Kubernetes能够让我们通过服务连接到指定的Service上。有了Kubernetes内奸的透明负载均衡和故障恢复机制,不管后端有多少服务进程,也不管某个服务进程是否会由于发生故障而重新部署到其他机器,都不会影响我们队服务的正常调用,更重要的是这个Service本身一旦创建就不会发生变化,意味着在Kubernetes集群中,我们不用为了服务的IP地址的变化问题而头疼了。
  容器提供了强大的隔离功能,所有有必要把为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集群中,它解决了传统IT系统中服务扩容和升级的两大难题。你只需为需要扩容的Service关联的Pod创建一个Replication Controller简称(RC),则该Service的扩容及后续的升级等问题将迎刃而解。在一个RC定义文件中包括以下3个关键信息。
目标Pod的定义
目标Pod需要运行的副本数量(Replicas)
要监控的目标Pod标签(Label)

在创建好RC后,Kubernetes会通过RC中定义的的Label筛选出对应Pod实例并实时监控其状态和数量,如果实例数量少于定义的副本数量,则会根据RC中定义的Pod模板来创建一个新的Pod,然后将新Pod调度到合适的Node上启动运行,知道Pod实例的数量达到预定目标,这个过程完全是自动化。

1. Kubernetes优势:

    - 容器编排
    - 轻量级
    - 开源
    - 弹性伸缩
    - 负载均衡

2. Kubernetes 特性

Endpoint Slices
Kubernetes 集群中网络端点的可扩展跟踪。
服务发现与负载均衡
无需修改您的应用程序即可使用陌生的服务发现机制。Kubernetes 为容器提供了自己的 IP 地址和一个 DNS 名称,并且可以在它们之间实现负载平衡。
自我修复
重新启动失败的容器,在节点死亡时替换并重新调度容器,杀死不响应用户定义的健康检查的容器,并且在它们准备好服务之前不会它们公布给客户端。
自动装箱
根据资源需求和其他约束自动放置容器,同时不会牺牲可用性,将任务关键工作负载和尽力服务工作负载进行混合放置,以提高资源利用率并节省更多资源。
IPv4/IPv6 双协议栈
Allocation of IPv4 and IPv6 addresses to Pods and Services
水平伸缩
使用一个简单的命令、一个UI或基于CPU使用情况自动对应用程序进行伸缩。

3. Kubernetes的Master和Node节点

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节点的资源使用情况,冰实现高效均衡的资源调度策略。

4. Kubernetes Node运行节点,运行管理业务容器,包含如下组件:

  1.Kubelet
    负责管控容器,Kubelet会从Kubernetes API Server接收Pod的创建请求,启动和停止容器,监控容器运行状态并汇报给Kubernetes API Server。
  2.Kubernetes Proxy
    负责为Pod创建代理服务,Kubernetes Proxy会从Kubernetes API Server获取所有的Service信息,并根据Service的信息创建代理服务,实现Service到Pod的请求路由和转发,从而实现Kubernetes层级的虚拟转发网络。
  3.Docker
    Node上需要运行容器服务

k8s最基本的硬件要求

CPU: 双核
Mem: 2G
3台dockerhost
时间必须同步

二. 实验环境

主机名 IP地址 服务
master 192.168.1.21 docker
node01 192.168.1.22 docker
node02 192.168.1.23 docker

环境准备

分别将3台虚拟机命名,设置好对应IP,并将其写入域名解析/etc/hosts中,关闭防火墙,iptables,禁用selinux。还有要做到,时间必须一致。全部禁用swap

1.给三台docker命名

k8.1

[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# su -

k8.2

[root@localhost ~]# hostnamectl set-hostname node01
[root@localhost ~]# su -

k8.3

[root@localhost ~]# hostnamectl set-hostname node02
[root@localhost ~]# su -

验证docker是否能使用及版本是否一样

[root@master ~]# docker -v

K8s(Kubernetes)的安装部署

2.关闭防火墙及禁用selinux

[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
 [root@master ~]# vim /etc/selinux/config

K8s(Kubernetes)的安装部署_第1张图片

3. 禁用swap(三台)

[root@master ~]# swapoff -a
//临时禁用swap
[root@master ~]# free -h
[root@master ~]# vim /etc/fstab 

K8s(Kubernetes)的安装部署_第2张图片

4.添加域名解析(三台)

[root@master ~]# echo 192.168.1.21 master >> /etc/hosts
[root@master ~]# echo 192.168.1.22 node01 >> /etc/hosts
[root@master ~]# echo 192.168.1.23 node02 >> /etc/hosts

5.做免密登陆(三台)

[root@master ~]# ssh-keygen -t rsa
//生成密钥

复制密钥到其他主机

   54  ssh-copy-id node01
   55  ssh-copy-id node02

把域名解析复制到其他主机

   63  scp /etc/hosts node01:/etc
   64  scp /etc/hosts node02:/etc

6. 打开路由转发和iptables桥接功能(三台)

[root@master ~]# vim /etc/sysctl.d/k8s.conf
//开启iptables桥接功能
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

[root@master ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf 
//**打开路由转发

[root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf 
[root@master ~]# sysctl -p 
//刷新一下

如果以上命令执行失败可能是缺少模块,可执行以下命令

[root@master ~]# modprobe br_netfiler

把路由转发和iptables桥接复制到其他主机

[root@master ~]# scp /etc/sysctl.d/k8s.conf  node01:/etc/sysctl.d/
[root@master ~]# scp /etc/sysctl.d/k8s.conf  node02:/etc/sysctl.d/
[root@master ~]# scp /etc/sysctl.conf  node02:/etc/
[root@master ~]# scp /etc/sysctl.conf  node01:/etc/

记得node01和node02也要执行以下命令

[root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf 
[root@master ~]# sysctl -p 

三. master节点安装部署k8s

(1)指定yum安装kubernetes的yum源(三台)

cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

下载完成之后,查看一下仓库是否可用

[root@master ~]# yum repolist 

K8s(Kubernetes)的安装部署_第3张图片

创建本地缓存(三台)

[root@master ~]# yum makecache fast

(2)各节点安装所需安装包

1.master下载

[root@master ~]# yum -y install kubeadm-1.15.0-0 kubelet-1.15.0-0 kubectl-1.15.0-0

2.node01和node02下载

[root@node01 ~]# yum -y install kubeadm-1.15.0-0 kubelet-1.15.0-0

3.三台主机把 kubelet加入开机自启

[root@master ~]# systemctl enable kubelet

(3)master导入,之前准备好的镜像

从docker镜像站下载镜像

docker pull mirrorgooglecontainers/kube-apiserver:v1.14.1
docker pull mirrorgooglecontainers/kube-controller-manager:v1.14.1
docker pull mirrorgooglecontainers/kube-scheduler:v1.14.1
docker pull mirrorgooglecontainers/kube-proxy:v1.14.1
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd:3.3.10
docker pull coredns/coredns:1.3.1

本地上传镜像

[root@master ~]# mkdir images
[root@master ~]# cd images/
[root@master images]# ls

K8s(Kubernetes)的安装部署_第4张图片

1.创建一个导入镜像的脚本

[root@master images]# cat > image.sh < #!/bin/bash
> for i in /root/images/*
> do
> docker load < $i 
> done
> EOF
[root@master images]# chmod +x image.sh 

2.导入镜像

[root@master images]# sh image.sh 

3.初始化Kubernetes集群

[root@master ~]#  kubeadm init --kubernetes-version=v1.15.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap

如果以上的命令报错,找出问题后先重置一下(下面的命令),然后再执行以上命令

!!!谨慎使用!!!
[root@master ~]# kubeadm reset
//重置kubeadm

K8s(Kubernetes)的安装部署_第5张图片

[root@master images]# kubectl get node
//查看当前节点信息

K8s(Kubernetes)的安装部署_第6张图片

可以看出master的状态是未就绪(NotReady),之所以是这种状态是因为还缺少一个附件flannel,没有网络各Pod是无法通信的

4.也可以通过检查组件的健康状态

[root@master images]# kubectl get cs

K8s(Kubernetes)的安装部署_第7张图片

5.添加网络组件(flannel)

组件flannel可以通过https://github.com/coreos/flannel中获取

[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

以上只是方式之一,在网络状况良好的情况下建议使用上述方法(调用远端文件执行一下),若网速较差,建议使用以下方法:

[root@master images]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#将github官网指定的.yml配置文件下载到本地
[root@master images]# ls | grep flannel.yml   #确定下载到了当前目录
kube-flannel.yml
[root@master images]# kubectl apply -f kube-flannel.yml  #指定下载的.yml文件执行相应命令

上述方法,二选一进行配置即可。

看到很多东西被创建是还不够的,还需要查看flannel是否处于正常启动并运行的状态,才算正在的部署完成

[root@master images]# kubectl get pods --all-namespaces
//查看所有的名称空间的pod(可以看到flannel网络运行正常)

K8s(Kubernetes)的安装部署_第8张图片

[root@master images]# kubectl get pod -n kube-system
//查看名称空间为kube-system的pod

K8s(Kubernetes)的安装部署_第9张图片

查看当前节点信息

kubectl get node
//查看当前节点信息(已经准备好了)

K8s(Kubernetes)的安装部署

四. node两台节点,导入镜像并加入群集

(1)导入镜像

上传所需镜像包,也可以使用docker pull下载

K8s(Kubernetes)的安装部署

[root@node01 images]# docker load < kube-proxy-1-15.tar && docker load -i myflannel-11-0.tar  && docker load -i pause-3-1.tar
[root@node01 images]# docker images
//查看本地镜像

K8s(Kubernetes)的安装部署_第10张图片

(2)node01和node02加入群集

这时使用的命令是初始化群集之后生成的令牌(只有24小时的时效)

K8s(Kubernetes)的安装部署_第11张图片

[root@node01 ~]# kubeadm join 192.168.1.21:6443 --token z0vknh.s6ib4eu4f8bre2nu     --discovery-token-ca-cert-hash sha256:8da72cc83f45d1247f42ce888658129b43726fe2af4ffc0c4e79faedb4050359

(3)加入群集之后查看一下

[root@master images]# kubectl get node

K8s(Kubernetes)的安装部署_第12张图片

五. 各节点优化一下

(1)设置table键的默认间距;

[root@master ~]# vim .vimrc
set tabstop=2
[root@master ~]# source .vimrc 

(2)设置kubectl命令自动补全

[root@master ~]# yum  -y install bash-completion
[root@master ~]#  source /usr/share/bash-completion/bash_completion 
[root@master ~]# source <(kubectl completion bash)
[root@master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc

(3)确认k8s群集没有问题,并设置为开机自启

master主机操作如下:

[root@master ~]# kubectl get pod -n kube-system   
#查看pod资源,类似于docker中的容器,确保返回的信息都是running
#“-n kube-system”:是k8s的名称空间

K8s(Kubernetes)的安装部署_第13张图片

master和node节点上都需要进行以下操作,以便设置为开机自启:

[root@master ~]# systemctl enable kubelet
[root@master ~]# systemctl enable docker 

设置为开机自启后,k8s群集的配置基本完成了,现在可以重启一下这三台服务器,如果重启后,执行下面的命令,状态都还是running,则表示绝对没有问题了。

[root@master ~]# kubectl get pod -n kube-system    #重启后验证状态是否还都是running

参考的链接:https://www.jianshu.com/p/4dcfcde779e1
链接:https://blog.51cto.com/14154700/2447761