用kubeadm安装Kubernetes1.15.0

有关所有kubeadm命令行行信息,以及有关自动化kubeadm建议,请参考官网原文kubeadm参考。
准备

  1. 多台Ubuntu 16.04+、CentOS 7或HypriotOS v1.0.1 + 系统
  2. 每台机器最少1GB+内存
  3. 集群中所有机器之间网络连接正常
  4. 关闭所有节点防火墙,SELinux,SWAP(swapoff -a)
  5. 所有节点安装配置成功 docker,kubelet, kubeadm, kubectl
本教程使用3台ubuntu16.04虚拟机
  • 192.168.1.11 k8s-master
  • 192.168.1.12 k8s-node1
  • 192.168.1.13 k8s-node2
    每台虚拟机都需要配置host
    配置hosts
cat > /etc/hosts << EOF 127.0.0.1 localhost 10.10.31.202 k8s-master 10.10.31.203 k8s-node1 10.10.31.204 k8s-node2 EOF

目标
  • 在您的机器上安装一个安全的Kubernetes集群
  • 在群集上安装pod网络,以便应用组件(pod)可以相互通信
  • 在集群上安装一个微服务应用示例
步骤 一、在主机上安装kubeadm 添加阿里云源地址到配置文件sudo vi /etc/apt/sources.list,在文件末尾添加:
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
执行以下命令:
sudo apt-get update sudo apt-get install kubelet kubeadm kubectl

二、初始化 master master 是控制组件运行的机器,包括etcd和API Server等(使用kubectl CLI与之通信启动)。
选择 k8s-master 主机,运行以下命令来初始化 master (国内无法下载镜像,在执行此命令前先参考下边问题1解决方案,手动下载所需镜像):
kubeadm init --pod-network-cidr=10.244.0.0/16

注意
  • 因为后边选用 flannel 作为 pod网络插件,所以此处必须 有 --pod-network-cidr=10.244.0.0/16
  • 这将自动检测网络接口,并且将master节点上网卡设备设置成默认网关。如果要使用其他网卡设备,请执行kubeadm init命令增加--apiserver-advertise-address=参数
kubeadm init命令执行完后需要几分钟时间下载集群控制组件。
若要重新执行 kubeadm init 命令,需要先撤消kubeadm所做的事情参考此教程参考此教程
输出如下所示:
Your Kubernetes master has initialized successfully!To start using your cluster, you need to run (as a regular user):mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/configYou should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: http://kubernetes.io/docs/admin/addons/You can now join any number of machines by running the following on each node as root:kubeadm join 192.168.1.11:6443 --token 95nsez.dfn1qqcpuii09w08 \ --discovery-token-ca-cert-hash sha256:997c2eb70158ed44894c7430a1f7391117bfcc3092e71115bccb3e4c3cc10731

创建 kubeadm init 输出的 kubeadm join 命令需要保存下来,后边使用此命令添加节点。
token用于master节点和 joining nodes之间的相互认证。这里包含的token是secret,保证安全——通过token参数可以确保将被授权的节点添加到kubernetes集群中。可以使用kubeadm token命令listed、created和deleted这些token。
遇到的问题
  1. 初始化的时候出现这个报错
[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver:v1.14.0: output: Trying to pull repository k8s.gcr.io/kube-apiserver ... Get https://k8s.gcr.io/v1/_ping: dial tcp 64.233.189.82:443: i/o timeout , error: exit status 1

下载这些镜像需要翻墙
k8s.gcr.io/kube-apiserver:v1.15.0
k8s.gcr.io/kube-controller-manager:v1.15.0
k8s.gcr.io/kube-scheduler:v1.15.0
k8s.gcr.io/kube-proxy:v1.15.0
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1
【用kubeadm安装Kubernetes1.15.0】解决方案:可以使用 docker pull 从 docker 官方镜像库下载
docker pull mirrorgooglecontainers/kube-apiserver:v1.15.0 docker pull mirrorgooglecontainers/kube-controller-manager:v1.15.0 docker pull mirrorgooglecontainers/kube-scheduler:v1.15.0 docker pull mirrorgooglecontainers/kube-proxy:v1.15.0 docker pull mirrorgooglecontainers/pause:3.1 docker pull mirrorgooglecontainers/etcd:3.3.10 docker pull coredns/coredns:1.3.1

然后使用 docker tag 重新标记
docker tag mirrorgooglecontainers/kube-apiserver:v1.15.0 k8s.gcr.io/kube-apiserver:v1.15.0 docker tag mirrorgooglecontainers/kube-controller-manager:v1.15.0 k8s.gcr.io/kube-controller-manager:v1.15.0 docker tag mirrorgooglecontainers/kube-scheduler:v1.15.0 k8s.gcr.io/kube-scheduler:v1.15.0 docker tag mirrorgooglecontainers/kube-proxy:v1.15.0 k8s.gcr.io/kube-proxy:v1.15.0 docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1 docker tag mirrorgooglecontainers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10 docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1

  1. corednspods有 CrashLoopBackOff 或者 Error(推荐使用解决方案二),执行命令 kubectl get pods -n kube-system,输出
NAMEREADYSTATUSRESTARTSAGE calico-node-lflwx2/2Running02d coredns-576cbf47c7-nm7gc0/1CrashLoopBackOff692d coredns-576cbf47c7-nwcnx0/1CrashLoopBackOff692d etcd-suey.nknwn.local1/1Running02d kube-apiserver-suey.nknwn.local1/1Running02d kube-controller-manager-suey.nknwn.local1/1Running02d kube-proxy-xkgdr1/1Running02d kube-scheduler-suey.nknwn.local1/1Running02d

执行命令kubectl -n kube-system logs -f coredns-576cbf47c7-nm7gc,输出
2018/11/05 04:04:18 [INFO] CoreDNS-1.2.2 2018/11/05 04:04:18 [INFO] linux/amd64, go1.11, eb51e8b CoreDNS-1.2.2 linux/amd64, go1.11, eb51e8b 2018/11/05 04:04:18 [INFO] plugin/reload: Running configuration MD5 = f65c4821c8a9b7b5eb30fa4fbc167769 2018/11/05 04:04:24 [FATAL] plugin/loop: Seen "HINFO IN 6900627972087569316.7905576541070882081." more than twice, loop detected #

解决方案一:参考https://stackoverflow.com/questions/53075796/coredns-pods-have-crashloopbackoff-or-error-state
禁用CoreDNS循环检测,编辑CoreDNS配置映射:
kubectl -n kube-system edit configmap coredns
删除或注释掉该行loop,保存并退出。
然后删除 CoreDNS ,以便可以使用新配置创建新窗格:
kubectl -n kube-system delete pod -l k8s-app=kube-dns
解决方案二:
找到原因当部署在Kubernetes中的CoreDNS Pod检测到循环时,CoreDNS Pod将开始“CrashLoopBackOff”。这是因为每当CoreDNS检测到循环并退出时,Kubernetes将尝试重新启动Pod。
找到宿主机 /etc/resolv.conf 里面的文件
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) #DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN nameserver 127.0.1.1

发现那么sever 127.0.1.1是指向本地,修改文件为
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) #DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN #nameserver 127.0.1.1 nameserver 8.8.8.8 nameserver 114.114.114.114

然后重启服务
三、安装pod网络 pod网络插件是必要安装,以便pod可以相互通信。
在部署应用和启动kube-dns之前,需要部署网络,kubeadm仅支持CNI的网络(不支持kubenet)。
网络插件完整列表,请参考 add-ons page。
本教程选用 flannel 作为 pod网络插件
使用以下命令安装pod网络插件:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

注意:每个集群只能安装一种 pod网络。
四、添加工作节点 登录到 k8s-node1 主机,参考步骤2,手动下载镜像
mirrorgooglecontainers/kube-proxy
mirrorgooglecontainers/pause
运行步骤2中输出的命令
kubeadm join 192.168.1.11:6443 --token 95nsez.dfn1qqcpuii09w08 --discovery-token-ca-cert-hash sha256:997c2eb70158ed44894c7430a1f7391117bfcc3092e71115bccb3e4c3cc10731

成功后输出:
Node join complete: * Certificate signing request sent to master and response received. * Kubelet informed of new secure connection details.Run 'kubectl get nodes' on the master to see this machine join.

之后,在master节点上运行 kubectl get nodes 命令,会显示所有已添加到集群中的节点主机。
NAMESTATUSROLESAGEVERSION k8s-masterReadymaster46hv1.15.0 k8s-node-1Ready45hv1.15.0 k8s-node-2Ready3h19mv1.15.0

    推荐阅读