centos7下使用kubeadm部署k8s集群v1.15.0
装了整整两天时间,被搞得快要放弃了,其实使用kubeadm安装时并不是特别复杂,但是由于qiang,总是出现一些意料之外的问题。加之对这个东西又是很不了解,所以只有一点点的解决问题。本人使用centos7 minimal版本,照这个步骤一步步安装,应该是没有问题的。
![file](https://i-blog.csdnimg.cn/blog_migrate/bd63a21efcabf64539748f7345fa8e00.png)
环境说明
准备三台虚拟机,并配置好静态ip、mac地址、ssh-key等内容,并根据下表配置/etc/hostname
和/etc/hosts
:
主机名 | ip | 备注 |
---|---|---|
master | 192.168.52.181 | 主 |
node01 | 192.168.52.182 | 从1 |
node02 | 192.168.52.183 | 从2,dashboard |
先决条件
这些配置需要对所有机器应用
关闭防火墙
systemctl disable firewalld && systemctl stop firewalld
关闭selinux
docker需要关闭selinux才可正常使用。
临时禁用:
setenforce 0
永久关闭selinux:
# vi /etc/selinux/config, 将 SELINXU从enforcing更改为permissive
SELINUX=permissive
禁用交换分区
启动Kubernete必须禁用交换分区:
swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab
使用yum安装
所有机器都要安装这些工具
在Yum仓库中添加k8s
这些配置需要对所有机器应用
google官方
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=0
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
阿里云镜像
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=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
执行安装
配置完毕yum后,此时就可以安装k8s相关工具了:
- docker 容器运行时
- kubelet k8s结点的代理,负责接收master指派的各种任务
- kubeadm 用于部署k8s集群的工具
- kubectl k8s命令行交互工具
- kubernetes -cni k8s容器网络接口
开始安装
yum install -y docker kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0
# 不指定版本号则是安装最新版本
启动docker与kubelet服务
systemctl enable docker && systemctl start docker
systemctl enable kubelet && systemctl start kubelet
使用kubeadm配置主节点
kubeadm是非常方便的集群配置工具,只需要一个命令即可初始化主节点:
kubeadm init
至少需要两个cpu核心
如果你也在虚拟机中安装,并且你的cpu核心数设置为1,那么执行上述命令会出现:
![file](https://i-blog.csdnimg.cn/blog_migrate/45d25252fde6000285072b04588553f0.png)
k8s至少需要两核,并且2g内存才能保证稳定运行,请增加你的核心数。这里测试,内存增补增加不影响安装。
解决从k8s.gcr.io拉取镜像失败问题
参考:https://blog.csdn.net/jinguangliu/article/details/82792617
![file](https://i-blog.csdnimg.cn/blog_migrate/ef54d16fa4fbf6490380d13440487884.png)
执行此命令时卡壳,这是因为使用kubeadm安装集群时,将会把一些集群所必需的组件以docker容器的方式部署,但是k8s.gcr.io
在墙外。所以,会从k8s.gcr.io
中拉取一些镜像,可以使用kubeadm config images list
查看这些必需的镜像:
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
如果你有好的vpn,梯子是比较方便的解决办法。除此之外,docker.io仓库针对google的一些images做了镜像,我们也可以这样获取他们:
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
拉取镜像成功后,需要更改镜像名称,以让kubeadmin找到他们:
docker tag docker.io/mirrorgooglecontainers/kube-proxy:v1.15.0 k8s.gcr.io/kube-proxy:v1.15.0
docker tag docker.io/mirrorgooglecontainers/kube-scheduler:v1.15.0 k8s.gcr.io/kube-scheduler:v1.15.0
docker tag docker.io/mirrorgooglecontainers/kube-apiserver:v1.15.0 k8s.gcr.io/kube-apiserver:v1.15.0
docker tag docker.io/mirrorgooglecontainers/kube-controller-manager:v1.15.0 k8s.gcr.io/kube-controller-manager:v1.15.0
docker tag docker.io/mirrorgooglecontainers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
docker tag docker.io/mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag docker.io/coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
k8s 1.12 已经不需要指定平台了(amd64, arm, arm64, ppc64le or s390x)
docker拉取镜像仍然超时
Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 8.8.8.8:53: read udp 192.168.52.181:46815->8.8.8.8:53: i/o timeout
[root@localhost ~]# docker pull mirrorgooglecontainers/kube-controller-manager:v1.15.0
![file](https://i-blog.csdnimg.cn/blog_migrate/7c50e6f581b1a82fcbb1daee79a0aef3.png)
在执行 docker pull mirrorgooglecontainers/kube-apiserver:v1.15.0
时仍然下载不了,网上百度了挺久的,只有一篇文章有说解决方案:DNS解析失败,可以获取地址的ip并配置在hosts中即可。
笔者则是更改了DNS配置,我本来是配置的 8.8.8.8
,改为了114.114.114.114
就可以正常下载了。
导出与导入
下载太慢,所以我选择将这些镜像缓存到本地中:
docker save -o kube-proxy_v1.15.0.tar k8s.gcr.io/kube-proxy
docker save -o kube-apiserver_v1.15.0.tar k8s.gcr.io/kube-apiserver
docker save -o kube-controller-manager_v1.15.0.tar k8s.gcr.io/kube-controller-manager
docker save -o kube-scheduler_v1.15.0.tar k8s.gcr.io/kube-scheduler
docker save -o coredns_v1.3.1.tar k8s.gcr.io/coredns
docker save -o etcd_v3.3.10.tar k8s.gcr.io/etcd
docker save -o pause_v3.1.tar k8s.gcr.io/pause
下次使用时,可以使用docker命令导入:
#!/bin/bash
for f in `ls`
do
docker load -i $f
done
执行主节点初始化
这样就可以愉快的开始初始化了:
kubeadm init
执行失败
如果失败,重新执行需要先执行reset命令,意思是回到初始状态:
kubeadm reset
执行成功
![file](https://i-blog.csdnimg.cn/blog_migrate/ed8d0fef3ffec26b879375065122ace9.png)
你会看到 successfully,并且底部有一串命令,用于结点加入到master使用,不要忘记保存它:
kubeadm join 192.168.52.181:6443 --token f31npo.ur2aplgemqnrm79v \
--discovery-token-ca-cert-hash sha256:636b9eaedd7cf99465e3ea5c09eae5cacb252fafa21e297c3a2c75e3a6aec893
在node上可以执行
kubeadm reset
,将此node与master断开
查看运行的组件
使用docker ps 命令,可以看到,kubeadm将组件以容器的方式运行到了docker中,包括etcd服务器,schedule、controller manager。
docker ps
![file](https://i-blog.csdnimg.cn/blog_migrate/b1e23c9b7beb4cdeba83c2daa1840899.png)
在主节点上运行kubectl
kubectl是一款命令行交互工具,虽然在master节点上已经安装了kubectl,但是在未配置文件的情况下是无法启动的,所以需要为他指定配置文件kubeconfig
,通过KUBECONFIG
环境变量设置配置文件的位置,让kubectl使用它:
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
/etc/kubernetes/admin.conf 是提供的默认配置
如果你不是root用户,可以使用更改环境变量:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
列出所有pod
kubectl get po -n kube-system
![file](https://i-blog.csdnimg.cn/blog_migrate/8829541c6f2c8e232a6678eaecda19ab.png)
kube-system 命名空间中的pod
列出所有结点
kubectl get node
![file](https://i-blog.csdnimg.cn/blog_migrate/5163aa5dd5059f93f2209ca22352eeee.png)
当前集群只有一个master,并且状态为 NotReady 未准备好。NotReady代表结点运行的一些前提条件可能未被满足。
在从节点上运行kubectl
注意,从节点配置kubectl,需要将主节点的/etc/kubernetes/admin.conf
拷贝到各个服务器,并重新设置环境变量。
在master上执行:
scp /etc/kubernetes/admin.conf root@node01:/etc/kubernetes/
scp /etc/kubernetes/admin.conf root@node02:/etc/kubernetes/
然后添加环境变量即可:
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
配置node结点
加入到master中
在前面执行kubeadm init
结尾处,有告诉我们如何添加节点到集群中,直接执行他提供的命令,就可以把当前机器加入到集群中,我们将192.168.52.182
,192.168.52.183
加入到这个k8s集群中:
kubeadm join 192.168.52.181:6443 --token f31npo.ur2aplgemqnrm79v \
--discovery-token-ca-cert-hash sha256:636b9eaedd7cf99465e3ea5c09eae5cacb252fafa21e297c3a2c75e3a6aec893
添加镜像
从节点在构建时仍然需要从镜像仓库中下载镜相包,需要重复之前的步骤,将下面几个镜像包导入下载下来:
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
检查集群结点
加入成功后,可以通过kubectl get nodes
看到当前集群中的所有结点:
![file](https://i-blog.csdnimg.cn/blog_migrate/4498b819e43023682b86fd1415105585.png)
当前集群状态为三个结点。
解决结点NotReady问题
集群结点STATUS为NotReady时,说明运行结点的Condition条件不满足,可以通过kubectl describe node 结点名称
来查看原因,以master为例:
kubectl describe node master
# 查看conditions栏目
![file](https://i-blog.csdnimg.cn/blog_migrate/c41f8321ff3e79d2d9269f33b9ffb0ac.png)
可以清除的看到,未准备好是因为CNI插件(容器网络)没有准备好,需要部署CNI。
部署网络容器
现在有很多可用的k8s网络插件,这里以最简单的Weave Net为例,在三台机器上全都执行:
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
即可。
可以通过kubectl get po -A
,命令查看pod的状态:
![file](https://i-blog.csdnimg.cn/blog_migrate/0c386278a2e0379e725e5c6dc0ae94fb.png)
问题解决
如果发现某个pod处于非running状态,如下:
![file](https://i-blog.csdnimg.cn/blog_migrate/35dafd63cd99698242dcc78c0e19b8c6.png)
解决办法如下:
可以通过命令kubectl describe kube-controller-manager-master --namespace kube-system
查看错误日志,查看Events是否有错误日志,根据日志做出相应的修改操作:
![file](https://i-blog.csdnimg.cn/blog_migrate/18a4e9ac04a56e385c46abb5fb9884ca.png)