利用kubeadm安装centos7.4三节点K8S-1.11版本集群-详细安装过程记录

举报
张应罗 发表于 2018/12/22 19:21:37 2018/12/22
【摘要】 前言:三个节点的节点配置相关信息以及各个节点的Docker安装,见我的前两篇博客!下面开始正文。安装K8S集群及网络组件2.6.1安装前准备工作K8S官方安装文档建议每个节点在安装前都需要禁用SELINUXNote:Disabling SELinux by running setenforce 0 is required to allow containers to access the h...


前言:三个节点的节点配置相关信息以及各个节点的Docker安装,见我的前两篇博客!下面开始正文。


    1. 安装K8S集群及网络组件

2.6.1安装前准备工作

K8S官方安装文档建议每个节点在安装前都需要禁用SELINUX

Note:

  • Disabling SELinux by running setenforce 0 is required to allow containers to access the host filesystem, which is required by pod networks for example. You have to do this until SELinux support is improved in the kubelet.


Node1节点SELINUX已禁用!

2.6.2配置安装源-官方文档/阿里云源

cat 
<<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF
setenforce 
0


这里由于我们没法用京东云主机翻墙,因此我直接配置阿里的镜像安装K8S

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=1

repo_gpgcheck=1

gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

EOF

增加了kubernetes.repo



2.6.3安装K8S组件

#yum install -y kubelet kubeadm kubectl ipvsadm
#yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes (官方文档命令)


安装完成!

重启K8S相关服务

#systemctl enable kubelet && systemctl start kubelet


2.6.4配置相关参数

A:分别配置三台主机hosts文件解析

B:关闭系统swap分区(三节点全部操作)

# 临时关闭swap

# 永久关闭 注释/etc/fstab文件里swap相关的行

swapoff -a


这里解析下为什么要关闭系统的swap分区:

kubernetes的想法是将实例紧密包装到尽可能接近100%。 所有的部署应该与CPU /内存限制固定在一起。 所以如果调度程序发送一个pod到一台机器,它不应该使用交换。 设计者不想交换,因为它会减慢速度。所以关闭swap主要是为了性能考虑。当然为了一些节省资源的场景,比如运行容器数量较多,可添加kubelet参数 --fail-swap-on=false来解决。

C:开启forward(三节点全部操作)

 Docker从1.13版本开始调整了默认的防火墙规则

禁用了iptables filter表中FOWARD链

这样会引起Kubernetes集群中跨Node的Pod无法通信

# iptables -P FORWARD ACCEPT

D:配置相关转发参数(三节点全部操作)

在centos/redhat上可能会出现路由失败,因此需要做如下配置:

cat <<EOF >  /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

vm.swappiness=0

EOF

sysctl --system

E:配置pause镜像/cgroup等(三节点全部操作)

# 配置kubelet使用国内pause镜像
# 配置kubelet的cgroups
# 获取docker的cgroups
DOCKER_CGROUPS=$(docker info | grep 'Cgroup' | cut -d' ' -f3)
echo $DOCKER_CGROUPS
cat >/etc/sysconfig/kubelet<<EOF

KUBELET_EXTRA_ARGS="--cgroup-driver=$DOCKER_CGROUPS --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1"EOF
# 启动
systemctl daemon-reload

systemctl enable kubelet && systemctl restart kubelet


2.6.5初始化master节点

kubeadm init --kubernetes-version=v1.11.0 --pod-network-cidr=10.244.0.0/16


报错了,截图如下:

应该是无法直接从google拉取相关容器镜像,但是我应该配置过阿里的K8S镜像源了为啥还报错呢?(这里是个巨大的坑,最主要的原因是没有科学上网,后面自己做实验的小伙伴,要不想办法让你的环境科学上网,要不就自己把需要的镜像全部pull到本地节点,然后按照他们的要求用docker tag命令修改成他要求的格式image,后面我会继续遇到此类问题,请继续往下围观。。。)

解决办法:新建一个执行脚本,先把镜像下载下来后改名然后再做kubeadm初始化工作(脚本内容和脚本执行后的结果如下图,从脚本内容看,这个脚本也是网上的兄弟分享出来的,这位兄弟写的脚本也是从自己的私有镜像仓库里拉到本地节点,然后修改image的名称)

以上运行后发现还是有三个包无法下载下来,但是比第一次要少,第一次一共有7个image无法pull,前面有截图大家可以对比一下

备注:脚本内容有问题,最后三个包(k8s.gcr.io/pause:3.1; k8s.gcr.io/etcd-amd64:3.2.18 ;k8s.gcr.io/coredns:1.1.3)在脚本里的版本不一致,更换脚本内容如下:

重新执行脚本,截图如下:

再次开始初始化,前面是K8S版本号,后面是你POD 网络的 IP 段(为啥非得是这个网段?flannel网络默认?-确实是flannel网络默认的pod网络地址段

初始化成功!

最下面的这行kubeadm join,就是用来让别的node加入集群的,可以看出非常方便。我们要保存好这一行东西,这是我们之后让node加入集群的凭据,一会儿会用到。

kubeadm join 192.168.0.12:6443 --token m9t7wo.ut3wimfioutlvdmw --discovery-token-ca-cert-hash sha256:8d11ddabde6a0b597bae9e0df488b14101486c7406797b10716e3fd053a31920

这个时候,我们还不能通过kubectl来控制集群,要让kubectl可用(配置 kubectl认证信息),我们需要做: 


# 对于非root用户
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 对于root用户$ export KUBECONFIG=/etc/kubernetes/admin.conf
# 也可以直接放到~/.bash_profile(推荐用这个命令)
$ echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

2.6.6安装网络network add-on(flannel)

network addon必须在任何app部署之前安装好。同样的,kube-dns也会在network addon安装好之后才启动。kubeadm只支持CNI-based networks(不支持kubenet)。

比较常见的network addon有CalicoCanalFlannelKube-routerRomanaWeave Net等。这里我们使用Flannel

# 下载配置
mkdir flannel && cd flannel
wget  
# 修改配置yaml文件
# 此处的ip配置要与上面kubeadm的pod-network一致
  net-conf.json: |
    {      "Network": "10.244.0.0/16",      
              "Backend": {        
              "Type": "vxlan"
      }
    }
    # 修改镜像
    image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64
    # 如果Node有多个网卡的话,参考flannel issues 39701,
    # https://github.com/kubernetes/kubernetes/issues/39701
    # 目前需要在kube-flannel.yml中使用--iface参数指定集群主机内网网卡的名称,
    # 否则可能会出现dns无法解析。容器无法通信的情况,需要将kube-flannel.yml下载到本地,
    # flanneld启动参数加上--iface=<iface-name>
    containers:
      - name: kube-flannel
        image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64        
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        - --iface=eth1# 启动kubectl apply -f kube-flannel.yml# 查看kubectl get pods --namespace kube-system
kubectl get svc --namespace kube-system

创建flannel目录,并进入目录,利用wget下载flannelv0.10.0版本的yml文件,如下图:

执行kubectl apply -f kube-flannel.yml

# 查看
kubectl get pods --namespace kube-system
kubectl get svc --namespace kube-system

2.6.7配置节点加入集群

在其他两个节点输入我们之前在做kubeadm初始化的时候命令行给出的命令:

小技巧

忘记初始master节点时的node节点加入集群命令怎么办(master节点输入

# 简单方法
kubeadm token create --print-join-command
# 第二种方法token=$(kubeadm token generate)
kubeadm token create $token --print-join-command --ttl=0


查看节点状态

kubectl get node

 

接下来看我在安装flannel组件的时候踩过的坑,以及如何解决!!! 

2.6.8解决flannel报错问题

安装完flannel网络组件查看状态的时候发现有错误出现:导致我刚开始没发现,当在创建pod的时候,一直提示containercreating,容器创建中,始终无法创建成功!!!

进一步看看报错信息发现:

解决方案:

针对缺少k8s.gcr.io/kube-proxy-amd64:V1.11.0的解决方案思路是,从阿里云镜像服务市场内pull了一个V1.11.1的包,然后重新tag!

备注:第二行命令里面 k8s前面的“tag”多余了。

结果发现还是报错,原因是我实在找不到v1.11.0的包,用pull了一个v1.11.1d的image,最后无奈就又用tag命令把版本更换成v1.11.0后,再次

Kubectl describe pod –namespace=kube-system发现之前报错的两个节点的proxy服务正常!

但是flannel的组件在node2和node3仍然报错,之前我们查看过详细报错说是flannel的image已经在节点存在,于是我们就到node2和node3上分别重启了kubelet服务 systemctl restart kubelet后,全部正常:

至此 3节点的K8S集群+flannel安装完成。 


最后给大家分享一个学习k8s的视频网站,马哥的教程,我看了非常深入也成体系,讲解由浅入深,我觉得非常棒,解决了我很多在普通的文章里看不到的疑问!!!大家可以扫码学习,价格也不算贵!




【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200