有关所有kubeadm命令行行信息,以及有关自动化kubeadm建议,请参考官网原文kubeadm参考。
准备
- 多台Ubuntu 16.04+、CentOS 7或HypriotOS v1.0.1 + 系统
- 每台机器最少1GB+内存
- 集群中所有机器之间网络连接正常
- 关闭所有节点防火墙,SELinux,SWAP(
swapoff -a
) - 所有节点安装配置成功 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=<ip-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。
遇到的问题
- 初始化的时候出现这个报错
[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
- 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 <none> 45h v1.15.0
k8s-node-2 Ready <none> 3h19m v1.15.0
网友评论