Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

1. kubernetes介绍

1.1 kubernetes简介

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

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

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

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

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

负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡

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

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

 

1.2 kubernetes组件

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

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

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

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

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

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

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

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

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

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

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

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

  1. 首先要明确,一旦kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中,
  2. 一个nginx服务的安装请求会首先被发送到master节点的apiServer组件,
  3. apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上,在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer,
  4. apiServer调用controller-manager去调度Node节点安装nginx服务,
  5. kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod,pod是kubernetes的最小操作单元,容器必须跑在pod中至此,
  6. 一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理,

最后,外界用户就可以访问集群中的nginx服务了。

 

1.3 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集群

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

Kubeadm

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

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

二进制包:

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

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

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

 

3. Kubeadm方式部署(一主多从)

3.1 kubeadm介绍

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

第一、创建一个 Master 节点 kubeadm init

第二、将 Node 节点加入到当前集群中 # kubeadm join <Master节点的 IP和端口 >

 

3.2 安装要求

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

- 一台或多台机器,操作系统 CentOS7.x-86_x64

- 硬件配置:2GB或更多 RAM,2 个 CPU或更多 CPU,硬盘 30GB或更多

- 集群中所有机器之间网络互通

- 可以访问外网,需要拉取镜像

- 禁止 swap分区

 

3.3 实现目标

(1)在所有节点上安装 Docker 和 kubeadm

(2)部署 Kubernetes Master

(3)部署容器网络插件

(4)部署 Kubernetes Node,将节点加入 Kubernetes 集群中

(5)部署 Dashboard Web页面,可视化查看 Kubernetes资源

 

3.4 环境准备

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

角色

IP

组件

master

10.27.134.250

docker、kubectl、kubeadm、kubelet

node1

10.27.134.251

docker、kubectl、kubeadm、kubelet

node2

10.27.134.252

docker、kubectl、kubeadm、kubelet

 

3.5 系统初始化(所有节点均需操作)

3.5.1 主机名解析

##修改主机名

[root@jss-k8s-1 ~]# hostnamectl set-hostname master  #master节点

[root@jss-k8s-2 ~]# hostnamectl set-hostname node1   #node1节点

[root@jss-k8s-3 ~]# hostnamectl set-hostname node2   #node2节点

 

##三台服务器的地址和主机名添加到三个节点的/etc/hosts文件中

[root@master ~]# cat >> /etc/hosts << EOF

10.27.134.250 master

10.27.134.251 node1

10.27.134.252 node2

EOF

 

3.5.2 时间同步

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

# 启动chronyd服务并设置开机启动

# systemctl start chronyd && systemctl enable chronyd

 

# 核验时间

# date

 

3.5.3 禁用iptable和firewalld服务

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

##关闭firewalld服务

# systemctl stop firewalld && systemctl disable firewalld

 

##关闭iptables服务

# systemctl stop iptables && systemctl disable iptables

 

3.5.4 禁用selinux

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

# 永久关闭

# sed -i 's/enforcing/disabled/' /etc/selinux/config

 

# 临时关闭

# setenforce 0

 

3.5.5 禁用swap分区

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

# 永久关闭

# vim /etc/fstab

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

# 临时关闭

# swapoff -a

 

3.5.6 将桥接的 IPv4流量传递到 iptables的链上

##加载网桥过滤模块

# cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf

br_netfilter

EOF

 

##修改内核参数

# cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

EOF

 

##配置生效

# sysctl --system

 

##建议重启下系统,让配置彻底生效

# reboot

 

3.5.7 配置yum源

# curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo

 

# curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

 

# cat > /etc/yum.repos.d/kubernetes.repo << EOF

[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

EOF

 

# yum clean all && yum makecache

3.6 所有节点安装 docker

##查看所有的可用版本

# yum list docker-ce --showduplicates | sort -r

 

##安装旧版本(稳定性问题)

yum install docker-ce-cli-18.09.9-3.el7  docker-ce-18.09.9-3.el7

 

##安装源里最新版本

# yum install docker-ce

 

##配置docker加速

# mkdir -p /etc/docker

cat > /etc/docker/daemon.json << EOF

{

  "insecure-registries": [   

    "10.27.134.250:5000"

  ],

  "registry-mirrors" : [

    "https://8xpk5wnt.mirror.aliyuncs.com"

  ]

}

EOF

 

##启动docker

# systemctl enable docker && systemctl start docker

 

3.7 部署kubernetes master

(1)安装 kubeadm, kubelet 和 kubectl,操作节点:所有的节点需要执行

##可以指定版本,不指定即安装最新

# yum install -y kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2 --disableexcludes=Kubernetes

 

##查看kubeadm 版本

# kubeadm version

 

##设置kubelet开机启动

# systemctl enable kubelet

 

(2)初始化配置文件,操作节点: 只在master节点执行

# kubeadm config print init-defaults > kubeadm.yaml

 

##修改kubeadm的yaml文件

# vim kubeadm.yaml

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

 

(3)下载镜像

操作节点:只在master节点执行

##查看需要使用的镜像列表,若无问题,将得到如下列表

# kubeadm config images list --config kubeadm.yaml

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

 

##提前下载镜像到本地

# kubeadm config images pull --config kubeadm.yaml

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

 

(4)初始化master节点

操作节点:只在master节点执行

kubeadm init --config kubeadm.yaml

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

##按照上述提示信息操作,配置kubectl客户端的认证

mkdir -p #HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf #HOME/.kube/config

sudo chown #(id -u):#(id -g) #HOME/.kube/config

 

##此时查看节点应该处于notReady状态,因为还未配置网络插件。

若执行初始化过程中出错,根据错误信息调整后,执行kubeadm reset后再次执行init操作即可

# kubectl get nodes

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

 

3.8 添加node节点到集群中

操作节点:所有的node节点需要执行

在每台node节点,执行如下命令,该命令是在kubeadm init成功后提示信息中打印出来的,需要替换成实际init后打印出的命令。

kubeadm join 10.27.134.250:6443 --token abcdef.0123456789abcdef \

    --discovery-token-ca-cert-hash sha256:99006ec72f04c1e61ebd6d9037eec86c5dad7e239164e4928902e46ad7887d16

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

 

3.9 安装flannel网络插件

操作节点:只在master节点(k8s-master)执行

(1)下载flannel的yaml文件

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

 

##若是无法进行下载,可以本地浏览器打开地址后复制网页内容粘贴到本地,修改文件名和格式后再导入到master节点底层。

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

 

(2)修改flannel插件yml文件,新增一行配置指定网卡名称

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

 

(3)执行安装

##先拉取镜像,此过程国内速度比较慢

# docker pull quay.io/coreos/flannel:v0.11.0-amd64

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

 

##执行flannel安装

# kubectl create -f kube-flannel.yml

##若是网页复制粘贴的方式,安装出现下面报错,建议使用notepad打开转换为unix格式

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

 

3.10 集群验证

(1)操作节点: 在master节点执行

# kubectl get nodes  #观察集群节点是否全部Ready

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

 

(2)创建一个nginx服务进行测试

# kubectl run  test-nginx --image=nginx:alpine

 

(3)查看pod是否创建成功,并访问pod ip测试是否可用

# kubectl get pods -o wide

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

 

# curl 10.244.1.2

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

 

3.11(可选)设置master节点参与pod调度

操作节点:master

##默认部署成功后,master节点无法调度业务pod,如需设置master节点也可以参与pod的调度,需执行:

# kubectl taint node k8s-master node-role.kubernetes.io/master:NoSchedule-

 

3.12 部署dashboard可视化模块

(1)服务部署

##下载yml文件

# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc5/aio/deploy/recommended.yaml

 

##修改yam文件,service改为NodePort类型

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

 

##创建服务

# kubectl create -f recommended.yaml

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

 

##查看服务对外暴露的端口号

# kubectl get svc -n kubernetes-dashboard

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

 

(2)访问测试

##使用浏览器访问

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

 

(3)创建ServiceAccount进行登录

##创建admin.conf配置文件

# cat > /opt/kubernetes/cfg/admin.conf << EOF

kind: ClusterRoleBinding

apiVersion: rbac.authorization.k8s.io/v1beta1

metadata:

  name: admin

  annotations:

    rbac.authorization.kubernetes.io/autoupdate: "true"

roleRef:

  kind: ClusterRole

  name: cluster-admin

  apiGroup: rbac.authorization.k8s.io

subjects:

- kind: ServiceAccount

  name: admin

  namespace: kubernetes-dashboard

 

---

apiVersion: v1

kind: ServiceAccount

metadata:

  name: admin

  namespace: kubernetes-dashboard

EOF

 

##查看命名空间内的加密信息是否有token和名称

# kubectl get secret -n kubernetes-dashboard

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

 

##使用该命令拿到token,替换上条命令查询的名称admin-token-qt24k,然后粘贴到浏览器中进行登录

# kubectl -n kubernetes-dashboard get secret admin-token-qt24k -o jsonpath={.data.token}|base64 -d

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

 

##使用token登录dashboard

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

 

3.13 环境重置

如果在集群安装过程中遇到了其他问题,也可以使用下面的命令来进行重置:

# kubeadm reset

# ifconfig cni0 down && ip link delete cni0

# ifconfig flannel.1 down && ip link delete flannel.1

# rm -rf /var/lib/cni/

 

上一篇:平衡二叉树实例--判断输入后序序列是否为平衡二叉树


下一篇:[LeetCode] 590. N-ary Tree Postorder Traversal