关于docker:k8s-集群搭建不要让贫穷扼杀了你学-k8s-的兴趣

22次阅读

共计 8632 个字符,预计需要花费 22 分钟才能阅读完成。

大家好,欢送来到小菜集体 solo 学堂。在这里,常识收费,不吝排汇!关注收费,不吝入手!
死鬼~ 看完记得给我来个三连哦!

本文次要介绍 kubernetes 集群的搭建

如有须要,能够参考

如有帮忙,不忘 点赞

微信公众号已开启,小菜良记,没关注的同学们记得关注哦!

浏览这篇文章先须要对 docker 的基本知识有所理解!相干浏览请移步:Docker 上手,看完感觉本人又行了!

置信点进来的小伙伴应该都对 k8s 有所耳闻,甚至于曾经应用上了。而如果是因为对题目感到好奇的小伙伴也别急着划走,因为我劝你肯定要学习 Kubernetes(k8s)。而题目也并非题目党,因为 k8s 集群大体上分为两大类:

  • 一主多从:一台 master 节点和多台 node 节点,搭建比较简单,然而有可能呈现 master 单机故障
  • 多主多从: 多台 master 节点和多台 node 节点,搭建比拟麻烦,然而安全性高

不论是 一主多从 异或者是 多主多从,这里至多都是须要三台服务器,而且每台服务器的规格至多得在 2G 内存 2 颗 CPU 配置起步,而咱们如果纯属为了平时练习应用,破费一笔钱去投资服务器,可能有局部人是不违心的,所以这里就响应了题目~ 接下来小菜将带给你比拟节俭的计划去学习 k8s 集群的搭建

结尾说到,我劝你肯定要学习 k8s 这并非是一句空话。当下,云原生也并非是一个新名词,它曾经指定了一条新的开发路线,麻利、可扩大、可复制、最大化利用 …便是这条路线的代名词!这篇文章不单单介绍 Kubernetes 的搭建,如果对 Kubernetes 有所相熟的同学能够间接跳转到 Kubernetes 集群搭建 的局部,如果不相熟的同学倡议先看看前半部分,先对 Kubernetes 有所理解一下。

Kubernetes

一、K8s 事先理解

有些同学可能感到有点奇怪,为什么一会说 kubernetes,一会说 k8s,这两个是同一个货色吗?答案是必定的

Kubernetes 简称 k8s,是用 8 来代替 8 个字符 “ubernete” 的缩写

这个一个用来治理云平台中多个主机上的容器化利用,它的目标便是让部署容器化的利用简略且高效,它提供了利用部署,布局,更新,保护的一种机制。

咱们先来看看部署利用的迭代过程:

  • 传统部署: 间接将应用程序部署在物理机上
  • 虚拟化部署: 能够在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境
  • 容器化部署: 与虚拟机相似,然而共享了操作系统

看了以上部署形式,想想看你们公司当初是用的哪一种~ 说到容器化部署,学过 docker 的同学必定第一工夫想到dockerdocker 的容器化部署形式的确给咱们带来了很多便当,然而问题也是存在的,有时候这些问题会被咱们刻意性的回避,因为 docker 切实是有点好用,让人有点不忍心对它产生质疑,然而又不得不面对:

  • 一个容器故障停机了,怎么样保障高可用让另外一个容器立即启动去替补上停机的容器
  • 当并发访问量上来的时候,是否能够做到主动扩容,并发访问量上来的时候是否能够做到主动缩容

容器的问题的确有时候挺值得沉思的,而这些容器治理的问题统称为 容器编排 问题,咱们能想到的问题,天然有人去解决,例如 docker 自家就推出了 Docker Swarm 容器编排工具,Apache 退出了 Mesos 资源对立管控工具,Google 推出了Kubernetes 容器编排工具,而这也是咱们要说到的配角!

1)K8s 长处
  • 自我修复:一旦某一个容器解体,可能在 1 秒左右迅速启动新的容器
  • 弹性伸缩:能够依据须要,主动对集群中正在运行的容器数量进行调整
  • 服务发现:服务能够通过主动发现的模式找到它所依赖的服务
  • 负载平衡:如果一个服务启动了多个容器,可能主动实现申请的负载平衡
  • 版本回退:如果发现新公布的程序版本有问题,能够立刻回退到原来的版本
  • 存储编排:能够依据容器本身的需要主动创立存储卷
2)K8s 形成组件

一个残缺的 Kubernetes 集群是由 管制节点 master工作节点 node 形成的,因而这种集群形式也分为 一主多从 多主多从,而每个节点上又会装置不同组件以提供服务。

1、Master

集群的管制立体,负责集群的决策(治理)。它旗下存在以下组件

  • ApiServer:资源操作的惟一入口,接管用户输出的命令,提供认证、受权、Api 注册和发现等机制
  • Scheduler:负责集群资源调度,依照预约的调度策略将 pod 调度到相应的 node 节点上
  • ControllerManager:负责保护集群的状态,比方程序部署安顿,故障检测,主动扩大,滚动更新等
  • Etcd:负责存储集群中各种资源对象的信息
2、Node

集群的数据立体,负责为容器提供运行环境(干活)。它旗下存在以下组件

  • Kubelet:负责保护容器的生命周期,即通过管制 docker 来创立、更新、销毁容器
  • KubeProxy:负责提供集群外部的服务发现和负载平衡

看完了以上介绍,那咱们接下来就开始进行 k8s 集群的搭建!

二、k8s 集群搭建

1)Centos7 装置

首先咱们须要软件:

  • VMware Workstation Pro
  • Centos 7.0 镜像

虚拟机软件可百度查找下载,如若没有分割小菜,小菜给你提供

镜像可拜访阿里云进行下载,如下图:下载地址

实现虚拟机的装置后咱们便可在 VMware 中装置 Centos7

  • 咱们抉择 创立新的虚拟机

  • 抉择自定义装置

典型装置:VMware 会将支流的配置利用在虚拟机的操作系统上,对于老手来很敌对。

自定义装置:自定义装置能够针对性的把一些资源增强,把不须要的资源移除。防止资源的节约。

  • 兼容性个别向下兼容

  • 抉择咱们下载好的 centos 镜像

  • 给本人的虚拟机调配名称和装置地址,咱们须要装置三台,所以名称我这里别离命名为(master、node01、node02)

  • 给本人的虚拟机分配资源,最低要求个别是 2 核 2G 内存

  • 这里应用 NAT 网络类型

桥接:抉择桥接模式的话虚拟机和宿主机在网络上就是平级的关系,相当于连贯在同一交换机上。

NAT:NAT 模式就是虚拟机要联网得先通过宿主机能力和里面进行通信。

仅主机:虚拟机与宿主机间接连起来

  • 接下来始终下一步,而后点击实现即可

  • 装置完后咱们便能够在页面看到以下后果,点击开启此虚拟机:

  • 抉择 install CentOS7

  • 而后就能够看到装置过程:

  • 过一会便会看到让咱们抉择语言的界面,这里抉择中文并持续

  • 软件抉择咱们能够选 基础设施服务器 ,装置地位可选 主动分区

  • 而后咱们须要点击 网络和主机名 进入网络配置

  • 咱们在 tarbar 栏点击 编辑 -> 虚构网络编辑器 查看虚拟机的子网 IP

  • 这边咱们手动自定义增加 Ipv4 的地址,DNS 服务器可填阿里云的

咱们调配的地址须要排除 25502 这两个地址,别离是播送和网关地址。

我是这样配置的:

master 节点192.168.108.100

node01 节点192.168.108.101

node02 节点192.168.108.102

  • 配置完抉择保留并点击实现,而后设置主机名

我是这样配置的:

master 节点master

node01 节点node01

node02 节点node02

  • 实现以上配置后,大抵是如下样子

  • 点击开始装置后,咱们来到了以下页面,而后配置以下两个信息

实现以上配置后,重启便能够应用,其余两个节点也是同样的配置,能够间接抉择克隆,网络配置和主机名 记得改~ 而后咱们便失去以下配置的三个服务器:

主机名 IP 配置
master 192.168.108.100 2 核 2G 内存 30G 硬盘
node01 192.168.108.101 2 核 2G 内存 30G 硬盘
node02 192.168.108.102 2 核 2G 内存 30G 硬盘
2)环境配置

实现以上服务器的搭建后,咱们能够利用 shell 工具 进行连贯,开始搭建 k8s 环境

  • 主机名解析

为了集群节点间的间接调用,咱们须要配置一下主机名解析,别离在三台服务器上编辑 /etc/hosts

  • 同步工夫

集群中的工夫必须要准确统一,咱们能够间接应用 chronyd 服务从网络同步工夫,三台服务器需做同样的操作

  • 禁用 iptablesfirewalld服务

kubernetes 和 docker 在运行中会产生大量的 iptables 规定,为了不让零碎规定跟它们混同,间接关闭系统的规定。三台虚拟机需做同样操作:

# 1 敞开 firewalld 服务
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
# 2 敞开 iptables 服务
[root@master ~]# systemctl stop iptables
[root@master ~]# systemctl disable iptables
  • 禁用selinux

selinuxlinux 零碎下的一个平安服务,如果不敞开它,在装置集群中会产生各种各样的奇葩问题

# 永恒敞开
[root@master ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config
# 长期敞开
[root@master ~]# setenforce 0
  • 禁用 swap 分区

swap 分区指的是虚拟内存分区,它的作用是在物理内存应用完之后,将磁盘空间虚构成内存来应用启用 swap 设施会对系统的性能产生十分负面的影响,因而 kubernetes 要求每个节点都要禁用 swap 设施然而如果因为某些起因的确不能敞开 swap 分区,就须要在集群装置过程中通过明确的参数进行配置阐明

# 长期敞开
[root@master ~]# swapoff -a
# 永恒敞开
[root@master ~]# vim /etc/fstab

正文掉 swap 分区那一行

  • 批改 linux 的内核参数

咱们须要批改 linux 的内核参数,增加网桥过滤和地址转发性能,编辑 /etc/sysctl.d/kubernetes.conf 文件,增加如下配置:

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

增加后进行以下操作:

# 从新加载配置
[root@master ~]# sysctl -p
# 加载网桥过滤模块
[root@master ~]# modprobe br_netfilter
# 查看网桥过滤模块是否加载胜利
[root@master ~]# lsmod | grep br_netfilter

同样是在三台服务器都进行操作,胜利信息如下:

  • 配置 ipvs 性能

kubernetesservice有两种代理模型,一种是基于 iptables 的,一种是基于 ipvs
相比拟的话,ipvs的性能显著要高一些,然而如果要应用它,须要手动载入 ipvs 模块

# 装置 ipset 和 ipvsadm
[root@master ~]# yum install ipset ipvsadmin -y

# 增加须要加载的模块写入脚本文件
[root@master ~]# cat <<EOF > /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
# 为脚本文件增加执行权限
[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
# 执行脚本文件
[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
# 查看对应的模块是否加载胜利
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4

  • 实现以上配置后重启服务器
[root@master ~]# reboot
3)docker 装置

第一步:

# 获取镜像源
[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

第二步:

# 装置特定版本的 docker-ce
# 必须指定 --setopt=obsoletes=0,否则 yum 会主动装置更高版本
[root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y

第三步:

# 增加一个配置文件
# Docker 在默认状况下应用的 Cgroup Driver 为 cgroupfs,而 kubernetes 举荐应用 systemd 来代替 cgroupfs
[root@master ~]# mkdir /etc/docker

第四步:

# 增加阿里云 yum 源, 可从阿里云容器镜像治理中复制镜像减速地址
[root@master ~]# cat <<EOF > /etc/docker/daemon.json
{"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF

第五步:

# 启动 docker
[root@master ~]# systemctl enable docker && systemctl start docker

实现以上 5 步,也就实现了 docker 的装置,离胜利更近一步~

4)集群初始化

1、因为 kubernetes 的镜像源在国外,速度比较慢,因而咱们须要切换成国内的镜像源

# 编辑 /etc/yum.repos.d/kubernetes.repo 增加一下配置
[root@master ~]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

2、而后装置 kubeadmkubeletkubectl 三个组件

yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0
kubectl-1.17.4-0 -y

3、配置 kubelet 的 group

# 编辑 /etc/sysconfig/kubelet,增加上面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

4、这步是来初始化集群的,因而只需在 master 服务器上执行即可,下面那些是每个服务器都须要执行!

# 创立集群
# 因为默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址
[root@master ~]# kubeadm init \
--apiserver-advertise-address=192.168.108.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.17.4 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 

#应用 kubectl 工具
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

而后咱们须要将node 节点退出集群中,在 node 服务器 上执行上述红框的命令:

[root@master ~]# kubeadm join 192.168.108.100:6443 --token xxx \ 
--discovery-token-ca-cert-hash sha256:xxx

便可在 master 节点 获取到节点信息:

然而咱们这个时候查看集群状态都是为NotReady,这是因为还没有配置网络插件

5、装置网络插件

kubernetes反对多种网络插件,比方 flannelcalicocanal 等等,这里抉择应用flanne

下载 flanneld-v0.13.0-amd64.docker:下载地址

下载实现后,上传至 master 服务器 执行以下命令

docker load < flanneld-v0.13.0-amd64.docker

执行实现后便可看到多了个 flannel 镜像:

而后咱们须要获取 flannel 的配置文件来部署 flannel 服务

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

# 应用配置文件启动 fannel
[root@master ~]# kubectl apply -f kube-flannel.yml

# 再次查看集群节点的状态
[root@master ~]# kubectl get nodes

这个时候所有节点的状态都是Ready 的状态,到此为止,咱们的 k8s 集群就算搭建实现了!

5)集群性能验证

接下来就是咱们的验证工夫,之前咱们学 docker 的时候往往会启动一个 nginx 容器来测试是否可用,k8s 咱们也同样来部署一个 nginx 来测试下服务是否可用~

(上面例子为测试例子,如果不分明每个指令的作用也不要紧,前面咱们会出篇 k8s 的教学文章来阐明 k8s 如果应用!)

  • 首先咱们创立一个 deployment
[root@master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine
deployment.apps/nginx created

[root@master ~]# kubectl get deploy
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           31s
  • 而后创立一个 service 来让外界可能拜访到咱们 nginx 服务
[root@master ~]# kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePort
service/nginx exposed

[root@master ~]# kubectl get svc 
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
nginx        NodePort    10.110.224.214   <none>        80:31771/TCP   5s

而后咱们通过 node 节点的 IP 加上 service 裸露进去的 nodePort 来拜访咱们的 nginx 服务:

也能够间接在集群中通过 service 的 IP 加上映射进去的 port 来拜访咱们的服务:

从后果上看两种拜访都是可用的,阐明咱们的 nginx 服务部署胜利,无妨点个关注助助兴~

公众号搜寻:小菜良记

更多干货值得浏览哦!

那么为什么咱们能够拜访到 nginx?咱们无妨联合下面说到的 k8s 组件来梳理一下各个组件的调用关系:

  1. kubernetes 启动后,无论是 master 节点 亦或者 node 节点,都会将本身的信息存储到 etcd 数据库中
  2. 创立 nginx 服务,首先会将装置申请发送到 master 节点上的 apiServer 组件中
  3. apiServer 组件会调用 scheduler 组件来决定应该将该服务装置到哪个 node 节点上。这个时候就须要用到 etcd 数据库了,scheduler会从 etcd 中读取各个 node 节点的信息,而后依照肯定的算法进行抉择,并将后果告知给 apiServer
  4. apiServer 调用 controllerManager 去调度 node 节点,并装置 nginx 服务
  5. node 节点上的 kubelet 组件接管到指令后,会告诉docker,而后由 docker 来启动一个 nginxpod

    podkubernetes 中的最小操作单元,容器都是跑在 pod

  6. 以上步骤实现后,nginx 服务便运行起来了,如果须要拜访 nginx,就须要通过 kube-proxy 来对 pod 产生拜访的代理,这样内部用户就能拜访到这个 nginx 服务

以上便是运行一个服务的全过程,不晓得看完之后有没有一种 肃然起敬 的感觉,设计是在太奇妙了,因而到这里,难道就不筹备看 k8s 应用下文!如果筹备看的话,小手将关注点起来哦!

END

以上便是 k8s 集群的搭建过程,有了 k8s 的环境,你还怕学不会 k8s 的应用吗!在本人的虚拟机上纵情折腾,弄坏了也就一个复原快照的事~ 我是小菜,路漫漫,与你一起求索!

明天的你多致力一点,今天的你就能少说一句求人的话!

我是小菜,一个和你一起学习的男人。 💋

微信公众号已开启,小菜良记,没关注的同学们记得关注哦!

正文完
 0