您当前的位置:首页 > 电脑百科 > 程序开发 > 容器

CentOS7 安装K8S的两种方案

时间:2020-08-13 13:58:47  来源:  作者:

最近在学习K8s的知识,从最原始的安装k8s集群开始。上一篇文章已经介绍了在VirtualBox下安装虚拟机和如何分配k8s集群的IP地址,这一章主要介绍在虚拟机上安装k8s的两种方法。

如何安装,遇到问题如何解决,在网上的一搜就大把资源,包括k8s官网,但是很多时候都不能解决问题,因为k8s的版本很多,从1.5.2到最新的1.18.6,安装的linux系统有Ubuntu,centos,Fedroa的等等,各种平台的问题不一样,解决方法也很多。

笔者经过一段时间的摸索,经过实践,总结出两种安装k8s集群的方法,供大家参考。

使用kubernetes-master和kubernetes-node的安装方法,简单便捷,缺点是安装的版本比较低,不是最新的,比如1.5.2。使用Docker镜像,安装和运行包括etcd,flannel,pause,kube-apiserver,controller-manager,scheduler等方法。能使用最新的,稳定的版本,比如1.18.6。

这两种方法都是选择CentOS7操作系统,原因有:

1.CentOS7和Fedora32稳定,可提供安装的软件稳定而且丰富。

2.CentOS8,Fedoar33经过尝试,k8s目前上没有稳定的安装包。

3.Ubuntu,对于承载集群服务,还是比不上CentOS。

k8s集群IP地址分配

可以参考笔者上一篇文章。

准备至少两个节点,一个是master,一个是node。在VirtualBox上安装CentOS7之后,分配几个IP地址:一个是Host-Only类型的IP地址,192.168.56.xx,这个是用来从host主机登陆到节点的地址;另外一个是internal network类型的IP地址,10.0.20.101,是用来配置k8s节点之间服务通信的地址。当然还有其他两类IP地址,比如NAT和Bridge地址,NAT地址对于所有VirtualBox的机器来说都是一个固定的地址10.0.2.15,不能用来配置k8s集群;Bridge地址随着接入网络(无线wifi,有线光线等)地址都不是固定的,所以最好不要用来配置k8s使用。

第一种安装k8s的方法:

使用kubernetes-master和kubernetes-node安装包,k8s的基础软件直接安装到虚拟机运行。但是目前只有1.5.2的版本安装是比较顺利的。最新的1.18.6与1.5.2比较的差别还是挺大的,不管从配置,使用都是有挺大的区别,笔者并不建议使用1.5的版本使用,用来学习的话,还是可以的。

k8s集群IP地址

主机名字 Host-Only地址 Internal Network地址

k8smaster 192.168.56.101 10.0.20.101

k8snode1 192.168.56.102 10.0.20.102

k8snode2 192.168.56.103 10.0.20.103

步骤一:系统基本配置

master和node节点都需要执行。

安装epel-release源

# yum -y install epel-release

所有机器关闭防火墙

# systemctl stop firewalld

# systemctl disable firewalld

# setenforce 0

步骤二:master节点安装配置

使用yum安装etcd、kubernetes-master

# yum -y install etcd kubernetes-master

配置文件vim /etc/etcd/etcd.conf

#[Member]

ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"

ETCD_NAME="default"

#[Clustering]

ETCD_ADVERTISE_CLIENT_URLS="http://192.168.56.101:2379"

配置文件vim /etc/kubernetes/apiserver

KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"

KUBE_API_PORT="--port=8080"

KUBELET_PORT="--kubelet-port=10250"

KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"

KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"

KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"

KUBE_API_ARGS=""

在etcd中定义flannel网络插件,以便k8s节点之间通信

# etcdctl mk /atomic.io/network/config '{"Network":"172.17.0.0/16"}'

启动etcd、kube-apiserver、kube-controller-manager、kube-scheduler并配置开机启动服务。

# for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do systemctl restart $SERVICES; done

# for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; systemctl enable $SERVICES; done

步骤三:node节点安装配置

# yum -y install flannel kubernetes-node

配置文件vim /etc/sysconfig/flanneld

FLANNEL_ETCD_ENDPOINTS="http://192.168.56.101:2379"

FLANNEL_ETCD_PREFIX="/atomic.io/network"

配置文件vim /etc/kubernetes/config

KUBE_LOGTOSTDERR="--logtostderr=true"

KUBE_LOG_LEVEL="--v=0"

KUBE_ALLOW_PRIV="--allow-privileged=false"

KUBE_MASTER="--master=http://192.168.56.101:8080"

配置文件vim /etc/kubernetes/kubelet

KUBELET_ADDRESS="--address=0.0.0.0"

KUBELET_PORT="--port=10250"

KUBELET_HOSTNAME="--hostname-override=192.168.56.102"

KUBELET_API_SERVER="--api-servers=http://192.168.56.101:8080"

KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

KUBELET_ARGS=""

启动kube-proxy,kubelet,docker,flanneld服务,并且配置开机启动服务。

# for SERVICES in kube-proxy kubelet docker flanneld;do systemctl restart $SERVICES; done

# for SERVICES in kube-proxy kubelet docker flanneld;do systemctl enable $SERVICES; done

到此,master和node节点全部配置完毕,在master上执行:

# kubectl get nodes

NAME STATUS AGE

192.168.56.102 Ready 21d

192.168.56.103 Ready 20d

# kubectl get cs

NAME STATUS MESSAGE ERROR

controller-manager Healthy ok

scheduler Healthy ok

etcd-0 Healthy {"health":"true"}

# kubectl get namespace

NAME STATUS AGE

default Active 21d

kube-system Active 21d

# kubectl version

Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2"}

Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2"}

# kubectl api-versions

Apps/v1beta1

authentication.k8s.io/v1beta1

authorization.k8s.io/v1beta1

autoscaling/v1

batch/v1

certificates.k8s.io/v1alpha1

extensions/v1beta1

policy/v1beta1

rbac.authorization.k8s.io/v1alpha1

storage.k8s.io/v1beta1

v1

第二种安装k8s的方法:

使用docker镜像安装,k8s的基础软件在docker容器中运行。支持最新的1.18.6的版本。

k8s集群IP地址

主机名字 Host-Only地址 Internal Network地址

k8smaster 192.168.56.110 10.0.20.110

k8snode1 192.168.56.111 10.0.20.111

步骤一:添加主机名字

# hostnamectl set-hostname master-node

# cat <<EOF>> /etc/hosts

10.0.20.110 k8smaster

10.0.20.111 k8snode1

EOF

步骤二:设置selinux和防火墙

# setenforce 0

# sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinu

# modprobe br_netfilter

# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables

# systemctl disable firewalld

# swapoff -a

# reboot

步骤三:设置k8s repo来源

# 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

repo_gpgcheck=0

EOF

步骤四:安装docker和kube软件

# yum install kubeadm docker -y

注意docker需用使用docker-ce版本

# systemctl enable kubelet

# systemctl start kubelet

# systemctl enable docker

# systemctl start docker

步骤五:下载docker镜像(master和node节点都要安装)

由于国内访问k8s.gcr.io的地址非常慢,所以需要手动下载docker的image,具体什么版本1.需要跟k8s的版本一致;2.需用从https://hub.docker.com/u/library查询。笔者整理好下面的命令:

# docker pull kubesphere/kube-apiserver:v1.18.6

# docker pull kubesphere/kube-controller-manager:v1.18.6

# docker pull kubesphere/kube-scheduler:v1.18.6

# docker pull kubesphere/kube-proxy:v1.18.6

# docker pull kubesphere/pause:3.2

# docker pull kubesphere/flannel:v0.12.0

# docker pull coreDNS/coredns:1.6.7

# docker pull azhu/etcd:3.4.3-0

下载完毕之后需要修改image的tag,让k8s认为本地的tag就是他需要安装的版本:

# docker tag docker.io/kubesphere/kube-proxy:v1.18.6 k8s.gcr.io/kube-proxy:v1.18.6

# docker tag docker.io/kubesphere/kube-apiserver:v1.18.6 k8s.gcr.io/kube-apiserver:v1.18.6

# docker tag docker.io/kubesphere/kube-controller-manager:v1.18.6 k8s.gcr.io/kube-controller-manager:v1.18.6

# docker tag docker.io/kubesphere/kube-scheduler:v1.18.6 k8s.gcr.io/kube-scheduler:v1.18.6

# docker tag docker.io/kubesphere/pause:3.2 k8s.gcr.io/pause:3.2

# docker tag docker.io/kubesphere/flannel:v0.12.0 k8s.gcr.io/flannel:v0.12.0

# docker tag docker.io/coredns/coredns:1.6.7 k8s.gcr.io/coredns:1.6.7

# docker tag docker.io/azhu/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0

步骤六:初始化kube

# kubeadm init --control-plane-endpoint=10.0.20.110 --apiserver-advertise-address=10.0.20.110

这里需要指定Internal Network IP地址,否则会使用默认的NAT的地址。

当初始化完成之后,会得到下面的信息:

To start using your cluster, you need to run the following 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:

https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of control-plane nodes by copying certificate authorities

and service account keys on each node and then running the following as root:

kubeadm join 10.0.20.110:6443 --token bzy0jj.nkwctwqmroxh08zu

--discovery-token-ca-cert-hash sha256:6c0b3db060415f15c82b7f3c8948519d93708d60a46c1903c0bb11ac04ba17cf

--control-plane

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.0.20.110:6443 --token bzy0jj.nkwctwqmroxh08zu --discovery-token-ca-cert-hash sha256:6c0b3db060415f15c82b7f3c8948519d93708d60a46c1903c0bb11ac04ba17cf

意思是:

一要准备网络插件,否则node的状态不是ready的。

二是可以通过kebeadm join 加入control-plane和worker node。笔者只有一个control-plane,但是可以有多个worker node节点加入到集群。

三是需要将admin.conf copy到本用户的配置目录,以便使用kubectl命令时候知道服务地址。

su切换到root用户(其实我全程都是用root操作),并而执行:

# mkdir -p $HOME/.kube

# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# chown $(id -u):$(id -g) $HOME/.kube/config

验证一下get node命令:

# kubectl get nodes

NAME STATUS ROLES AGE VERSION

k8smaster NotReady master 33h v1.18.6

NotReady是因为网络插件没有安装的原因。

配置内部通信 flannel 网络(master和node都要配)

先配置内部通信 flannel 网络:

# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

确保kubeadm.conf中的podsubnet的地址和kube-flannel.yml中的网络配置一样

加载配置文件:

# kubectl apply -f kube-flannel.yml

成功之后 kubectl get nodes的状态会变成ready。

当然网络插件可以使用其他的,比如Weavenet插件,不过笔者试过是不太好用,还是flannel插件好用。

Weavenet插件的安装:(不推荐)

# export kubever=$(kubectl version | base64 | tr -d 'n')

# kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"

到此,k8s的master节点已经配置完毕,接下来是配置worker node节点。

步骤七: 配置node节点

k8s worker节点的配置步骤跟master的步骤一到五都是一样的,并而第六步的网络插件也一样。

在worker节点上执行:

# kubeadm join 10.0.20.110:6443 --token bzy0jj.nkwctwqmroxh08zu --discovery-token-ca-cert-hash sha256:6c0b3db060415f15c82b7f3c8948519d93708d60a46c1903c0bb11ac04ba17cf

在master上执行:

# kubectl get nodes

NAME STATUS ROLES AGE VERSION

k8smaster Ready master 34h v1.18.6

k8snode1 Ready <none> 33h v1.18.6

可以看出两个节点的状态都已经ready了。

使用docker ps -a | grep Up 命令分别在两个节点上运行,可以看出启动的k8s服务的pod:

在master上运行的pod有:kube-proxy,kube-scheduler,kube-controller-manager,kube-apiserver,etcd,flannel

在node上运行的pod有:kube-proxy,flannel

继续查看其他状态和数据:

# kubectl get cs

NAME STATUS MESSAGE ERROR

controller-manager Unhealthy Get http://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252: connect: connection refused

scheduler Unhealthy Get http://127.0.0.1:10251/healthz: dial tcp 127.0.0.1:10251: connect: connection refused

etcd-0 Healthy {"health":"true"}

controller-manager和scheduler 的Unhealthy状态,后续再跟进。估计是配置不正确导致的。

# kubectl get namespace

NAME STATUS AGE

default Active 2d9h

kube-node-lease Active 2d9h

kube-public Active 2d9h

kube-system Active 2d9h

# kubectl version

Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.6"}

Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.6"}

# kubectl api-versions

admissionregistration.k8s.io/v1

admissionregistration.k8s.io/v1beta1

apiextensions.k8s.io/v1

apiextensions.k8s.io/v1beta1

apiregistration.k8s.io/v1

apiregistration.k8s.io/v1beta1

apps/v1

authentication.k8s.io/v1

authentication.k8s.io/v1beta1

authorization.k8s.io/v1

authorization.k8s.io/v1beta1

autoscaling/v1

autoscaling/v2beta1

autoscaling/v2beta2

batch/v1

batch/v1beta1

certificates.k8s.io/v1beta1

coordination.k8s.io/v1

coordination.k8s.io/v1beta1

discovery.k8s.io/v1beta1

events.k8s.io/v1beta1

extensions/v1beta1

networking.k8s.io/v1

networking.k8s.io/v1beta1

node.k8s.io/v1beta1

policy/v1beta1

rbac.authorization.k8s.io/v1

rbac.authorization.k8s.io/v1beta1

scheduling.k8s.io/v1

scheduling.k8s.io/v1beta1

storage.k8s.io/v1

storage.k8s.io/v1beta1



Tags:安装K8S   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
最近在学习K8s的知识,从最原始的安装k8s集群开始。上一篇文章已经介绍了在VirtualBox下安装虚拟机和如何分配k8s集群的IP地址,这一章主要介绍在虚拟机上安装k8s的两种方法。如...【详细内容】
2020-08-13  Tags: 安装K8S  点击:(112)  评论:(0)  加入收藏
▌简易百科推荐
一、为什么要搭建主从架构呢1.数据安全,可以进行数据的备份。2.读写分离,大部分的业务系统来说都是读数据多,写数据少,当访问压力过大时,可以把读请求给到从服务器。从而缓解数据...【详细内容】
2021-12-15  实战Java    Tags:Docker   点击:(10)  评论:(0)  加入收藏
在网页中渲染公式一直是泛学术工具绕不开的一个功能,最近更新产品功能,正巧遇到了这个需求,于是使用容器方式简单实现了一个相对靠谱的公式渲染服务。分享出来,希望能够帮到有类...【详细内容】
2021-12-01  编程菌zfn    Tags:Docker   点击:(10)  评论:(0)  加入收藏
1.1 docker命令直接部署1.1.1 拉取镜像docker pull wurstmeister/zookeeperdocker pull wurstmeister/kafka1.1.2 启动zookeeper容器docker run -d --name myzookeeper -p 2...【详细内容】
2021-11-15  无    Tags:docker   点击:(47)  评论:(0)  加入收藏
01 前言 顺着docker的发展,很多测试的同学也已经在测试工作上使用docker作为环境基础去进行一些自动化测试,这篇文章主要讲述我们在docker中使用浏览器进行自动化测试如果可以...【详细内容】
2021-10-29  小码哥聊软件测试    Tags:Docker   点击:(42)  评论:(0)  加入收藏
因为你懂得的原因,下载docker镜像速度非常喜感,故收集几个国内常用的docker镜像。Docker中国区官方镜像地址:https://registry.docker-cn.com网易163的镜像http://hub-mirror.c...【详细内容】
2021-10-28  抓蛙程序猿    Tags:docker   点击:(48)  评论:(0)  加入收藏
环境:Spring5.3.10通常,应用程序开发人员不需要对ApplicationContext实现类进行子类化。相反,SpringIOC容器可以通过插入特殊集成接口的实现来扩展。使用BeanPostProcessor自定...【详细内容】
2021-10-26  Java网络研发架构师    Tags:Spring   点击:(33)  评论:(0)  加入收藏
我们在很多场景下都需要做笔记,来对抗遗忘,一份好的笔记不仅能在需要的时候供我们查阅,也能帮助我们归纳整理知识提高做事效率。 目前市面上有很多云笔记软件,体验上各有不同,但...【详细内容】
2021-10-11  运维贼船    Tags:docker   点击:(61)  评论:(0)  加入收藏
1. Nacos官网Nacos Docker 快速开始2. Clone 项目git clone https://github.com/nacos-group/nacos-docker.git3. cd 到nacos-docker 路径下 直接启动即可cd nacos-dockerdo...【详细内容】
2021-09-16  程序狗爱化妆    Tags:Nacos   点击:(109)  评论:(0)  加入收藏
今天不做保姆级教程,分享奶爸常用、好用的Docker应用。有了这些Docker,Nas的可玩性会大幅提高,有时候奶爸也在想,刨去官方套件不考虑的话,Nas真的是差不多。如果小伙伴们有需要,后...【详细内容】
2021-09-03  晋升奶爸的垃圾佬    Tags:Docker   点击:(167)  评论:(0)  加入收藏
环境要求 ubuntu系统:20.04 docker版本:20.10.7 redis版本:6.0.6步骤由于我这里已经有相应的redis镜像,这里就不记录了,关于docker一些基础知识可以看我以前的笔记开启3台re...【详细内容】
2021-07-26  石老师小跟班    Tags:Redis主从复制   点击:(117)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条