一、Kubernetes简介
Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化应用。Kubernetes的目标就是让部署容器化的应用简单并且高效。Kubernetes提供了应用部署、规划、更新、维护的一种机制。
Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行,管理员可以加载一个微型服务,让规划期来找到合适的位置,同时,Kubernetes也系统提升工具以及人性化方面,让用户能够方便的部署自己的应用。
本片博文主要介绍如何部署Kubernetes集群,想要对Kubernetes有更深入的了解请参考Kubernetes中文文档或Kubernetes官方网站
二、kubeadm简介
Kubeadm是Kubernetes官方提供的用于快速安装Kubernetes集群的工具,伴随着Kubernetes每个版本的发布都会同步更新,Kubeadm可以学习到Kubernetes官方在集群配置上的一些最佳实践。
三、环境准备
没有部署docker环境的可以参考docker——简介+安装+基础命令+镜像加速+dockerfile因为以下环境必须使用docker环境!
基本环境:
系统版本 | docker版本 | 主机名 | ip地址 |
---|---|---|---|
master | 192.168.10.52 | ||
centos 7.5 | 18.09.0 | node01 | 192.168.10.53 |
node02 | 192.168.10.54 |
硬件要求:
1)双核CPU;
2)最低2G内存;
四、部署前准备
1)检查docker版本、关闭防火墙与SELinux、清空iptables规则,禁用Swap
以下操作须在三台docker主机上分别配置一次(包括生产环境)!
[root@master ~]# docker -v //查看docker版本信息
Docker version 18.09.0, build 4d60db4
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld //关闭防火墙
[root@master ~]# setenforce 0
[root@master ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
//关闭SELinux
[root@master ~]# iptables -F //清空iptables规则
[root@master ~]# swapoff -a
[root@master ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab //禁用swap
[root@master ~]# mount -a //重新加载挂载的配置文件
[root@master ~]# free -h //确认swap分区没有使用
total used free shared buff/cache available
Mem: 1.8G 411M 825M 10M 584M 1.2G
Swap: 0B 0B 0B
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart docker //重新启动docker服务
2)配置免密登录、配置hosts文件以及yum源
##注意以下没有特殊声明,在master节点执行即可!
[root@master ~]# echo -e "192.168.10.52 master\n192.168.10.53 node01\n192.168.10.54 node02" >> /etc/hosts
//配置hosts文件,便于域名解析
[root@master ~]# ssh-keygen -t rsa
[root@master ~]# ssh-copy-id root@node01
[root@master ~]# ssh-copy-id root@node02
//配置node01、node02的免密登录
[root@master ~]# scp /etc/hosts root@node01:/etc/
[root@master ~]# scp /etc/hosts root@node02:/etc/
//将更改完成的配置文件发送到node01、node02
[root@master ~]# echo -e "[kubernetes]\nname=Kubernetes\nbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/\nenabled=1\ngpgcheck=0" >> /etc/yum.repos.d/kubernetes.repo
//配置阿里云镜像站yum文件
[root@master ~]# scp /etc/yum.repos.d/kubernetes.repo root@node01:/etc/yum.repos.d/
[root@master ~]# scp /etc/yum.repos.d/kubernetes.repo root@node02:/etc/yum.repos.d/
//将yum文件发送到node01、node02服务器上
//以下操作需在三台docker主机上都执行以下
[root@master ~]# yum repolist //查看配置的yum文件有没有可用的包
kubernetes Kubernetes 442 //这个数字不可以为0
[root@master ~]# yum makecache //制作yum元数据缓存
3)打开iptables桥接及路由转发
[root@master ~]# echo -e "net.bridge.bridge-nf-call-iptables = 1\nnet.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.d/k8s.conf
[root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
//开启iptables桥接功能
[root@master ~]# echo -e "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
[root@master ~]# sysctl -p
net.ipv4.ip_forward = 1
//开启路由转发功能
[root@master ~]# scp /etc/sysctl.d/k8s.conf root@node01:/etc/sysctl.d/
[root@master ~]# scp /etc/sysctl.d/k8s.conf root@node02:/etc/sysctl.d/
[root@master ~]# scp /etc/sysctl.conf root@node01:/etc/
[root@master ~]# scp /etc/sysctl.conf root@node02:/etc/
//将文件复制到node01、node02
//在node01、node02执行以下命令
[root@node01 ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@node01 ~]# sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@node02 ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@node02 ~]# 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模块
以上准备环境做完!
五、部署kubernetes群集
kubernetes是某某公司开发出来的,其所用的镜像都是由某某公司开发的,,由于中国对其的限制,导致无法直接下载某某公司的镜像,但是国内有很多kubernetes镜像的提供商,比如阿里、清华大学等,我们需先下载部署kubernetes群集的国内的镜像。
方法一:
1)安装部署k8s相关工具
[root@master ~]# mkdir images
[root@master ~]# cd images/
[root@master images]# rz #上传我提供的所有镜像包,共8个镜像包
[root@master images]# ls #确认上传的镜像包
coredns-1-3-1.tar kube-proxy-1-15.tar
etcd-3-3-10.tar kube-scheduler-1-15.tar
kube-apiserver-1-15.tar myflannel-11-0.tar
kube-controller-1-15.tar pause-3-1.tar
#接下来导入上传的镜像包到docker镜像中
[root@master ~]# pwd #脚本不要和镜像在同一个目录
/root
[root@master ~]# vim a.sh #编写脚本如下
#!/bin/bash
cd /root/images/
for i in `ls`
do
docker load < ${i}
done
[root@master ~]# sh a.sh #执行脚本,进行导入镜像
**以下操作需要在node01及node02分别执行一次**
[root@node01 ~]# mkdir images
[root@node01 ~]# cd images/
[root@node01 images]# rz #上传我提供的镜像文件,共三个,是下面 ls 命令查看的三个
[root@node01 images]# ls #需要上传的镜像文件如下
kube-proxy-1-15.tar myflannel-11-0.tar pause-3-1.tar
[root@node01 images]# docker load < kube-proxy-1-15.tar
[root@node01 images]# docker load < myflannel-11-0.tar
[root@node01 images]# docker load < pause-3-1.tar
方法二:
1)编写下载镜像的脚本
由于其复杂性、易错性。提供脚本如下。
master节点所需脚本:
[root@master ~]# cat push.sh
#!/bin/bash
K8S_VERSION=v1.15.0
ETCD_VERSION=3.3.10
DASHBOARD_VERSION=v1.8.3
FLANNEL_VERSION=v0.11.0-amd64
DNS_VERSION=1.3.1
PAUSE_VERSION=3.1
# 基本组件
docker pull mirrorgooglecontainers/kube-apiserver:$K8S_VERSION
docker pull mirrorgooglecontainers/kube-controller-manager:$K8S_VERSION
docker pull mirrorgooglecontainers/kube-scheduler:$K8S_VERSION
docker pull mirrorgooglecontainers/kube-proxy:$K8S_VERSION
docker pull mirrorgooglecontainers/etcd-amd64:$ETCD_VERSION
docker pull mirrorgooglecontainers/pause:$PAUSE_VERSION
docker pull coredns/coredns:$DNS_VERSION
# 网络组件
docker pull quay.io/coreos/flannel:$FLANNEL_VERSION
# 修改镜像标签
docker tag mirrorgooglecontainers/kube-apiserver:$K8S_VERSION k8s.gcr.io/kube-apiserver:$K8S_VERSION
docker tag mirrorgooglecontainers/kube-controller-manager:$K8S_VERSION k8s.gcr.io/kube-controller-manager:$K8S_VERSION
docker tag mirrorgooglecontainers/kube-scheduler:$K8S_VERSION k8s.gcr.io/kube-scheduler:$K8S_VERSION
docker tag mirrorgooglecontainers/kube-proxy:$K8S_VERSION k8s.gcr.io/kube-proxy:$K8S_VERSION
docker tag mirrorgooglecontainers/etcd-amd64:$ETCD_VERSION k8s.gcr.io/etcd:$ETCD_VERSION
docker tag mirrorgooglecontainers/pause:$PAUSE_VERSION k8s.gcr.io/pause:$PAUSE_VERSION
docker tag coredns/coredns:$DNS_VERSION k8s.gcr.io/coredns:$DNS_VERSION
#删除冗余的images
docker rmi mirrorgooglecontainers/kube-apiserver:$K8S_VERSION
docker rmi mirrorgooglecontainers/kube-controller-manager:$K8S_VERSION
docker rmi mirrorgooglecontainers/kube-scheduler:$K8S_VERSION
docker rmi mirrorgooglecontainers/kube-proxy:$K8S_VERSION
docker rmi mirrorgooglecontainers/etcd-amd64:$ETCD_VERSION
docker rmi mirrorgooglecontainers/pause:$PAUSE_VERSION
docker rmi coredns/coredns:$DNS_VERSION
[root@master ~]# docker images //脚本下载完成之后,确认本地有以下镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/kube-proxy v1.15.0 d235b23c3570 6 months ago 82.4MB
k8s.gcr.io/kube-apiserver v1.15.0 201c7a840312 6 months ago 207MB
k8s.gcr.io/kube-controller-manager v1.15.0 8328bb49b652 6 months ago 159MB
k8s.gcr.io/kube-scheduler v1.15.0 2d3813851e87 6 months ago 81.1MB
quay.io/coreos/flannel v0.11.0-amd64 ff281650a721 11 months ago 52.6MB
k8s.gcr.io/coredns 1.3.1 eb516548c180 11 months ago 40.3MB
k8s.gcr.io/etcd 3.3.10 2c4adeb21b4f 13 months ago 258MB
k8s.gcr.io/pause 3.1 da86e6ba6ca1 2 years ago 742kB
node节点所需脚本:
[root@node01 ~]# cat push.sh
#!/bin/bash
K8S_VERSION=v1.15.0
FLANNEL_VERSION=v0.11.0-amd64
PAUSE_VERSION=3.1
# 基本组件
docker pull mirrorgooglecontainers/kube-proxy:$K8S_VERSION
docker pull mirrorgooglecontainers/pause:$PAUSE_VERSION
# 网络组件
docker pull quay.io/coreos/flannel:$FLANNEL_VERSION
# 修改镜像标签
docker tag mirrorgooglecontainers/kube-proxy:$K8S_VERSION k8s.gcr.io/kube-proxy:$K8S_VERSION
docker tag mirrorgooglecontainers/pause:$PAUSE_VERSION k8s.gcr.io/pause:$PAUSE_VERSION
#删除冗余的images
docker rmi mirrorgooglecontainers/kube-proxy:$K8S_VERSION
docker rmi mirrorgooglecontainers/pause:$PAUSE_VERSION
[root@node01 ~]# docker images //脚本下载完成之后,确认本地有以下镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/kube-proxy v1.15.0 d235b23c3570 6 months ago 82.4MB
quay.io/coreos/flannel v0.11.0-amd64 ff281650a721 11 months ago 52.6MB
k8s.gcr.io/pause 3.1 da86e6ba6ca1 2 years ago 742kB
注意:以上脚本所下镜像仅供部署Kubernetes 1.15版本使用,如果使用其他版本,可自行进行修改!
上面两种方法根据自身条件选择
2)下载部署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端下载所需组件
3)初始化kubernetes集群
需将master节点的镜像下载完成后,才可执行以下命令!
[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.10.52:6443 --token fjc68j.db1o4dc33xbcvubt \
--discovery-token-ca-cert-hash sha256:8bcfeea87d3c4f8d1b7b52ae7223378b352ca06573b4bc9ca2857532d0ce52aa
//上面这条命令是用来其他节点加入到当前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群集初始化失败!
4)配置master节点状态
[root@master ~]# kubectl get nodes //查看群集节点信息
NAME STATUS ROLES AGE VERSION
master NotReady master 19m v1.15.0
//从状态中可以看出是NotReady(没有准备好)
推荐使用github下载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
//将配置文件下载完成后,对下载的配置文件执行相应的命令
上面两种方式选择其中一种即可!
[root@master ~]# kubectl get nodes //再次查看群集节点情况
NAME STATUS ROLES AGE VERSION
master Ready master 50m v1.15.0
//此时发现状态已经是Ready(准备好了)
5)将node01、node02加入kubernetes群集中
需将node节点所需镜像、组件安装完成后,才可执行以下命令:
[root@node01 ~]# kubeadm join 192.168.10.52:6443 --token fjc68j.db1o4dc33xbcvubt \
--discovery-token-ca-cert-hash sha256:8bcfeea87d3c4f8d1b7b52ae7223378b352ca06573b4bc9ca2857532d0ce52aa
[root@node02 ~]#kubeadm join 192.168.10.52:6443 --token fjc68j.db1o4dc33xbcvubt \
--discovery-token-ca-cert-hash sha256:8bcfeea87d3c4f8d1b7b52ae7223378b352ca06573b4bc9ca2857532d0ce52aa
//执行masterr初始化kubernetes群集时返回的命令,以便加入到master的kubernetes群集中
[root@master ~]# kubectl get nodes //master节点查看群集节点情况
NAME STATUS ROLES AGE VERSION
master Ready master 57m v1.15.0
node01 Ready <none> 3m44s v1.15.0
node02 Ready <none> 3m50s v1.15.0
//发现node节点已经正常加入群集中
至此,Kubernetes群集已经部署完成!建议进行以下优化操作。
6)部署后的优化操作
(1)master节点设置tab键默认间距(因为经常需要编写yml文件)
[root@master ~]# echo "set tabstop=2" >> .vimrc
[root@master ~]# source .vimrc
//设置tab键默认间距为两个空格,并使其生效
(2)设置kubectl命令自动补全(master节点与node节点都需配置)
[root@master ~]# yum -y install bash-completion
[root@master ~]# source /usr/share/bash-completion/bash_completion
[root@master ~]# source <(kubectl completion bash)
[root@master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
(3)master节点确认Kubernetes集群没有问题
[root@master ~]# kubectl get pod --all-namespaces
//查看pod资源,确保返回的信息都是running
//不指定具体的名称空间,表示查看本节点所有的名称空间
或者
[root@master ~]# kubectl get pod -n kube-system
//查看pod资源,确保返回的信息都是running
//指定kubernetes集群的名称空间
只当完成命令返回的结果,如图:
(4)配置master节点与node节点将docker、kubelet服务加入开机自启
[root@master ~]# systemctl enable docker
[root@master ~]# systemctl enable kubelet
设置完成之后,建议重新启动进行测试!重新启动完成后再次查看群集节点的状态,确保还是Running状态,表示没有问题。