一、kubernetes简介
一)、kubernetes,简称K8s,是用8代替8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
二)、Kubeadm是Kubernetes官方提供的用于快速安装Kubernetes集群的工具,伴随Kubernetes每个版本的发布都会同步更新,Kubeadm可以学习到Kubernetes官方在集群配置上的一些最佳实践。
三)Kubernetes 特点
* 可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
* 可扩展: 模块化,插件化,可挂载,可组合
* 自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
本片博文主要介绍如何部署Kubernetes集群,想要对Kubernetes有更深入的了解请参考kubernetes官方网站
二、实验环境
主机名 | IP地址 | 系统版本 | 基于的服务 |
---|---|---|---|
master | 192.168.45.129 | Centos 7.3 | Docker 18.09.0 |
node01 | 192.168.45.141 | ||
node02 | 192.168.45.142 |
实验基本要求:
cpu:双核
MEM: 最低2G
关闭防火墙,iptables清空,禁用selinux。
三台node节点时间与主机必须同步,全部禁用swap
三、案例实施
一)、部署前的准备三台docker主机都要执行以下操作
注:关闭防火墙,iptables清空,禁用selinux。还有要做到,时间必须一致,全部禁用swap;
master主机:
[root@localhost ~]# hostnamectl set-hostname master
node01主机:
[root@localhost ~]# hostnamectl set-hostname node01
node02主机:
[root@localhost ~]# hostnamectl set-hostname node02 //更改主机名
[root@localhost ~]# bash
[root@master ~]# systemctl stop firewalld //关闭防火墙
[root@master ~]# systemctl disable firewalld
[root@master ~]# setenforce 0 //禁用selinux
[root@master ~]# iptables -F //清空iptables规则
[root@master ~]# iptables-save
[root@master ~]# swapoff -a //禁用swap
[root@master ~]# free -h //确认swap分区没有使用
total used free shared buff/cache available
Mem: 1.8G 361M 861M 9.0M 600M 1.2G
Swap: 0B 0B 0B
[root@master ~]# vim /etc/fstab
#/dev/mapper/cl-swap swap swap defaults 0 0 //此段加上注释
二)、配置免密登录、配置hosts域名解析
[root@master ~]# vim /etc/hosts //配置hosts文件用于域名解析
192.168.45.129 master
192.168.45.141 node01
192.168.45.142 node02
[root@master ~]# ssh-keygen -t rsa
//开启无密码传送
//连续点3下回车键
[root@master ~]# ssh-copy-id root@node01
[root@master ~]# ssh-copy-id root@node02
[root@master ~]# scp /etc/hosts node01:/etc/hosts
[root@master ~]# scp /etc/hosts node02:/etc/hosts
三)、打开iptables桥接及路由转发
[root@master ~]# vim /etc/sysctl.d/k8s.conf //编写以下两条命令
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
//开启iptables桥接功能
[root@master ~]# scp /etc/sysctl.d/k8s.conf node01:/etc/sysctl.d/k8s.conf
//将更改的配置文件发送给node01和node02
[root@master ~]# scp /etc/sysctl.d/k8s.conf node02:/etc/sysctl.d/k8s.conf
[root@node01 ~]# sysctl -p /etc/sysctl.d/k8s.conf //如果提示没有文件夹或目录输入下面命令
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@master ~]# modprobe br_netfilter //使内核加载br_netfilter模块
[root@master ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf //开启节点的路由转发功能
[root@master ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@master ~]# scp /etc/sysctl.conf node01:/etc/sysctl.conf
//将更改的配置文件发送给node01和node02
[root@master ~]# scp /etc/sysctl.conf node02:/etc/sysctl.conf
[root@node01 ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@node02 ~]# sysctl -p
net.ipv4.ip_forward = 1
四)、kubernetes的yum源添加
到此基本环境准备完毕,这里推荐使用阿里云yum源在master 节点上操作。
[root@master ~]# cat < /etc/yum.repos.d/kubernetes.repo
> [kubernetes]
> name=Kubernetes
> baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
> enabled=1
> gpgcheck=1
> repo_gpgcheck=1
> gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
> EOF
[root@master ~]# scp /etc/yum.repos.d/kubernetes.repo node01:/etc/yum.repos.d/kubernetes.repo
[root@master ~]# scp /etc/yum.repos.d/kubernetes.repo node02:/etc/yum.repos.d/kubernetes.repo
//将yum文件发送到node01、node02服务器上
//以下操作需在三台docker主机上都要执行以下
[root@master ~]# yum repolist //查看配置的yum文件有没有可用的包
kubernetes Kubernetes 542 //这个数字不可以为0
[root@master ~]# yum makecache //制作yum元数据缓存
四、部署kubernetes群集
一、yum安装kubernetes所需的组件
[root@master ~]# yum -y install kubeadm-1.15.0-0 kubelet-1.15.0-0 kubectl-1.15.0-0
//master端下载所需组件
[root@node01 ~]# yum -y install kubeadm-1.15.0-0 kubelet-1.15.0-0
[root@node02 ~]# yum -y install kubeadm-1.15.0-0 kubelet-1.15.0-0
//node端下载所需组件
注:OK,准备工作做完,可以开始初始化,可是由于国内网络环境限制,我们不能直接从谷歌的镜像站下载镜像,这时,需要我们手工从docker镜像站下载镜像,然后重新命名,这里我已经下载好了,只需要导入相应的镜像即可这里用脚本来实现。
k8s镜像 提取码:i13d
二、编写脚本,上传我提供的镜像
[root@master ~]# vim images.sh
#/bin/bash
for i in /root/images/*
do
docker load < $i
done
echo -e "\e[1;3m]导入完成\e[0m]"
//编写完成后保存退出即可
[root@master ~]# scp images.sh node01:/root/images.sh
[root@master ~]# scp images.sh node02:/root/images.sh
//将编写完的脚本发给node01和node02
[root@master ~]# mkdir images //创建用于存放镜像的tar包
[root@master ~]# cd images/
[root@master images]# rz //上传我提供的镜像
[root@master images]# ls
coredns-1-3-1.tar kube-apiserver-1-15.tar kube-proxy-1-15.tar myflannel-11-0.tar
etcd-3-3-10.tar kube-controller-1-15.tar kube-scheduler-1-15.tar pause-3-1.tar
[root@node01 images]# ls //node01和node02节点只需导入3个镜像即可。
kube-proxy-1-15.tar myflannel-11-0.tar pause-3-1.tar
[root@master ~]# bash images.sh //执行脚本
//node01和node02也需要执行脚本生成容器
三、初始化kubernetes集群
[root@master ~]# kubeadm init --kubernetes-version=v1.15.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
//这里指定的版本必须和前面yum安装的版本一致。指定的两个网络则是官方建议使用的网段
//如果执行上述命令后,返回CPU相关的报错信息,那么需要调大CPU的核心数
//初始化成功后,首先复制下面返回的这条命令,并妥善保存
//若初始化失败,修改完成之后需执行kubeadm reset进行重置群集
kubeadm join 192.168.45.129:6443 --token j2rtxl.1aai0w5vee2h5f2c \
--discovery-token-ca-cert-hash sha256:2214cfbf58c97fb65424ee0a8b2312a6cafc86531196a86806b309dabadf65ee
//上面这条命令是用来其他节点加入到当前k8s群集中需要执行的
//一旦丢失,特别麻烦,并且只有24小时有效期,每次初始化群集后产生的都不一样
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# chown $(id -u):$(id -g) $HOME/.kube/config
注:这里需要注意当我们初始化完成后会在末尾生成以下的命令附加图片如下:
如果没有出现图中的信息则表示kubernetes群集初始化失败!
四、配置master节点状态
一)、查看节点信息
[root@master ~]# kubectl get nodes //查看节点信息
NAME STATUS ROLES AGE VERSION
master NotReady master 15m v1.15.0
//从状态中可以看出是NotReady(没有准备好)
注:可以看出master的状态是未就绪(NotReady),之所以是这种状态是因为还缺少一个附件flannel,没有网络Pod是无法通信的;
二)、添加网络组件(flannel)
第一种方式:
[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
注:此命令并不是一次就执行成功的需要多执行几遍,运气的好可能一次就成功加油!
第二种方式:
如果网速较差推荐使用这种方式!
[root@master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
[root@master ~]# kubectl apply -f kube-flannel.yml
//将配置文件下载完成后,对下载的配置文件执行相应的命令
五、将node01、node02加入kubernetes群集中
[root@node01 ~]# kubeadm join 192.168.45.129:6443 --token j2rtxl.1aai0w5vee2h5f2c --discovery-token-ca-cert-hash sha256:2214cfbf58c97fb65424ee0a8b2312a6cafc86531196a86806b309dabadf65ee
[root@node02 ~]# kubeadm join 192.168.45.129:6443 --token j2rtxl.1aai0w5vee2h5f2c --discovery-token-ca-cert-hash sha256:2214cfbf58c97fb65424ee0a8b2312a6cafc86531196a86806b309dabadf65ee
//masterr初始化kubernetes群集返回的命令复制,以便加入到master的kubernetes群集中
[root@master ~]# kubectl get nodes
至此,Kubernetes群集已经部署完成!建议进行以下优化操作。
六、部署后的优化操作
一)、设置kubectl命令行工具自动补全功能
[root@k8s-master ~]# yum install -y bash-completion
[root@k8s-master ~]# source /usr/share/bash-completion/bash_completion
[root@k8s-master ~]# source <(kubectl completion bash)
[root@k8s-master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
二)、为了以后我们写yaml文件方便些,这里设置tab键空格个数
[root@master ~]# echo "set tabstop=2" >> .vimrc
[root@master ~]# source .vimrc
//设置tab键默认间距为两个空格,并使其生效
三)master节点确认Kubernetes集群没有问题
[root@master ~]# kubectl get pod --all-namespaces
//查看pod资源,确保返回的信息都是running
//不指定具体的名称空间,表示查看本节点所有的名称空间
或者
[root@master ~]# kubectl get pod -n kube-system
//查看pod资源,确保返回的信息都是running
//指定kubernetes集群的名称空间