#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服务了

##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的运行环境

kubernetes集群环境搭建

2.1 前置知识点
目前生产部署Kubernetes 集群主要有两种方式:

kubeadm

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

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

二进制包

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

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

kubeadm 部署方式介绍

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

创建一个Master 节点kubeadm init
将Node 节点加入到当前集群中$ kubeadm join <Master 节点的IP 和端口
##安装要求
在开始之前,部署Kubernetes 集群机器需要满足以下几个条件:

一台或多台机器,操作系统CentOS7.x-86_x64
硬件配置:2GB 或更多RAM,2 个CPU 或更多CPU,硬盘30GB 或更多
集群中所有机器之间网络互通
可以访问外网,需要拉取镜像
禁止swap 分区
最终目标
在所有节点上安装Docker 和kubeadm
部署Kubernetes Master
部署容器网络插件
部署Kubernetes Node,将节点加入Kubernetes 集群中
部署Dashboard Web 页面,可视化查看Kubernetes 资源
##角色 IP地址 组件

master01	192.168.92.150      docker,kubectl,kubeadm,kubelet
node01	    192.168.92.161	    docker,kubectl,kubeadm,kubelet
node02	    192.168.92.162 	    docker,kubectl,kubeadm,kubelet
registry    192.168.92.160     仓库服务器
配置静态IP
  cd /etc/sysconfig/network-scripts/
  cp ifcfg-ens33  ifcfg-ens33:0 
  vim ifcfg-ens33:0 

 TYPE=Ethernet
 BOOTPROTO=none
 NAME=ens33:0
 DEVICE=ens33:0
 ONBOOT=yes
 IPADDR=192.168.92.161
 PREFIX=24




 ifdown ens33
 ifup ens33

时间同步

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

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

###启动chronyd服务
[root@master ~]# systemctl start chronyd
[root@master ~]# systemctl enable chronyd
[root@master ~]# date
禁用iptable和firewalld服务
kubernetes和docker 在运行的中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则

###关闭firewalld服务
systemctl stop firewalld
systemctl disable firewalld

关闭iptables服务

[root@master ~]# systemctl stop iptables
[root@master ~]# systemctl disable iptables
####修改策略
vim /etc/selinux/config
setenforce 0
getenforce
Permissive
###禁用swap分区
swap分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备,但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明

编辑分区配置文件/etc/fstab,注释掉swap分区一行

[root@master ~]#vim /etc/fstab
 注释掉 /dev/mapper/centos-swap swap
[root@master ~]# swapoff -a

##rgistry(仓库服务器的配置)
###配置yum仓库远程支持软件的安装(把localrepo文件拷贝到registry)
略给各个节点修改yum文件用ftp共享yum源

 [root@registry localrepo]# createrepo --update .
安装软件
[root@registry ~]# yum makecache
[root@registry ~]# yum install -y docker-distribution
[root@registry ~]# systemctl enable --now docker-distribution

####拷贝云盘 配置ansisible 到 仓库服务器(registry节点)

    cd  ansible.centos07
    yum -y install *.rpm 

####使用脚本初始化仓库(在registry节点上)把mylo文件拷贝到registry上
[root@registry ~]# mkdir mylo
[root@registry ~]# cd myos
[root@registry ~]# chmod 755 init-img.sh
[root@registry ~]# ./init-img.sh
[root@registry ~]# curl http://192.168.92.160:5000/v2/myos/tags/list
{“name”:“myos”,“tags”:[“nginx”,“php-fpm”,“v1804”,“httpd”]}
##master安装

安装软件包
 安装kubeadm、kubectl、kubelet、docker-ce

yum makecache
yum install -y kubeadm kubelet kubectl docker-ce
mkdir -p /etc/docker
vim /etc/docker/daemon.json 

{
“exec-opts”: [“native.cgroupdriver=systemd”],
“registry-mirrors”: [“https://hub-mirror.c.163.com”],
“insecure-registries”:[“192.168.92.160:5000”, “registry:5000”]
}
systemctl enable --now docker kubelet
docker info |grep Cgroup
Cgroup Driver: systemd
#####镜像导入私有仓库
把base-images 中的镜像拷贝到 master
cd base-images/
for i in *.tar.gz;do docker load -i ${i};done

docker images |awk '$2!="TAG"{print $1,$2}'|while read _f _v;do
docker tag ${_f}:${_v} 192.168.92.160:5000/${_f##*/}:${_v}; 
docker push 192.168.92.160:5000/${_f##*/}:${_v}; 
docker rmi ${_f}:${_v}; 
done

####查看验证
[root@master base-image]# curl http://192.168.92.160:5000/v2/_catalog
####Tab键设置

 [root@master ~]# kubectl completion bash >/etc/bash_completion.d/kubectl
 [root@master ~]# kubeadm completion bash >/etc/bash_completion.d/kubeadm
 [root@master ~]# exit

####安装IPVS代理软件包
配置ipvs功能
在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
[root@master ~]# yum install -y ipvsadm ipset

#####主机名解析
[root@master ~]# vim /etc/hosts
192.168.92.150 master
192.168.92.161 node01
192.168.92.162 node02
192.168.92.160 registry

修改linux的内核参数

#####修改linux的内核采纳数,添加网桥过滤和地址转发功能
#####编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置
[root@master ~]# vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
[root@master ~]# modprobe br_netfilter
[root@master ~]# sysctl --system
[root@master ~]# mkdir init;cd init

拷贝 kubeadm-init.yaml 到 master 主机 init 目录下
  [root@master init]# kubeadm init --config=kubeadm-init.yaml |tee master-init.log
根据提示执行命令
 [root@master init]# mkdir -p $HOME/.kube
 [root@master init]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 [root@master init]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

####创建token
[root@master ~]# kubeadm token create --ttl=0 --print-join-command
[root@master ~]# kubeadm token list
#####获取token_hash
[root@master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt |openssl rsa -pubin -outform der |openssl dgst -sha256 -hex
###node安装

把node-install 文件到考reistry节点
[root@registry ~]# cd node-install/
[root@registrynode-install]# vim files/hosts
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.92.150 master
192.168.92.161 node01
192.168.92.161 node02
192.168.92.160 registry
[root@registry node-install]# vim node_install.yaml
… …
vars:
master: ‘192.168.92.150:6443’
token: 'fm6kui.mp8rr3akn74a3
token_hash: ‘sha256:f46dd7ee29faa3c096cad189b0f9aedf59421d8a881f7623a543065fa6b0088c’

root@registry node-install]# ansible-playbook node_install.yaml

####网络插件安装配置

拷贝文件flannel 目录到拷贝master节点上 上

#####上传镜像到私有仓库

  [root@master ~]# cd flannel
  [root@master flannel]# docker load -i flannel.tar.gz
  [root@master flannel]# docker tag quay.io/coreos/flannel:v0.12.0-amd64  192.168.1.100:5000/flannel:v0.12.0-amd64
  [root@master flannel]# docker push 192.168.92.160:5000/flannel:v0.12.0-amd64

#####修改配置文件并安装

 [root@master flannel]# vim kube-flannel.yml
  128: "Network": "10.244.0.0/16",
  172: image: 192.168.92.160:5000/flannel:v0.12.0-amd64
  186: image: 192.168.92.160:5000/flannel:v0.12.0-amd64
  227-结尾: 删除
 [root@master flannel]# kubectl apply -f kube-flannel.yml

####验证结果

[root@master flannel]# kubectl get nodes
NAME    STATUS ROLES AGE  VERSION
master  Ready master 26h  v1.17.6
node01 Ready <none> 151m v1.17.6
node02  Ready <none> 152m v1.17.6
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐