(二)在centOS-7上搭建K8S集群环境搭建的过程

学习K8S时,常常需要自己搭建环境,本人将centOS-7上搭建K8S的过程进行做如下的记录,以方便自己后续环境的搭建和指导其他人搭建环境作为参考资料,本章节主要介绍如何搭建kubernetes的集群环境

集群环境搭建

集群类型

kubernetes集群大体上分为两类:一主多从多主多从

  • 一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境
  • 多主多从:多台Master节点和多台Node节点,搭建麻烦,安全性高,适合用于生产环境

说明:为了测试简单,本次搭建的是 一主两从 类型的集群

安装方式

kubernetes有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包

  • minikube:一个用于快速搭建单节点kubernetes的工具
  • kubeadm:一个用于快速搭建kubernetes集群的工具
  • 二进制包 :从官网下载每个组件的二进制包,依次去安装,此方式对于理解kubernetes组件更加有效

说明:现在需要安装kubernetes的集群环境,但是又不想过于麻烦,所以选择使用kubeadm方式

主机规划

作用 IP地址 操作系统 配置
Master 192.168.1.100 Centos7.9 基础设施服务器 2颗CPU 2G内存 50G硬盘
Node1 192.168.1.101 Centos7.9 基础设施服务器 2颗CPU 2G内存 50G硬盘
Node2 192.168.1.102 Centos7.9 基础设施服务器 2颗CPU 2G内存 50G硬盘
Node3 192.168.1.103 Centos7.9 基础设施服务器 2颗CPU 2G内存 50G硬盘

环境搭建

​ 本次环境搭建需要安装三台Centos服务器(一主二从),然后在每台服务器中分别安装docker(18.06.3),kubeadm(1.17.4)、kubelet(1.17.4)、kubectl(1.17.4)程序。

主机安装

安装虚拟机过程中注意下面选项的设置:

  • 操作系统环境:CPU(2C) 内存(2G) 硬盘(50G)

  • 语言选择:中文简体

  • 软件选择:基础设施服务器

  • 分区选择:自动分区

  • 网络配置:按照下面配置网路地址信息

网络地址:192.168.1.100  (每台主机都不一样  分别为100101102,103)
子网掩码:255.255.255.0
默认网关:192.168.1.99
DNS:114.114.114.114
  • 主机名设置:按照下面信息设置主机名

  • master节点: master
    node节点: node1
    node节点: node2
    node节点: node3

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wiWbiM7X-1650165608530)(assets/image-20200505214156148.png)]

环境初始化

  1. 检查操作系统的版本

#此方式下安装kubernetes集群要求Centos版本要在7.5或之上(否则存在node节点无法加入master的情况)
在这里插入图片描述

2) 主机名解析

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

# 主机名成解析 编辑三台服务器的/etc/hosts文件,添加下面内容
192.168.1.100  master
192.168.1.101  node1
192.168.1.102  node2
192.168.1.103  node3

修改系统的DNS(不然在拉取镜像中存在报错):
vim /etc/resolv.conf
内容改为:
#Generated by NetworkManager
search localdomain
nameserver 114.114.114.114
在这里插入图片描述

3) 时间同步

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

企业中建议配置内部的时间同步服务器

# 启动chronyd服务
[root@master ~]# systemctl start chronyd
# 设置chronyd服务开机自启
[root@master ~]# systemctl enable chronyd
# chronyd服务启动稍等几秒钟,就可以使用date命令验证时间了
[root@master ~]# date

(二)在centOS-7上搭建K8S集群环境搭建的过程_第1张图片

4) 禁用iptables和firewalld服务

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

(二)在centOS-7上搭建K8S集群环境搭建的过程_第2张图片

5) 禁用selinux

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

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

(二)在centOS-7上搭建K8S集群环境搭建的过程_第3张图片

6) 禁用swap分区

swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用

启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备

但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明

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

(二)在centOS-7上搭建K8S集群环境搭建的过程_第4张图片

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

# 重新加载配置
[root@master ~]# sysctl -p

# 加载网桥过滤模块
[root@master ~]# modprobe br_netfilter

# 查看网桥过滤模块是否加载成功
[root@master ~]# lsmod | grep br_netfilter

(二)在centOS-7上搭建K8S集群环境搭建的过程_第5张图片

8)配置ipvs功能

在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的

两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块

#1 安装ipset和ipvsadm
[root@master ~]# yum install ipset ipvsadmin -y
(二)在centOS-7上搭建K8S集群环境搭建的过程_第6张图片
(二)在centOS-7上搭建K8S集群环境搭建的过程_第7张图片

#2 添加需要加载的模块写入脚本文件
[root@master ~]# cat < /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
(二)在centOS-7上搭建K8S集群环境搭建的过程_第8张图片

#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
(二)在centOS-7上搭建K8S集群环境搭建的过程_第9张图片

9) 重启服务器

上面步骤完成之后,需要重新启动linux系统

[root@master ~]# reboot

安装docker

# 1 切换镜像源
[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /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,而kubernetes推荐使用systemd来代替cgroupfs
[root@master ~]# mkdir /etc/docker
[root@master ~]# cat <  /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

在这里插入图片描述

安装kubernetes组件

# 由于kubernetes的镜像源在国外,速度比较慢,这里切换成国内的镜像源
# 编辑/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
# 编辑/etc/sysconfig/kubelet,添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

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

在这里插入图片描述
(二)在centOS-7上搭建K8S集群环境搭建的过程_第10张图片
修改配置文件如下
(二)在centOS-7上搭建K8S集群环境搭建的过程_第11张图片

准备集群镜像

在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看
[root@master ~]# kubeadm config images list
(二)在centOS-7上搭建K8S集群环境搭建的过程_第12张图片
下载镜像
此镜像在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
)
(二)在centOS-7上搭建K8S集群环境搭建的过程_第13张图片
for imageName in i m a g e s [ @ ] ; d o d o c k e r p u l l r e g i s t r y . c n − h a n g z h o u . a l i y u n c s . c o m / g o o g l e c o n t a i n e r s / {images[@]} ; do docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/ images[@];dodockerpullregistry.cnhangzhou.aliyuncs.com/googlecontainers/imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/ i m a g e N a m e k 8 s . g c r . i o / imageName k8s.gcr.io/ imageNamek8s.gcr.io/imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
(二)在centOS-7上搭建K8S集群环境搭建的过程_第14张图片
单个组件的操作可以用下面这个方法:

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.4
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.4 k8s.gcr.io/kube-apiserver:v1.17.4
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.4

集群初始化

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

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

#创建集群
[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.1.100 (master的IP地址,需要修改)
(二)在centOS-7上搭建K8S集群环境搭建的过程_第15张图片
得到的结果如下:
(二)在centOS-7上搭建K8S集群环境搭建的过程_第16张图片

#创建必要文件
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown ( i d − u ) : (id -u): (idu):(id -g) $HOME/.kube/config
在这里插入图片描述

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

#将node节点加入集群(每个master的节点的操作不一致)
[root@master ~]# kubeadm join 192.168.109.100:6443 \
–token 8507uc.o0knircuri8etnw2
–discovery-token-ca-cert-hash
sha256:acc37967fb5b0acf39d7598f8a439cc7dc88f439a3f4d0c9cae88e7901b9d3f
需要加入到master节点上的node节点都需要执行以下的操作:
(二)在centOS-7上搭建K8S集群环境搭建的过程_第17张图片

#查看集群状态 此时的集群状态为NotReady,这是因为还没有配置网络插件
(二)在centOS-7上搭建K8S集群环境搭建的过程_第18张图片

安装网络插件

kubernetes支持多种网络插件,比如flannel、calico、canal等等,任选一种使用即可,本次选择flannel

下面操作依旧只在master节点执行即可,插件使用的是DaemonSet的控制器,它会在每个节点上都运行

#获取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
(二)在centOS-7上搭建K8S集群环境搭建的过程_第19张图片
#稍等片刻,再次查看集群节点的状态
[root@master ~]# kubectl get nodes
以下是过程变化
(二)在centOS-7上搭建K8S集群环境搭建的过程_第20张图片
结果显示如下:
(二)在centOS-7上搭建K8S集群环境搭建的过程_第21张图片

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

部署Nginx进行测试:

[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES    AGE    VERSION
master   Ready      master   120m   v1.17.4
node1    Ready      <none>   115m   v1.17.4
node2    Ready      <none>   113m   v1.17.4
node3    NotReady   <none>   112m   v1.17.4
[root@master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine
deployment.apps/nginx created
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6867cdf567-5rbrj   1/1     Running   0          26s
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6867cdf567-5rbrj   1/1     Running   0          118s

(二)在centOS-7上搭建K8S集群环境搭建的过程_第22张图片

[root@master ~]# kubectl get service 查看Nginx暴露的端口号
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        125m
nginx        NodePort    10.110.254.217   <none>        80:**30427**/TCP   69s  查看Nginx暴露的端口号

在浏览器通过master的IP+PORT(http://192.168.1.100:30427/)的端口,进行访问nginx
(二)在centOS-7上搭建K8S集群环境搭建的过程_第23张图片

你可能感兴趣的:(docker&K8S,云原生,kubernetes,linux)