一. 前言
官方提供了三种Kubernetes部署方式
1. minikube
Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用。不能用于生产环境。
2. kubeadm
Kubeadm是一个工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群
3. 二进制包
从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。
二. 环境要求
1.一台或多台机器,操作系统 CentOS7.x-86_x64
2. 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘20GB或更多
3. 集群中所有机器之间网络互通
4. 可以访问外网,需要拉取镜像
5. 禁止swap分区
三. kubeadm工具搭建
1. 设备准备
192.168.214.129 k8s-master (管理节点)
192.168.214.131 k8s-node (工作节点)
2. 环境准备
1)关闭防火墙(所有节点)
$ systemctl stop firewalld
$ systemctl disable firewalld
$ iptables -F
2)关闭swap(所有节点)
$ swapoff -a $ 临时
$ vim /etc/fstab $ 永久
$ sed -i 's/.*swap.*/#&/' /etc/fstab
ps: Swap是操作系统在内存吃紧的情况申请的虚拟内存,按照Kubernetes官网的说法,Swap会对Kubernetes的性能造成影响,不推荐使用Swap。
3)主机名配置(所有节点)
3. 安装docker(所有节点)
ps:Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。
##安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
##添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
##更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
sudo yum -y install epel-release
sudo yum -y install python-pip
sudo yum clean all
sudo pip install docker-compose
##开启Docker服务
sudo service docker start
##开机自启
systemctl enable docker
查看安装结果:docker info
ps:docker安装完后Cgroup Driver=cgroupfs和kubelet的Cgroup Driver=systemd不一致,需要修改docker的Cgroup Driver为systemd,修改如下:
sudo curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://b81aace9.m.daocloud.io
vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
重启docker查看结果:
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
docker info
4. 增加dns解析(所有节点)
echo nameserver 8.8.8.8 >> /etc/resolv.conf
systemctl restart network
5. 创建/etc/sysctl.d/k8s.conf文件(所有节点)
vi /etc/sysctl.d/k8s.conf
增加如下内容:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
使配置生效:
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
6. 配置国内数据源(所有节点)
yum install -y wget
mkdir /etc/yum.repos.d/bak && mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo
yum clean all && yum makecache
7. 配置国内Kubernetes数据源(所有节点)
cat <<EOF > /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
setenforce 0
8. 安装kubeadm,kubelet和kubectl(所有节点)
1)安装kubeadm,kubelet和kubectl
yum install -y kubelet kubeadm kubectl
2)启动kubectl
systemctl enable kubelet && systemctl start kubelet
9. 部署Kubernetes(master节点)
kubeadm init --kubernetes-version=v1.18.0 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.214.132 --ignore-preflight-errors=Swap
结果会报如下错误:
ps:由于是国外镜像,基本上无法下载对应的镜像包。仔细查看报错信息里面明确列出了安装需要用到的镜像名称和tag,那么我们只需要提前把这些镜像pull下来,再安装就ok了。
下载镜像:
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.18.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7
打成tag:
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.0 k8s.gcr.io/kube-apiserver:v1.18.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.18.0 k8s.gcr.io/kube-controller-manager:v1.18.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.0 k8s.gcr.io/kube-scheduler:v1.18.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.0 k8s.gcr.io/kube-proxy:v1.18.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7 k8s.gcr.io/coredns:1.6.7
再次执行:
kubeadm init --kubernetes-version=v1.18.0 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.214.132 --ignore-preflight-errors=Swap
结果如下(打印结果的最后一句kubeadm join在后面环节有用到):
10. 初始化k8s环境(master节点)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
11. flannel网络设置(master节点)
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
执行结果:
查看节点状态(master节点)
kubectl get node
结果:状态为NotReady(不正常)
再查看所有pod(master节点)
kubectl get pods --all-namespaces
结果:有两个节点为pending状态(不正常)
再查看日志(master节点)
journalctl -f -u kubelet.service
结果:网络错误(不正常)
回头想下刚才执行的kubectl apply -f kube-flannel.yml,其实是在下载flannel镜像。
因此查看下有没有flannel镜像
docker images|grep flannel
说明:镜像还在下载中,因此此处需要等待大概4到5分钟,之后再查看,发现主节点正常
12. node节点添加到master节点(node节点)
下载镜像:
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7
打成tag:
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.0 k8s.gcr.io/kube-proxy:v1.18.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7 k8s.gcr.io/coredns:1.6.7
执行第9步生成的添加语句:
kubeadm join 192.168.214.132:6443 --token 5cy1j4.y5kb1jgsn3rluejb \
--discovery-token-ca-cert-hash sha256:b7fc5e9a72ba34b00494600280c593a8828efb8be8d4dade6cbeba988c270bb2
结果:
在master上查看节点状态, 为NotReady
大概需要等待半分钟,再次查看