[TOC]
准备阶段 前期准备 准备至少2台机器 (我的是CentOS7 )
ip
hostname
role
192.168.200.139
master
主节点
192.168.200.140
node01
集群从节点
配置hosts文件
1 2 3 4 vim /etc/hosts 192.168.200.139 master 192.168.200.140 node01
设置2台机器的hostname
1 2 hostnamectl set-hostname master //在master上设置 hostnamectl set-hostname node01 //在node01上设置
关闭防火墙(在master和node01上执行)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 vim /etc/selinux/config SELINUX=disabled systemctl stop firewalld && systemctl disable firewalld setenforce 0 iptables -F vim /etc/fstab 注释掉swap那一行 swapoff -a 配置各节点系统内核参数使流过网桥的流量也进入iptables/netfilter框架中,在/etc/sysctl.conf中添加以下配置 net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 sysctl -p
设置yum源(在master和node01上都执行) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #换成阿里云镜像源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #使用阿里云docker镜像 cd /etc/yum.repo.d wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #设置国内加速的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
安装docker和kubeadm
1 2 3 yum install -y docker-ce kubelet kubeadm systemctl enable docker && systemctl start docker systemctl enable kubelet && systemctl start kubelet
注意一定要安装docker-ce 而且要定义好docker的repo源 , 如果只是简单的把CentOS的源替换成了阿里源 ,在执行yum install -y docker
的时候 下载的docker不是我们要的 ,用命令查看docker version
会发现docker的版本是1.13的 安装的时候要安装docker-ce yum install -y docker-ce
安装完成查看版本的话 显示的是”18.06.0-ce”
设置docker加速器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #方法1 清华大学的docker加速,感觉速度比阿里云的快 vim /etc/docker/daemon.json 请在该配置文件中加入(没有该文件的话,请先建一个): { "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] } #方法2 阿里云的加速 访问阿里云的加速网址 https://cr.console.aliyun.com/cn-hangzhou/mirrors 之后登陆自己的账号 点击左边的镜像加速器 就可以看到自己的私有加速地址 修改daemon配置文件/etc/docker/daemon.json来使用加速器 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://gekysrd8.mirror.aliyuncs.com"] } EOF systemctl daemon-reload systemctl restart docker
查看docker是否启动
编辑kubelet文件
在kubeadm初始化的时候可能会出现swap错误 v1.11.1其实已经不用再关swap了 以前的版本可能需要关闭 但是现在不需要了
1 2 3 4 vim /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS="--fail-swap-on=false" KUBE_PROXY_MODE=ipvs //启用ipvs 这种service模式这个只有在v1.11.1才能 v1.11.1以下的都不支持
提前准备拉去所需镜像 众所周知,因为被墙的关系所以kubeadm下载镜像的时候会出问题,这个就是比较头疼的了,
使用kubeadm init
之后会出现以下情况:
或者是这样的
可以看到发现以下情况:
使用的版本是v1.11.1
拉取镜像的各个版本也是v1.11.1 所以 当前kubernetes的版本和拉取镜像的版本要一致对应,高于或者低于当前kubernetes版本都不行
拉取镜像的地址是k8s.grc.io,其实就是在GCE上拉取的,如果没有外网是访问不了的
所以以上问题的出现都是由于不能访问外网,导致docker拉取镜像失败 , 所以我们可以先把需要的docker先拉取下来 , 这样kubeadm就可以正常运行了
kubernetes安装部署麻烦的情况是众所周知 , 所以已经有人开始做这样的事情了 , 就是做一个google的镜像站 , docker下载镜像的默认的地方是docker hub 在docker hub上做的做好的是mirrorgooglecontainers 里面需要的google容器镜像几乎都有,不过有些最新的还没有更新,待会我会和大家来讲解自己手动来获取最新的google容器镜像
运行kubeadm init
之后 不能获取的镜像已经在报错中列出来了 ,分别是:
1 2 3 4 5 6 7 failed to pull image [k8s.gcr.io/kube-apiserver-amd64:v1.11.1]: exit status 1 failed to pull image [k8s.gcr.io/kube-controller-manager-amd64:v1.11.1]: exit status 1 failed to pull image [k8s.gcr.io/kube-scheduler-amd64:v1.11.1]: exit status 1 failed to pull image [k8s.gcr.io/kube-proxy-amd64:v1.11.1]: exit status 1 failed to pull image [k8s.gcr.io/pause:3.1]: exit status 1 failed to pull image [k8s.gcr.io/etcd-amd64:3.2.18]: exit status 1 failed to pull image [k8s.gcr.io/coredns:1.1.3]: exit status 1
在master提前下好镜像 下一步我们就要来获取这些镜像 在master上编写个脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 vim get-k8s-containers.sh //编写脚本从dockerhub上获取这些镜像 #!/bin/bash docker pull coredns/coredns:1.1.3 docker tag coredns/coredns:1.1.3 k8s.gcr.io/coredns:1.1.3 docker rmi coredns/coredns:1.1.3 images=(kube-proxy-amd64:v1.11.1 kube-scheduler-amd64:v1.11.1 kube-controller-manager-amd64:v1.11.1 kube-apiserver-amd64:v1.11.1 etcd-amd64:3.2.18 pause-amd64:3.1 kubernetes-dashboard-amd64:v1.8.3 k8s-dns-sidecar-amd64:1.14.8 k8s-dns-kube-dns-amd64:1.14.8 k8s-dns-dnsmasq-nanny-amd64:1.14.8 pause:3.1) for imageName in ${images[@]} ; do docker pull mirrorgooglecontainers/$imageName docker tag mirrorgooglecontainers/$imageName k8s.gcr.io/$imageName docker rmi mirrorgooglecontainers/$imageName done
之后给脚本加权限
1 chmod +x get-k8s-containers.sh
之后运行脚本
在node01上提前下载好镜像 ,编写脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 vim get-k8s-node-images.sh #!/bin/bash docker pull haojianxun/flannel:v0.10.0-amd64 docker tag haojianxun/flannel:v0.10.0-amd64 quay.io/coreos/flannel:v0.10.0-amd64 docker rmi haojianxun/flannel:v0.10.0-amd64 images=(kube-proxy-amd64:v1.11.1 pause:3.1 etcd-amd64:3.2.18) for imageName in ${images[@]} ; do docker pull mirrorgooglecontainers/$imageName docker tag mirrorgooglecontainers/$imageName k8s.gcr.io/$imageName docker rmi mirrorgooglecontainers/$imageName done chmod +x get-k8s-node-images.sh //脚本加上执行权限 ./get-k8s-node-images.sh //运行脚本
初始化kubeadm 1 2 3 kubeadm init --kubernetes-version=v1.11.1 --pod-network-cidr=10.244.0.0/16 //如果要使用flannel网络插件,可以在初始化的时候就指定flannel网络地址 kubeadm init --kubernetes-version=v1.11.1 //不指定其他网络插件具体地址
稍等几分钟就可以看到
node01加入机器
列出集群状态
1 kubectl get nodes //在主节点上查看
可以看到status是NotReady状态 原因是没有安装cni网络插件
安装网络插件 方法1:安装flannel插件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 flannel官方的github地址是: https://github.com/coreos/flannel 对于Kubernetes v1.7以上的版本 都可以直接运行如下命令: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 之后运行命令 查看images是否running起来了 kubelet get pods -n kube-system -o wide 查看当前命名空间 kubelet get ns 查看集群是否起来了 kubelet get nodes //显示ready状态就是起来了 注意: 如果要开启flannel的directrouting功能的话 可以先wget下这个yaml文件 之后再修改配置 操作如下: 1.先下载yaml文件 wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 2.编辑刚刚下载好的文件 vim https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 找到如下片段: net-conf.json: | { "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan" } } 再原来基础上加上directrouting功能 ,修改完成之后应该是这样的: net-conf.json: | { "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan", "Directrouting": true } } 之后保存退出 之后再应用: https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 这样以后各个节点通信的话 就是通过物理网卡直接通信了 可以用ip route show 命令查看规则 , 在节点上用tcpdump -i ens32 -nn icmp 抓包看
方法2:安装weave网络插件
1 2 3 4 5 我们 选择weave 当然在初始化的时候没有指定特殊网络才行 kubectl apply -f https://git.io/weave-kube-1.6 之后运行kubectl get nodes即可看到是ready状态
稍等片刻 下载好之后 在master上执行如下命令, 可以查看是否集群已经起来了
1 2 kubectl get pod -n kube-system -o wide //都是running就是正常的 kubelet get nodes //可以看到master和node02都是ready状态
可能出现问题和解决方法 无法拉去k8s.gcr.io相关的镜像 方法1:http代理 最简单的解决方法是设置http代理
docker官方给出的设置http代理方法如下:
docker http_proxy
设置http代理的好处就是一劳永逸 , 不用再哭哈哈的编写脚本 ,提前拉去镜像 , 也不用再把墙外的google镜像拉到国内再下载 之后打tag
设置http代理之后就可以直接运行kubeadm了 其他一切都不需要额外设置
我们可以这样来设置http代理
1 2 3 4 5 6 7 8 9 10 11 12 13 1. vim /usr/lib/systemd/system/docker.service 在[Service]中添加如下信息 Environment="HTTP_PROXY=http:xxxxx:80" Environment="NO_PROXY=127.0.0.0/8,192.168.0.0/16" #这里的192.168.0.0/16是自己本地的网络,替换成自己的本地网络地址 #NO_PROXY的意思就是要走本地网络的就不需要来代理了,直接走本地网络即可 2. 编辑完成之后执行如下命令: systemctl daemon-reload systemctl start docker
可以用docker info查看具体信息 看看http_proxy有没有设置好, 当然如果是有公司的未批嗯的话最好,没有的话 可以google一个 由于敏感 这样就不放出来了 ,http代理网上一大堆 可以直接用搜索引擎找一个
下面列出几个比较好用的http代理网站
http://cn-proxy.com/archives/218
https://www.kuaidaili.com/free/intr/
http://www.66ip.cn/
http://www.xicidaili.com/
http://www.coobobo.com/
方法2:使用中转站来拉去镜像
一般来说 ,由于网络被墙 , 许多人开始做这个工作了 , 就是把google的相关镜像拉去到dockerhub上 , 之后我们在dockerhub上来下载所需的镜像 , 在安装特定的版本的时候会要求特定的镜像 , 这个时候可以去mirrorgooglecontainers 找 , 如果版本没有更新 ,可以试试以下方法:
首先 能科学上网 , 可以在自己浏览器的插件市场上下载一个 ,比如”谷歌访问助手” 等等 , 垃圾的也行 , 只要能访问外网就成 , 不要求网速.
在执行kubeadm init
的时候对于没有拉取下来的镜像,可以直接到k8s.gcr.io/google_containers 下载
启动控制台
以kube-apiserver-amd64为例子 ,搜索kube-apiserver-amd64
点击kube-apiserver-amd64 我们安装v1.11.1的 点击标记为v1.11.1的镜像
运行拉取命令
中转镜像 , 把镜像拉取出来传到dockerhub上自己的仓库 之后拉取push上的镜像
docker获取刚刚上传的镜像并打上k8s.gcr.io/的前缀tag
1 2 3 docker pull haojianxun/kube-apiserver-amd64:v1.11.1 docker images //列出刚刚下载的镜像 docker tag kube-apiserver-amd64:v1.11.1 k8s.gcr.io/kube-apiserver-amd64:v1.11.1
最后镜像下载完成
kubeadm init可能出现的报错 先去看kubeadm的帮助信息
1 kubeadm --help //这样会列出许多帮助信息
要想使用flannel网络,在初始化的时候就先指定网络
1 kubeadm init --kubernetes-version=v1.11.1 --pod-network-cidr=10.244.0.0/16
如果出现[ERROR Swap]
1 2 3 4 5 6 7 vim /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS="--fail-swap-on=false" 编辑完成之后在kubeadm init后面加个参数 kubeadm init --kubernetes-version=v1.11.1 --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors Swap