博文大纲:
一、Kubernetes简介
二、kubeadm简介
三、环境准备
四、部署前准备
1)检查docker版本、关闭防火墙与SELinux、清空iptables规则,禁用Swap
2)配置免密登录、配置hosts文件以及yum源
3)打开iptables桥接及路由转发
五、部署kubernetes群集
1)编写下载镜像的脚本
2)下载部署kubernetes集群所需组件
3)初始化kubernetes集群
4)配置master节点状态
5)将node01、node02加入kubernetes群集中
6)部署后的优化操作
一、Kubernetes简介
Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化应用。Kubernetes的目标就是让部署容器化的应用简单并且高效。Kubernetes提供了应用部署、规划、更新、维护的一种机制。
Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行,管理员可以加载一个微型服务,让规划期来找到合适的位置,同时,Kubernetes也系统提升工具以及人性化方面,让用户能够方便的部署自己的应用。
本片博文主要介绍如何部署Kubernetes集群,想要对Kubernetes有更深入的了解请参考Kubernetes中文文档或Kubernetes官方网站
二、kubeadm简介
Kubeadm是Kubernetes官方提供的用于快速安装Kubernetes集群的工具,伴随着Kubernetes每个版本的发布都会同步更新,Kubeadmi可以学习到Kubernetes官方在集群配置上的一些最佳实践。
三、环境准备
没有部署docker环境的可以参考Docker简介及安装配置详解,因为以下环境必须使用docker环境!
基本环境:
硬件要求:
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.1.1 master\n192.168.1.2 node01\n192.168.1.3 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)编写下载镜像的脚本
由于其复杂性、易错性。所以本人特意提供脚本。
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.1.1:6443 --token t8z5r7.37p2ho7saq978ag4 \
--discovery-token-ca-cert-hash sha256:c62eaeb47c2bce30a1169304c46c31f49f76655998b153ab5bdf4daac976368a
//上面这条命令是用来其他节点加入到当前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.1.1:6443 --token t8z5r7.37p2ho7saq978ag4 \
--discovery-token-ca-cert-hash sha256:c62eaeb47c2bce30a1169304c46c31f49f76655998b153ab5bdf4daac976368a
[root@node02 ~]# kubeadm join 192.168.1.1:6443 --token t8z5r7.37p2ho7saq978ag4 \
--discovery-token-ca-cert-hash sha256:c62eaeb47c2bce30a1169304c46c31f49f76655998b153ab5bdf4daac976368a
//执行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状态,表示没有问题。
——————————本文到此结束,感谢阅读————————————
来源:51CTO
作者:筱振
链接:https://blog.51cto.com/14157628/2463901