IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> K8S概念与安装、搭建集群(K8S学习一) -> 正文阅读

[系统运维]K8S概念与安装、搭建集群(K8S学习一)

介绍

Kubernetes是一个全新的基于容器技术的分布式架构方案,它本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。 它的目的就是实现资源管理的自动化。主要提供了下面的功能:

1、自我修复:一旦某一个容器崩溃,能够在秒级迅速启动新的容器;

2、弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整;

3、服务发现:服务可以通过自动发现的形式找到它所依赖的服务;

4、负载均衡: 如果一个服务启动了多个容器,能够 实现自动的付负载均衡;

5、版本回退:如果发现新版本的程序有问题,可以立即回退到原来的版本;

6、存储编排:可以根据容器自身的需求自动创建储存卷。

?Kubernetes组件

一个K8s集群主要是由控制节点(master)、工作节点(node)构成,每个节点上都会安装不同的组件。

master:集群的控制平面,负载集群的决策

ApiServer :资源操作的唯一入口,接收用户输入的命令,提供认证,授权,API注册和发现机制

Scheduler:负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上

controllerManager:负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等

ETCD:负责储存集群中各种资源对象的信息

node:集群的数据平面,负责为容器提供运行环境

kubelet:负责维护容器的声明周期,即通过控制docker来创建、更新、销毁容器

kubeProxy:负责提供集群内部的服务发现和负载均衡

Docker:就系Docker

? ? ? ? ? ? ? ? ? ? ? ? ?Master? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Node?

举个流程顺序的栗子:

1、一旦K8S环境启动之后,master和node都会将自身的信息存储到ETCD数据库中(便于K8S管理);

2、1个nginx服务的安装请求会首先被发送到master节点的apiServer组件去

3、apiServer组件会调用Scheduler组件来决定到底把nginx这个服务装到哪个node节点上(在此时,它会从etcd中读取各个node节点的信息,然后用算法进行选择,将结果返回给apiServer)

4、apiServer调用controller-mannaer去调度控制选中的node进行安装ngginx服务;

5、kubelet接收到指令后,会通知docker,然后docker启动一个nginx的POD

(pod系kubernetes的最小操作单元,容器必须跑在pod中)

6、一个nginx服务就运行了,如果需要访问Nginx,就要通过kube-proxy来对pod产生访问的代理.这样外界用户就可以访问集群中的nginx服务了。

K8S概念

Maser : 集群控制节点,每个集群需要至少一个master节点负责集群的管控;

Node : 工作负责节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行;

Pod : K8s中最少的控制单元,容器都系运行在pod中的,一个pod中可以有1个或者多个容器

Controller : 控制器,通过它来实现对pod的管理 , 比如启动pod、停止pod、伸缩pod的数量等

Service : pod对外服务的统一入口,下面可以维护着同一类的多个pod(与外界的桥梁)

Label : 标签,用于对pod进行分类,同一类的pod会有相同的标签;

NameSpace:命名空间,用来隔离pod的运行环境

?K8S安装

集群类型

K8S一般就两种:

一主多从:1Master对多Node,搭建简单。但是master一挂就GG高风险

多主多从:多Master对多Node,搭建麻烦,高可用适合生产环境

?安装方式

K8S有多重部署方式,主流的有kubeadm,minikube,二进制包(听说要装一天,一个组件一个组件的装)

minikube : 一个用于快速搭建单节点的K8S工具

kubeadm: 一个用于快速搭建K8S集群的工具

二进制包: 从官网下载每个组件的二进制包,依次去安装。主要拿来学组件。

这次我们是用 一主多从, kubeadm的方式进行安装的。

主机规划(好像不到2核或2G会报错的。)

?K8S玩Centos的话 一定要7.5以上哦!

安装之一、环境初始化

1)检查操作系统版本是否是centos7.5以上

2) 主机名解析

为了方便后面集群节点间的直接调用,配置一下主机名解析,企业中推荐使用DNS服务器

#主机名即系 编辑三台服务器的/etc/hosts 文件,添加下面的内容

master ip and nodes ip :

?

?设置成功后 直接ping hosts里面是可以通的

?3) 配置时间同步

K8S要求集群中的节点时间必须精确一直, 在这里直接使用chronyd服务从网络同步时间。?

企业建议配置内部的时间同步服务器(我这里是三个SSH窗口同时执行的)

#启动chronyd服务
[root@localhost /]# systemctl start chronyd

#设置chronyd服务开机启动
[root@localhost /]# systemctl enable chronyd
Created symlink from /etc/systemd/system/multi-user.target.wants/chronyd.service to /usr/lib/systemd/system/chronyd.service.

#查看时间
[root@localhost /]# date
2021年 08月 22日 星期日 20:45:47 CST
[root@localhost /]# 

4) 禁用iptables和firewalld服务

kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟他们混淆,直接关闭系统的规则

#1 关闭防火墙服务

systemctl stop firewalld?

systemctl disable firewalld

#2关闭iptables服务

systemctl stop iptables

systemctl disable iptables

5) 禁用selinux

selinux 是linux系统的一个安全服务,如果不关闭它,在安装集群中会产生各种奇葩问题

#编辑 /etc/selinux/config 文件,修改SELINUX的值为disabled
#注意修改完毕之后需要重启Linux服务
SELINUX=disabled

6)禁用swap分区

swap分区指的是虚拟内存分区,他的作用是在物理内存使用完之后,将磁盘空间虚拟成内存使用,启用swap设备会对系统的性能产生非常负面的影响,因此k8s要求每个节点都要禁用swap设备,但是如果因为某些原因却是不能关闭swap分区,就需要再集群安装过程中通过明确的参数进行配置说明;

#编辑分区配置文件 /etc/fstab , 注释swap分区一行
#注意修改完毕之后需要重启linux服务
UUID - 455CC753-7a60-4c17-a424-77411728c44a1 /boot xfs defaults        0 0
/dev/mapper/centos-home /home                      xfs defaults        0 0
# /dev/mapper/centos-swap swap                     swap defaults       0 0

7) 修改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

#重新加载配置
sysctl -p


#加载网桥过滤模块
modprobe br_netfilter


#查看网桥过滤模块是否加载成功
lsmod | grep br_netfilter

8)配置ipvs功能

在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,ipvs的性能明显高一些,但是如果要使用它 需要手动载入ipvs模块

#1. 安装ipset和ipvsdm
yum install ipset ipvsadmin -y

#2 添加需要加载的模块写入脚本文件(这是一个脚本,实际是加载下面5个模块) 直接粘贴就好
[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

#3 为脚本添加执行权限
[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules

#4 执行脚本文件
[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules

#5查看对应的模块是否加载成功
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4

9) 重启Linux系统

上面步骤完成后,需要重启电脑哦。

----------------------------------------------------------------DONE

安装集群所需的组件

1.安装docker

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

#2 查看当前镜像源中支持的docker版本
[root@master ~]# yum list docker-ce --showduplicates

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

#4 添加一个配置文件
#docker在默认情况下使用的Cgroup Driver为cgroupfs,而k8s推荐使用systemd来代替cgroupfs
[root@master ~]# mkdir /etc/docker
[root@master ~]#cat <<EOF > /etc/docker/daemon.json
{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF

#5 启动docker
[root@master ~]# systemctl restart docker
[root@master ~]# systemctl enable docker

#6 检查docker状态和版本
[root@master ~]# docker version

2.安装Kubernetes组件

#由于K8S的镜像源在国外,速度比较慢,这里切换成国内的镜像源

#编辑 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

#安装kubeadm,kubelet 和kubectl
[root@master ~]# yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y

#配置kubelet的cgroup
#编辑vim  /etc/sysconfig/kubelet,添加如下配置  (编辑时里面是有东西的删掉就好了)
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

#4设置kubelet开机自动启动
[root@master ~]# systemctl enable kubelet

3.集群初始化

准备集群镜像

#在安装k8s集群之前(集群就是上面图的那堆组件),必须提前准备好集群需要的镜像
#想看所需镜像可以通过下面命令查看
[root@master ~]# kubeadm config images list

#下载镜像(定义好所需的镜像)
#此镜像在kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替代方案
images=(
    kube-apiserver:v1.17.4
    kube-controller-manager:v1.17.4
    kube-scheduler:v1.17.4
    kube-proxy:v1.17.4
    pause:3.1
    etcd:3.4.3-0
    coredns:1.6.5
)
>>
#(执行for循环替换掉.)
for imageName in ${images[@]} ; do
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
    docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done

集群初始化

下面开始对集群进行初始化,并将node节点加入到集群中

下面的操作只需要再master节点上执行即可

下面指令中

? ? ?pod - net word = (pod网络,不用改)
? ? wever-cidr是? (server网络,不用改)
? ? --apiserver-advertise-address=192.168.8.128 (这个是master机器的IP)

#创建集群
[root@master ~]# kubeadm init \
    --kubernetes-version=v1.17.4 \
    --pod-network-cidr=10.244.0.0/16 \    
    --service-cidr=10.96.0.0/12 \          
    --apiserver-advertise-address=192.168.8.128 

#创建必要文件
[root@master ~]# mkdir -p SHOME/ .kube   (创建一个文件夹,以后执行的kubectl脚本要读取的配置文件)
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/ .kube/config (拷贝文件)
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/ .kube/config  (创建权限)

初始化成功后, 这里我们要使用集群,所以按照提示执行一下下面的三个命令。

?Node节点加入Master节点

下面操作只需要在node节点上执行即刻

#将node节点加入集群
[root@master ~]# kubeadm join 192.168.109.100:6443 \
    --token xxxxxxxxxxxxxxxxxxxx \
    --discovery-token-ca-cert-hash \
    --sha256:xxxxxxx

#查看集群状态 此时的集群状态为notReady,这是因为还没配置网络插件
[root@master ~]# kubectl get nodes

由于查看kubectl get nodes的知道, 所有节点的状态的是NONE的。为什么呢? 因为节点之间没有安装网络插件, 下面操作依旧只在master节点即刻,插件使用的是DaemonSet的控制器,他会在每个节点上运行。 kubernetes其实支持多种网络插件,比如flannel,calico,canal等等,这里我用Flannel.

#获取Fannel文件可能被墙了。 这种情况可以访问https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

直接vim kube-flannel.yml 将内容粘贴上去。(yml我是上传到/root目录的) 上传好以后

在这个目录直接kubectl apply -f kube-flannel.yml就可以了

完成后直接上图:(我在这时候不成功。node1/node2都ready了,但是master是NoReady的。

这是为什么呢? 我这边看了/etc/hosts是指定主机名为master,.但是我的hostname不是这个名字

于是我临时改了我的hostname 输入命令 hostname master 然后在kubeadm rest重置节点。

再重新建立一次集群。 这次终于成功了,我叼。)

?发一次代码记录下先。

#获取fannel的配置文件
[root@master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

#修建文件中quay.io创库为quay-mirror.qiniu.com

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

#稍等片刻,再次查看集群节点状态
[root@master ~]# kubectl get nodes

NAME     STATUS     ROLES     AGE     VERSION
master    Ready     master     15m     v1.17.4
node1     Ready     <nono>     8m53s   v1.17.4
node2     Ready     <nono>     8m53s   v1.17.4

至此,kubernetes的集群环境搭建完成。

验证集群是否安装成功

搭建Nginx测试。

以后的操作,直接在master节点操作就可以了呀~~~~

程序在容器里, 容器在pod里。

#部署nginx
[root@master ~]# kubectl create_deployment nginx --image=nginx:1.14-alpine

#暴露端口
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort

#查看服务状态     pods=容器运行的单元   svc=service
[root@master ~]# kubectl get pods,svc


#最后在电脑上访问一下部署的nginx服务

?

?

?即刻去访问一下先

?

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-08-31 15:52:22  更:2021-08-31 15:53:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 11:51:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码