用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/config

You 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

解决方案:可以使用 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,输出
NAME                                       READY   STATUS             RESTARTS   AGE
calico-node-lflwx                          2/2     Running            0          2d
coredns-576cbf47c7-nm7gc                   0/1     CrashLoopBackOff   69         2d
coredns-576cbf47c7-nwcnx                   0/1     CrashLoopBackOff   69         2d
etcd-suey.nknwn.local                      1/1     Running            0          2d
kube-apiserver-suey.nknwn.local            1/1     Running            0          2d
kube-controller-manager-suey.nknwn.local   1/1     Running            0          2d
kube-proxy-xkgdr                           1/1     Running            0          2d
kube-scheduler-suey.nknwn.local            1/1     Running            0          2d

执行命令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 命令,会显示所有已添加到集群中的节点主机。

NAME         STATUS   ROLES    AGE     VERSION
k8s-master   Ready    master   46h     v1.15.0
k8s-node-1   Ready       45h     v1.15.0
k8s-node-2   Ready       3h19m   v1.15.0

你可能感兴趣的:(用kubeadm安装Kubernetes1.15.0)