centos7下使用kubeadm部署k8s集群v1.15.0

centos7下使用kubeadm部署k8s集群v1.15.0

装了整整两天时间,被搞得快要放弃了,其实使用kubeadm安装时并不是特别复杂,但是由于qiang,总是出现一些意料之外的问题。加之对这个东西又是很不了解,所以只有一点点的解决问题。本人使用centos7 minimal版本,照这个步骤一步步安装,应该是没有问题的。

file

环境说明

准备三台虚拟机,并配置好静态ip、mac地址、ssh-key等内容,并根据下表配置/etc/hostname/etc/hosts

主机名ip备注
master192.168.52.181
node01192.168.52.182从1
node02192.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

k8s至少需要两核,并且2g内存才能保证稳定运行,请增加你的核心数。这里测试,内存增补增加不影响安装。

解决从k8s.gcr.io拉取镜像失败问题

参考https://blog.csdn.net/jinguangliu/article/details/82792617

file

执行此命令时卡壳,这是因为使用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

在执行 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

你会看到 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

在主节点上运行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

kube-system 命名空间中的pod

列出所有结点
kubectl get node

file

当前集群只有一个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.182192.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

当前集群状态为三个结点。

解决结点NotReady问题

集群结点STATUS为NotReady时,说明运行结点的Condition条件不满足,可以通过kubectl describe node 结点名称来查看原因,以master为例:

kubectl describe node master
# 查看conditions栏目

file

可以清除的看到,未准备好是因为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

问题解决

如果发现某个pod处于非running状态,如下:

file

解决办法如下:

可以通过命令kubectl describe kube-controller-manager-master --namespace kube-system查看错误日志,查看Events是否有错误日志,根据日志做出相应的修改操作:

file
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值