博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
容器化弹性伸缩集群:kuberntes环境构建
阅读量:7221 次
发布时间:2019-06-29

本文共 8571 字,大约阅读时间需要 28 分钟。

hot3.png

#容器化弹性伸缩集群:kuberntes环境构建

1. 简介

redhat 在今年9月份发布了k8s 和 etcd 的yum 源(redhat 7),我们下面都是基于redhat 7操作系统以yum来构建k8s集群,你也可以到github 下载kubernetes 进行安装部署

下面是k8s集群架构

kubernetes 架构

kubernetes 架构

2. 集群架构部署

基本信息

#服务器分配192.168.9.155 kubem  #k8s master192.168.9.7   kubes1 #k8s minion1192.168.9.6   kubes2 #k8s minion2192.168.9.209 etcd   #etcd#版本选择etcd v2.1.1kubernetes  v1.0.3

2.1 etcd 安装配置(etcd)

安装etcd
yum install etcd -y
配置 etcd配置文件

这里我直接使用脚本进行替换配置,也可以手工修改,主要是配置etcd地址,这里主要做演示,就不搭建etcd集群了,如果搭建etcd集群可以参考.

注意:这里的ip变量,因为我的地址是192网段, 所以我这里简单点直接grep 192来过滤

ip=`ifconfig | grep inet | awk '{print $2}' | grep 192`echo ''>/etc/etcd/etcd.confcat >/etc/etcd/etcd.conf <
配置etcd 启动
systemctl enable etcdsystemctl start etcd

2.2 kube master 安装配置(kubem)

安装 k8s master
yum install kubernetes-master -y
配置 master默认配置
mkdir /etc/systemd/system/kube-apiserver.service.dcat >/etc/systemd/system/kube-apiserver.service.d/10-varrun-build.conf <
/etc/kubernetes/apiservercat >/etc/kubernetes/apiserver <
/etc/kubernetes/controller-manager cat >/etc/kubernetes/controller-manager <
/etc/kubernetes/config cat >/etc/kubernetes/config <
配置k8s master 启动
systemctl enable kube-apiserver kube-scheduler kube-controller-managersystemctl restart kube-apiserver kube-scheduler kube-controller-manager

2.3 kube minion 安装配置(minion1,minion2)

安装 k8s minion + docker(注意k8s 2个节点都需要同样配置)
yum install kubernetes-node  docker   -y
配置 k8s minion配置文件
#注意:这里配置k8s master 地址,请替换自己的k8s master 地址kube_master='192.168.9.155'#注意: 同样注意这里的 grep 192,原因见上面ip=`ifconfig | grep inet | grep 192 | awk '{print $2}'`#配置 config和kubeletecho ''>/etc/kubernetes/configcat >/etc/kubernetes/config <
/etc/kubernetes/kubelet cat >/etc/kubernetes/kubelet <
启动k8s minion + docker
systemctl enable kubelet kube-proxy dockersystemctl start docker kubelet kube-proxy

到此我们k8s集群搭建完成了,我们可以使用如下命令在k8s master执行获取nodes信息

[root@kubem py]# kubectl get nodesNAME           LABELS                                STATUS192.168.9.6    kubernetes.io/hostname=192.168.9.6    Ready192.168.9.7    kubernetes.io/hostname=192.168.9.7    Ready

2.4 使用工具quagga 配置容器间网络互通

从前面k8s集群搭建,你会看到网上搜索的k8s集群搭建容器网络互通大部分都基于flannel 来做,但这里我们使用quagga 来实现容器互通,使用quagga来做主要是觉得目前flannel通过端口转发方式实现容器互通,从性能上来看还不太理想,同时flannel本身还不够稳定,quagga的配置步奏如下:

安装brctl工具
yum install -y bridge-utils.x86_64
删除默认的docker0 网卡,并创建新的网卡kbr0
brctl addbr kbr0ip link set dev docker0 downip link del dev docker0
配置kbr0 IP(我们写入一个配置文件到操作系统的网络配置目录)

这里注意:每个minion 节点配置不同的IPADDR,假设minion1 为172.11.11.1 ,则可以配置minion2为172.12.12.1,同时更改网关同步配置

cat >/etc/sysconfig/network-scripts/ifcfg-kbr0 <
更改docker默认参数配置,让docker默认使用kbr0网卡
sed -i 's/selinux-enabled/selinux-enabled -b=kbr0/' /etc/sysconfig/docker
重启network和docker

注意:如果重启network 没有加载kbr0,则需要重启操作系统

systemctl restart network.service docker.sersvice
这里有网友直接将quagga 配置好并打包为docker image,我们直接拿来使用,我们也可以自行在宿主机上安装quagga
docker pull index.alauda.cn/georce/router#配置--restart=always 是为了让系统每次重启,docker daemon启动后自动启动该容器docker run -itd --name=router  --restart=always --privileged --net=host index.alauda.cn/georce/router
等待几秒钟,我们通过以下命令查看,可以看到route自动更新了

注意: 如果你执行命令route -n没有发现更新,你可以尝试stop 系统防火墙,再执行命令查看

[root@kubem py]# route -n172.11.11.0     192.168.9.7     255.255.255.0   UG    2      0        0 enp0s8172.13.13.0     192.168.9.6     255.255.255.0   UG    2      0        0 enp0s8172.15.15.0     0.0.0.0         255.255.255.0   U     425    0        0 kbr0172.16.16.0     192.168.9.209   255.255.255.0   UG    2      0        0 enp0s8172.17.17.0     192.168.9.5     255.255.255.0   UG    2      0        0 enp0s8172.18.18.0     192.168.9.8     255.255.255.0   UG    2      0        0 enp0s8172.19.19.0     192.168.9.51    255.255.255.0   UG    2      0        0 enp0s8#ping其他容器地址[root@kubem py]# ping 172.13.13.8PING 172.13.13.8 (172.13.13.8) 56(84) bytes of data.64 bytes from 172.13.13.8: icmp_seq=1 ttl=63 time=1.11 ms64 bytes from 172.13.13.8: icmp_seq=2 ttl=63 time=0.902 ms64 bytes from 172.13.13.8: icmp_seq=3 ttl=63 time=0.824 ms64 bytes from 172.13.13.8: icmp_seq=4 ttl=63 time=0.772 ms64 bytes from 172.13.13.8: icmp_seq=5 ttl=63 time=0.888 m

3. kube-ui 安装

kubernetes 自带了一个kube-ui,用来展示kubernetes 集群状态,目前kube-ui 还比较简单,只展现了kube 节点资源使用率,rc,service,pod ,nodes 情况,默认情况下安装kubernetes 集群是没有安装kube-ui的,需要我们手工安装

注意:在安装kube-ui 之前,你需要把kube master服务器与其他kube minon 容器大二层网络互通,直接办法就是前面讲到的使用工具quagga 配置容器间网络互通这一节的流程在kube master 服务器上执行一次,可以在kube master上配置一个网卡kbr0 ,网络配置也跟其他minion节点容器网络相同域,让kube master 也能访问到kube minion 容器网络,否则kube-ui 安装好后会报无法访问minion pod地址

#####安装配置准备工作

kube-ui的docker image是在google gcr中,由于众所周知的原因,我们在国内无法访问到这个源,这里我将源下载下来放到百度云盘中,我们可以将此image 下载下来后通过docker load 命令进行导入到kube minion或者私有仓库中.

同时我们要用到3个文件 分别是kube-ui rc ,svc,kube-system,这3个文件,rc和service 在kubernetes 安装包kubernetes\cluster\addons\kube-ui路径下,你可以从github下载kubernetes 获取这2个文件,kube-system 文件需要你自己定义构建,由于kubernetes 完整安装包非常大,我这里直接将这3个文件内容展示,你可以直接复制内容命名一个文件名称使用kubectl create -f 进行创建,同时这里我将kubernetes 1.1版本直接搬到了百度云上,有需要可以下载:

下面是kube-ui rc,svc 和kube-system 内容,创建的顺序是kube-system-->kube-ui-rc-->kube-ui-svc

kube-system.yaml

{  "kind": "Namespace",  "apiVersion": "v1",  "metadata": {    "name": "kube-system"  }}

kube-ui-rc.yaml

apiVersion: v1kind: ReplicationControllermetadata:  name: kube-ui-v2  namespace: kube-system  labels:    k8s-app: kube-ui    version: v2    kubernetes.io/cluster-service: "true"spec:  replicas: 2  selector:    k8s-app: kube-ui    version: v2  template:    metadata:      labels:        k8s-app: kube-ui        version: v2        kubernetes.io/cluster-service: "true"    spec:      containers:      - name: kube-ui        image: gcr.io/google_containers/kube-ui:v2        resources:          limits:            cpu: 200m            memory: 200Mi        ports:        - containerPort: 8080        livenessProbe:          httpGet:            path: /            port: 8080          initialDelaySeconds: 30          timeoutSeconds: 5

kube-ui-svc.yaml

apiVersion: v1	kind: Service	metadata:	  name: kube-ui	  namespace: kube-system	  labels:	    k8s-app: kube-ui	    kubernetes.io/cluster-service: "true"	    kubernetes.io/name: "KubeUI"	spec:	  selector:	    k8s-app: kube-ui	  ports:	  - port: 80	    targetPort: 8080

#####安装配置过程 前面的准备工作准备好以后,kube-ui的安装配置非常简单,总结为下面几步

1.执行创建kube-system

#创建kube-system[root@km kube]# kubectl create -f kube-system.yaml namespaces/kube-system#检查是否创建成功[root@km kube]# kubectl get namespaceNAME          LABELS    STATUSdefault       
Activekube-system
Active
  1. 创建kube-ui-rc 这里再提醒一下,一定要记得把kube-ui 镜像导入到kube minion 中,否则由于无法访问gcr的源,会一直卡在这里无法running 成功,同时注意由于我们的kube-ui 是创建在kube-system namespace 中的,所有我们查找rc,pod 都需要带关键字 --namespace=kube-system--all-namespace
[root@km kube]# kubectl create -f kube-ui-rc.yaml replicationcontrollers/kube-ui-v2[root@km kube]# kubectl get pods --namespace=kube-systemNAME               READY     STATUS    RESTARTS   AGEkube-ui-v2-kv8se   1/1       Running   0          21skube-ui-v2-mw65q   1/1       Running   0          21s[root@km kube]# kubectl get rc --namespace=kube-systemCONTROLLER   CONTAINER(S)   IMAGE(S)                              SELECTOR                     REPLICASkube-ui-v2   kube-ui        gcr.io/google_containers/kube-ui:v2   k8s-app=kube-ui,version=v2   2
  1. 创建kube-ui-svc
[root@km kube]# kubectl create -f kube-ui-svc.yaml services/kube-ui[root@km kube]# kubectl get svc --namespace=kube-systemNAME      LABELS                                                                         SELECTOR          IP(S)             PORT(S)kube-ui   k8s-app=kube-ui,kubernetes.io/cluster-service=true,kubernetes.io/name=KubeUI   k8s-app=kube-ui   192.168.155.143   80/TCP

4.访问 可以看到我们kube-ui界面

4. 总结

前面的配置,基本绕过了网上的一些构建k8s集群不完整文档的坑,主要有如下几个坑

1.

问题:

Unable to listen for secure (open /var/run/kubernetes/apiserver.crt: no such file or directory

解决:

vi /etc/systemd/system/kube-apiserver.service.d/10-varrun-build.conf[Service]# Run ExecStartPre with root-permissionsPermissionsStartOnly=trueExecStartPre=-/usr/bin/mkdir /var/run/kubernetesExecStartPre=/usr/bin/chown -R kube:kube /var/run/kubernetes/
2.

问题:

no API token found for service account default/default, retry after the token is automatically created and added to the service account

解决:

1.  openssl genrsa -out /tmp/serviceaccount.key 20482.    vim /etc/kubernetes/apiserver:    KUBE_API_ARGS="--service_account_key_file=/tmp/serviceaccount.key"3.    vim /etc/kubernetes/controller-manager    KUBE_CONTROLLER_MANAGER_ARGS="--service_account_private_key_file=/tmp/serviceaccount.key"    systemctl restart kube-controller-manager.service

5. 参考

转载于:https://my.oschina.net/tinkercloud/blog/608119

你可能感兴趣的文章
web开发中,必须掌握的linux概念及常用命令
查看>>
如何将heic格式转为jpg, heic怎么打开
查看>>
SpringBoot事物管理
查看>>
Java™ 教程(枚举类型)
查看>>
npm发布包教程(三):安装发布包
查看>>
Node.js readline模块与util模块的用法
查看>>
设计翻牌抽奖
查看>>
函数计算 Python 连接 SQL Server 小结
查看>>
视频、游戏等大文件高并发下的优化方法
查看>>
Spring Cloud Stream如何处理消息重复消费?
查看>>
dubbo源码解析(十六)远程通信——Netty3
查看>>
将Chrome调试器里的JavaScript变量保存成本地JSON文件
查看>>
一篇文章读懂 React & redux 前端开发
查看>>
NLP入门(二)探究TF-IDF的原理
查看>>
Cisco思科网络插件Contiv (三) Plugin 实现原理
查看>>
iOS 解耦和组件化开发新姿势—— FFRouter
查看>>
Easeljs之DisplayObject阅读
查看>>
ElasticSearch6.4.0集群搭建
查看>>
javascript - 严格模式
查看>>
Python 爬虫利器 Selenium
查看>>