kubernetes集群环境搭建(kubeadm方式)

1. kubernetes简介

在这里插入图片描述
kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。

kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:

  • 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
  • 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
  • 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
  • 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
  • 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
  • 存储编排:可以根据容器自身的需求自动创建存储卷

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

  • master:集群的控制平面,负责集群的决策 ( 管理 )

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

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

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

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

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

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

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

Docker : 负责节点上容器的各种操作

在这里插入图片描述

下面,以部署一个nginx服务来说明kubernetes系统各个组件调用关系:

首先要明确,一旦kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中

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

apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上

在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer

apiServer调用controller-manager去调度Node节点安装nginx服务

kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod

pod是kubernetes的最小操作单元,容器必须跑在pod中至此,

一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理

这样,外界用户就可以访问集群中的nginx服务了

1.1 kubernetes概念

  • Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控
  • Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行
  • Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
  • Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
  • Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod
  • Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
  • NameSpace:命名空间,用来隔离pod的运行环境

2. kubernetes集群环境搭建

2.1 前置知识点

目前生产部署Kubernetes 集群主要有两种方式:

  1. kubeadm

Kubeadm 是一个K8s 部署工具,提供kubeadm init 和kubeadm join,用于快速部署Kubernetes 集群。

官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

  1. 二进制包

从github 下载发行版的二进制包,手动部署每个组件,组成Kubernetes 集群。

Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。
在这里插入图片描述

2.2 kubeadm 部署方式介绍

kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署:

创建一个Master 节点kubeadm init
将Node 节点加入到当前集群中$ kubeadm join <Master 节点的IP 和端口>

2.3 安装要求

在开始之前,部署Kubernetes 集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统CentOS7.x-86_x64(该实验采用CentOS7.6版本)
  • 硬件配置:2GB 或更多RAM,2 个CPU 或更多CPU,硬盘30GB 或更多
  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • 禁止swap 分区

2.4 最终目标

  1. 在所有节点上安装Docker 和kubeadm
  2. 部署Kubernetes Master
  3. 部署容器网络插件
  4. 部署Kubernetes Node,将节点加入Kubernetes 集群中
  5. 部署Dashboard Web 页面,可视化查看Kubernetes 资源

2.5 准备环境

在这里插入图片描述

角色 IP地址安装组件
master01 192.168.230.200docker,kubectl,kubeadm,kubelet
node01 192.168.230.201docker,kubectl,kubeadm,kubelet
node02 192.168.230.202docker,kubectl,kubeadm,kubelet

2.6 环境初始化

2.6.1 检查操作系统的版本

此方式下安装kubernetes集群要求Centos版本要在7.5或之上

[root@master ~]# cat /etc/redhat-release

Centos Linux 7.5.1804 (Core)

2.6.2 主机名解析

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

主机名成解析 编辑三台服务器的/etc/hosts文件,添加下面内容

192.168.230.200  master01
192.168.230.201  node01
192.168.230.202  node02

在这里插入图片描述

2.6.3 时间同步

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

企业中建议配置内部的会见同步服务器

启动chronyd服务

[root@master ~]# systemctl start chronyd
[root@master ~]# systemctl enable chronyd
[root@master ~]# date

2.6.4 禁用iptable和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

2.6.5 禁用selinux

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

编辑 /etc/selinux/config 文件,修改SELINUX的值为disable

注意修改完毕之后需要重启linux服务

SELINUX=disabled

在这里插入图片描述

2.6.6 禁用swap分区

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

编辑分区配置文件/etc/fstab,注释掉swap分区一行
注意修改完毕之后需要重启linux服务

vim /etc/fstab

注释掉 /dev/mapper/centos-swap swap

# /dev/mapper/centos-swap swap

在这里插入图片描述

2.6.7 修改linux的内核参数

修改linux的内核采纳数,添加网桥过滤和地址转发功能

vim /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

在这里插入图片描述

2.6.8 配置ipvs功能

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

1.安装ipset和ipvsadm

[root@master ~]# yum install ipset ipvsadmin -y

2.添加需要加载的模块写入脚本文件

[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

2.6.9 安装docker

1、切换镜像源

cd /etc/yum.repos.d/   #先进入镜像源目录

然后下载阿里云的docker镜像源 docker-ce.repo到当前目录

[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 在默认情况下使用Vgroup Driver为cgroupfs,而Kubernetes推荐使用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、启动dokcer

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

2.6.10 安装Kubernetes组件

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

2、编辑/etc/yum.repos.d/kubernetes.repo,添加下面的配置

[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgchech=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

3、安装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

4、配置kubelet的cgroup

#编辑/etc/sysconfig/kubelet, 添加下面的配置

KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

在这里插入图片描述

5、设置kubelet开机自启

[root@master ~]# systemctl enable kubelet

2.6.11 准备集群镜像

在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看

[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 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

2.6.11 集群初始化

  • 集群初始化前强烈建议先把每台虚拟机拍下快照,因为初始化过程可能出现各种奇奇怪怪的故障,可自行复制报错内容到网上查找解决方案,如果没法解决就直接恢复快照吧
    在这里插入图片描述

  • 下面的操作只需要在master节点上执行即可,须修改成本机IP

创建集群

[root@master ~]# kubeadm init \
	--apiserver-advertise-address=192.168.230.200 \
	--image-repository registry.aliyuncs.com/google_containers \
	--kubernetes-version=v1.17.4 \
	--service-cidr=10.96.0.0/12 \
	--pod-network-cidr=10.244.0.0/16

在这里插入图片描述

创建必要文件

[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
  • master初始化后下边有个join链接,在需要加入该集群的node节点上分别执行(该链接需要引用自己的mstaer自己生成的才行)
kubeadm join 192.168.230.200:6443 --token awk15p.t6bamck54w69u4s8 \
    --discovery-token-ca-cert-hash sha256:a94fa09562466d32d29523ab6cff122186f1127599fa4dcd5fa0152694f17117 

在这里插入图片描述

以上两步执行完毕后在master上查看节点信息

[root@master ~]# kubectl get nodes
NAME    STATUS   ROLES     AGE   VERSION
master  NotReady  master   6m    v1.17.4
node1   NotReady   <none>  22s   v1.17.4
node2   NotReady   <none>  19s   v1.17.4

2.6.12 安装网络插件,只在master节点操作即可

下载网络插件yml文件(需网络能访问海外网站才行)

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

由于外网不好访问,如果出现无法访问的情况,可以可直接使用我网盘分享的文件, 文件名是kube-flannel.yml,放到该位置:/root/kube-flannel.yml
文件内容为:
https://github.com/flannel-io/flannel/tree/master/Documentation/kube-flannel.yml

链接: https://pan.baidu.com/s/167j-ZPwsgp_PmsngllLXMQ?pwd=yxew 提取码: yxew 复制这段内容后打开百度网盘手机App,操作更方便哦
使用配置文件启动fannel

kubectl apply -f kube-flannel.yml

等待它安装完毕,等待一分钟左右再查看, 发现集群的状态已经是Ready了~(成功)
在这里插入图片描述

2.6.13 重启kubelet和docker命令

重启kubelet

systemctl restart kubelet

重启docker

systemctl restart docker

2.6.14 集群出现严重故障无法解决时可使用kubeadm reset重置集群(慎用)

#在master节点之外的节点进行操作

kubeadm reset
systemctl stop kubelet
systemctl stop docker
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig docker0 down
ip link delete cni0
ip link delete flannel.1

重启kubelet

systemctl restart kubelet

重启docker

systemctl restart docker
  1. DashBoard
    之前在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的。其实,为了提供更丰富的用户体验,kubernetes还开发了一个基于web的用户界面(Dashboard)。用户可以使用Dashboard部署容器化的应用,还可以监控应用的状态,执行故障排查以及管理kubernetes中各种资源。

3.部署Dashboard

下载yaml,并运行Dashboard

下载yaml

[root@k8s-master01 ~]# wget  https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml

修改kubernetes-dashboard的Service类型

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort  # 新增
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30009  # 新增
  selector:
    k8s-app: kubernetes-dashboard

部署

[root@k8s-master01 ~]# kubectl create -f recommended.yaml

查看namespace下的kubernetes-dashboard下的资源

[root@master ~]# kubectl get pod,svc -n kubernetes-dashboard
NAME                                            READY   STATUS              RESTARTS   AGE
pod/dashboard-metrics-scraper-c79c65bb7-bqjbt   1/1     Running             0          14s
pod/kubernetes-dashboard-56484d4c5-nd2kq        0/1     ContainerCreating   0          14s

NAME                                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
service/dashboard-metrics-scraper   ClusterIP   10.100.57.155   <none>        8000/TCP        14s
service/kubernetes-dashboard        NodePort    10.102.50.206   <none>        443:30009/TCP   14s

在这里插入图片描述

2)创建访问账户,获取token

创建账号

[root@k8s-master01-1 ~]# kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard

在这里插入图片描述

授权

[root@k8s-master01-1 ~]# kubectl create clusterrolebinding dashboard-admin-rb --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin

获取账号token

[root@k8s-master01 ~]#  kubectl get secrets -n kubernetes-dashboard | grep dashboard-admin

在这里插入图片描述
复制时注意修改下中加生成的 dashboard-admin-token-ch4g6

[root@k8s-master01 ~]# kubectl describe secrets dashboard-admin-token-ch4g6 -n kubernetes-dashboard

在这里插入图片描述

3)通过浏览器访问Dashboard的UI
https://192.168.230.200:30009/#/login
在这里插入图片描述

在登录页面上输入上面的token后进入~
在这里插入图片描述

小编也是一名刚学k8s不久的渣渣,不过按照以上流程如果出现故障没法解决,可以给我留言哦,等我消化完后边再整理出更多K8S知识点,再出二进制部署过程~

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

且听风吟tmj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值