K8S介绍

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

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

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

Kubernetes优势:

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

k8s概念

CentOS 7 离线部署K8S群集

cluster

cluster是 计算、存储和网络资源的集合,k8s利用这些资源运行各种基于容器的应用。

master

master是cluster的大脑,他的主要职责是调度,即决定将应用放在那里运行。master运行linux操作系统,可以是物理机或者虚拟机。为了实现高可用,可以运行多个master。

node

node的职责是运行容器应用。node由master管理,node负责监控并汇报容器的状态,同时根据master的要求管理容器的生命周期。node运行在linux的操作系统上,可以是物理机或者是虚拟机。

pod

pod是k8s的最小工作单元。每个pod包含一个或者多个容器。pod中的容器会作为一个整体被master调度到一个node上运行。

CentOS 7 离线部署K8S群集

controller

k8s通常不会直接创建pod,而是通过controller来管理pod的。controller中定义了pod的部署特性,比如有几个剧本,在什么样的node上运行等。为了满足不同的业务场景,k8s提供了多种controller,包括deployment、replicaset、daemonset、statefulset、job等。

deployment

是最常用的controller。deployment可以管理pod的多个副本,并确保pod按照期望的状态运行。

replicaset

实现了pod的多副本管理。使用deployment时会自动创建replicaset,也就是说deployment是通过replicaset来管理pod的多个副本的,我们通常不需要直接使用replicaset。

daemonset

用于每个node最多只运行一个pod副本的场景。正如其名称所示的,daemonset通常用于运行daemon。

statefuleset

能够保证pod的每个副本在整个生命周期中名称是不变的,而其他controller不提供这个功能。当某个pod发生故障需要删除并重新启动时,pod的名称会发生变化,同时statefulset会保证副本按照固定的顺序启动、更新或者删除。

job

用于运行结束就删除的应用,而其他controller中的pod通常是长期持续运行的。

service

deployment可以部署多个副本,每个pod 都有自己的IP,外界如何访问这些副本那?
答案是service
k8s的 service定义了外界访问一组特定pod的方式。service有自己的IP和端口,service为pod提供了负载均衡。
k8s运行容器pod与访问容器这两项任务分别由controller和service执行。

namespace

可以将一个物理的cluster逻辑上划分成多个虚拟cluster,每个cluster就是一个namespace。不同的namespace里的资源是完全隔离的。

Kubernetes架构:

服务分组,小集群,多集群
服务分组,大集群,单集群

Kubernetes 组件:

Kubernetes Master控制组件,调度管理整个系统(集群),包含如下组件:

Kubernetes API Server

作为Kubernetes系统的入口,其封装了核心对象的增删改查操作,以RESTful API接口方式提供给外部客户和内部组件调用。维护的REST对象持久化到Etcd中存储。

Kubernetes Scheduler

为新建立的Pod进行节点(node)选择(即分配机器),负责集群的资源调度。组件抽离,可以方便替换成其他调度器。
  

Kubernetes Controller

负责执行各种控制器,目前已经提供了很多控制器来保证Kubernetes的正常运行。

Replication Controller

管理维护Replication Controller,关联Replication Controller和Pod,保证Replication Controller定义的副本数量与实际运行Pod数量一致。
  

Node Controller

管理维护Node,定期检查Node的健康状态,标识出(失效|未失效)的Node节点。

Namespace Controller

管理维护Namespace,定期清理无效的Namespace,包括Namesapce下的API对象,比如Pod、Service等。

Service Controller

管理维护Service,提供负载以及服务代理。

EndPoints Controller

管理维护Endpoints,关联Service和Pod,创建Endpoints为Service的后端,当Pod发生变化时,实时更新Endpoints。

Service Account Controller

管理维护Service Account,为每个Namespace创建默认的Service Account,同时为Service Account创建Service Account Secret。

Persistent Volume Controller

管理维护Persistent Volume和Persistent Volume Claim,为新的Persistent Volume Claim分配Persistent Volume进行绑定,为释放的Persistent Volume执行清理回收。

Daemon Set Controller

管理维护Daemon Set,负责创建Daemon Pod,保证指定的Node上正常的运行Daemon Pod。

Deployment Controller

管理维护Deployment,关联Deployment和Replication Controller,保证运行指定数量的Pod。当Deployment更新时,控制实现Replication Controller和 Pod的更新。

Job Controller

管理维护Job,为Jod创建一次性任务Pod,保证完成Job指定完成的任务数目

Pod Autoscaler Controller

实现Pod的自动伸缩,定时获取监控数据,进行策略匹配,当满足条件时执行Pod的伸缩动作。

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

Kubelet

负责管控容器,Kubelet会从Kubernetes API Server接收Pod的创建请求,启动和停止容器,监控容器运行状态并汇报给Kubernetes API Server。

Kubernetes Proxy

负责为Pod创建代理服务,Kubernetes Proxy会从Kubernetes API Server获取所有的Service信息,并根据Service的信息创建代理服务,实现Service到Pod的请求路由和转发,从而实现Kubernetes层级的虚拟转发网络。

Docker

Node上需要运行容器服务

环境配置

主机名 IP地址 角色 配置
master 192.168.0.110 主节点 2C 2G
node01 192.168.0.104 工作节点 2C 2G
node02 192.168.0.106 工作节点 2C 2G

备注:实验环境的虚拟机至少2核2g

部署过程

一、软件包下载上传

1.百度网盘下载地址

链接:https://pan.baidu.com/s/1Qzs8tcf4O-8xlTmnl2Qx5g
提取码:ah4y

二、服务器基础环境优化(3台操作相同)

1.关闭防护墙,安全性

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
systemctl stop firewalld
systemctl disable firewalld

2.服务器时间同步

timedatectl set-timezone Asia/Shanghai

3.修改主机名

hostnamectl set-hostname master &&bash
hostnamectl set-hostname node01 &&bash
hostnamectl set-hostname node02 &&bash

4.添加hosts文件

vim /etc/hosts #主机名解析
末尾添加:
192.168.0.110 master
192.168.0.104 node1
192.168.0.106 node2

其它2台可以添加,也可以拷贝文件:

scp /etc/hosts root@192.168.0.104:/etc/hosts
scp /etc/hosts root@192.168.0.106:/etc/hosts

5.免密交互(只在master上)

ssh-keygen #生成公钥
ssh-copy-id -i .ssh/id_rsa.pub root@node1
ssh-copy-id -i .ssh/id_rsa.pub root@node2
ssh-copy-id -i .ssh/id_rsa.pub root@master
ssh root@node1 #测试连接

6.关闭交换内存swap

swapoff -a #临时关闭
sed -i '12s/^\//#\//g' /etc/fstab #永久关闭

7.网桥设置

echo -e "net.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.d/k8s.conf
sysctl --system #使其生效

三、部署docker(3台操作相同)

1.解压安装docker

tar -zxvf docker-ce-18.09.tar.gz
cd docker && yum localinstall *.rpm -y #yum安装相关依赖

2.启动docker

systemctl start docker
systemctl enable docker #开机启动
docker version

3.docker加速器

vim /etc/docker/daemon.json #添加

{
"registry-mirrors": ["https://fskvstob.mirror.aliyuncs.com/"]
}

systemctl daemon-reload #重新加载

四、部署K8s群集

3台操作相同

1.解压安装k8s

cd ../
tar -zxvf kube114-rpm.tar.gz
cd kube114-rpm && yum localinstall *.rpm -y #yum解决依赖

2.导入k8s镜像

cd ../
docker load -i k8s-114-images.tar.gz
docker load -i flannel-dashboard.tar.gz

注意:如果导入镜像发生如下报错:
CentOS 7 离线部署K8S群集

报错原因:镜像压缩包下载出问题了
解决办法:重新下载或更换镜像

3.查看k8s镜像

docker images #共9个镜像

CentOS 7 离线部署K8S群集

只在master上面操作

4.master初始化

kubeadm init --kubernetes-version=v1.14.1 --pod-network-cidr=10.244.0.0/16

CentOS 7 离线部署K8S群集

若出现这种报错:
CentOS 7 离线部署K8S群集

解决方法:

echo "1" >> /proc/sys/net/ipv4/ip_forward

CentOS 7 离线部署K8S群集

5.查看节点

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get node

CentOS 7 离线部署K8S群集

kubectl get pod --all-namespaces

CentOS 7 离线部署K8S群集

6.配置KUBECONFIG变量

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
source /etc/profile
echo $KUBECONFIG #应该返回/etc/kubernetes/admin.conf

CentOS 7 离线部署K8S群集

7.部署flannel网络

kubectl create -f kube-flannel.yml
kubectl get node

CentOS 7 离线部署K8S群集

在node节点服务器操作

8.kubeadm join 加入node节点

systemctl enable kubelet #添加开机启动k8s
kubeadm join 192.168.0.110:6443 --token 2vjmyw.9p6cbn8m8oqs41ta \
--discovery-token-ca-cert-hash sha256:e4c1d3e9da26e2f488dec621122a30d8725762c20bf281519376ed0ae8c7204b #不要复制这个,要拷贝系统生成的token才行!

CentOS 7 离线部署K8S群集

注意:若出现和master系统报错,相同办法解决即可!

echo "1" >> /proc/sys/net/ipv4/ip_forward

9.在master上面查看

kubectl get node

CentOS 7 离线部署K8S群集

10.部署k8s UI界面(dashboard), 只在master上面

kubectl apply -f kubernetes-dashboard.yaml
kubectl apply -f admin-role.yaml
kubectl apply -f kubernetes-dashboard-admin.rbac.yaml
kubectl -n kube-system get svc

11.网页验证

访问地址 :http://ip:32000

CentOS 7 离线部署K8S群集

参考资料:

1.参考文章https://www.jianshu.com/p/0e1a3412528e
2.参考老齐的k8s教学视频
3.参考k8s官方中文文档https://kubernetes.io/zh/docs/home/