k8集群环境搭建
k8s集群搭建
#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
更多推荐
所有评论(0)