【爬坑系列】之kubernetes环境搭建:二进制安装与镜像安装
准备:
网上教如何编译与安装kubernetes的教程很多,需要提前准备的也很多,比如关闭selinux,防火墙啦....但有一点一定要注意,编译kubernetes源码时要求有2G内存,这个可是实打实的2G内存!所以要求你的机器至少是3G,4G最好了。
如果你手头不是那么宽裕比如我只买得起2G内存的计算云,那么只好利用交换分区了...
增加1GB大小的交换分区,则命令写法如下,其中的count等于想要的块的数量(bs*count=文件大小)
dd if=/dev/zero of=/root/swapfile bs=1M count=2048
mkswap /root/swapfile
swapon /root/swapfile
使系统开机时自启用,在文件/etc/fstab中添加一行
vi /etc/fstab
添加/root/swapfile swap swap defaults 0 0
扩大或修改 swap 大小 其实和增加一样的,只是必须先停止交换分区
swapoff /root/swapfile
然后按上面的增加方法即可
一,源码编译
#KUBE_BUILD_PLATFORMS=linux/amd64 make all GOFLAGS=-v GOGCFLAGS="-N -l"
注:这个过程如果编译出错,基本是内存不够了,那就一个一个模块的编,比较耗内存的有kubelet, kube-controller-manager...,单独一个木块的编译命令例如
#KUBE_BUILD_PLATFORMS=linux/amd64 make all WHAT=cmd/kubelet GOFLAGS=-v GOGCFLAGS="-N -l"
二,生成镜像:
推荐参考此博客:https://www.kubernetes.org.cn/5033.html
三,node/minion节点的安装(直接yum安装方式)
节点vip: 106.y.y.3
node节点需要安装的组件有:kubelet,kube-proxy,flannel,etcd(可选)
【安装】:现如今,yum源中已经支持安装k8s了,所以一个kubernetes-node选项,就可以将当前节点作为node角色进行必要的安装。
#yum install kubernetes-node etcd flannel -y
说明:其实和其他centos系统下的二进制安装是一样的:
- 二进制可执行文件放到/usr/bin中
- 统一的系统配置文件:/usr/lib/systemd/system/kubelet.service.
- 专属配置文件:例如/etc/kubernetes/*, /etc/etcd/etcd.conf
专属配置文件如/etc/kubernetes/目录下的配置文件为系统配置文件xx.service文件提供参数 ,所以要改参数需要两个文件结合修改,这里需要改的无非两点:集群master节点地址,etcd的地址
【配置etcd】
vi /etc/etcd/etcd.conf
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" ---表示开启的本地监听:用来提供服务的接口
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380" ---表示开启的本地监听:用来和perr交流的接口 --以下是用来广播出去给peer们,告诉大家怎么能找到我,包括:我与peer通信的接口和我服务的接口
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://188.x.x.113:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://188.x.x.113:2379"
ETCD_INITIAL_CLUSTER="etcd0=http://188.x.x.113:2380,etcd1=http://106.y.y.3:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
vi /usr/lib/systemd/system/etcd.service
--advertise-client-urls=\"${ETCD_ADVERTISE_CLIENT_URLS}\" --initial-cluster=\"${ETCD_INITIAL_CLUSTER}\" --initial-advertise-peer-urls=\"${ETCD_INITIAL_ADVERTISE_PEER_URLS}\" --initial-cluster-state=\"${ETCD_INITIAL_CLUSTER_STATE}\" --listen-peer-urls=\"${ETCD_LISTEN_PEER_URLS}\" --listen-client-urls=\"${ETCD_LISTEN_CLIENT_URLS}\""
最后:
systemctl daemon-reload
systemctl restart etcd.service
systemctl enable etcd.service
验证:
etcdctl member list
etcdctl cluster-health
【坑1】
场景1:报错:rafthttp: request sent was ignored (cluster ID mismatch: peer[b6568aca930d28d4]=cdf818194e3a8c32, local=9c8b920197d88342)
场景2:当某个peer挂了,或者减少etcd集群的成员等,你变更了配置之后,发现重启失败等等之类的错误,都可以尝试如下的解决办法
解决:
cd /var/lib/etcd/
rm ./* -rf //清缓存
【配置flannel】
0,为什么需要etcd
etcd是一个key-value形式的存储系统,所以关于网络方面的数据,要首先为其指定一个key,那么这个key下的数据都属于网络方面的。
1,配置flannel,包括 1)etcd的地址; 2)存储数据到etcd中使用的key
#vi /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://106.13.146.3:2379,http://188.131.210.113:2379"
FLANNEL_ETCD_PREFIX="/k8s/network" //这个key是 "/k8s/network"
FLANNEL_OPTIONS="--log_dir=/var/log/k8s/flannel/ --public-ip=188.x.x.113" //这个public-ip一定是网络可达的,比如我的环境中,必须配置成host的vip
2,在etcd中为flannel添加初始配置,表示之后为k8s集群分配ip的时候,取如下地址空间
# 在master上etcd执行
etcdctl mk /k8s/network/config '{"Network": "10.0.0.0/16"}'
# 若要重新建,先删除
etcdctl rm /k8s/network/ --recursive
3,重启flannel
systemctl daemon-reload
systemctl restart flanneld.service
systemctl enable flanneld.service
4,重启docker
说明:flannel之所以能够掌控pod的流向转发,其实是和docker配合着来做的,flannel的安装会偷偷修改docker的启动参数或环境变量,所以要重启下docker以生效。详见深入解读docker网络与kubernetes网络
四,master节点的安装(镜像 + 二进制)
节点Vip:188.x.x.113
0,之前我们已经编译好了三大镜像,加载之
[root@master _output]# find ./release-stage/ -name "*.tar"
./release-stage/server/linux-amd64/kubernetes/server/bin/kube-controller-manager.tar
./release-stage/server/linux-amd64/kubernetes/server/bin/kube-apiserver.tar
./release-stage/server/linux-amd64/kubernetes/server/bin/kube-scheduler.tar
docker load < kube-scheduler.tar
...
k8s.gcr.io/kube-scheduler v1.13.6-beta.0.39_ddd2add0dd3dbc 0ee023810183 22 minutes ago 79.5MB
k8s.gcr.io/kube-apiserver v1.13.6-beta.0.39_ddd2add0dd3dbc 7666a559eee8 22 minutes ago 181MB
k8s.gcr.io/kube-controller-manager v1.13.6-beta.0.39_ddd2add0dd3dbc ac910ff4cca1 22 minutes ago 146MB
1,安装etcd
步骤同node节点,需要注意的是,要先安装etcd,再安装k8s的组件
2,安装flanel
步骤同node节点
3,三大组件的最基本安装:
//wxy:注意,对于绑定vip的云上机器, insecure-bind-address的地址不能是vip,而应该是自己本地的ip,这里就用了0.0.0.0代替
docker run -d --name=apiserver --net=host k8s.gcr.io/kube-apiserver:v1.13.6-beta..39_ddd2add0dd3dbc kube-apiserver --insecure-bind-address=0.0.0.0 --service-cluster-ip-range=11.0.0.0/ --etcd-servers=http://188.x.x.113:2379 docker run -d --name=controllermanager --net=host k8s.gcr.io/kube-controller-manager:v1.13.6-beta..39_ddd2add0dd3dbc kube-controller-manager --master=.x.x.: docker run -d --name=scheduler --net=host k8s.gcr.io/kube-scheduler:v1.13.6-beta..39_ddd2add0dd3dbc kube-scheduler --master=.x.x.:
至此,k8s的集群已经起来了,验证下:
[root@master ~]# kubectl get ns
NAME STATUS AGE
default Active 12h
kube-public Active 12h
kube-system Active 12h
但是,创建pod的时候会出现如下错误:
[root@master ~]# kubectl create -f ./centos.yaml
Error from server (ServerTimeout): error when creating "./centos.yaml": No API token found for service account "default", retry after the token is automatically created and added to the service account
那是认证的问题,下一步就展示了如何配置认证
3,升级安装:带证书配置
说明:与k8s集群的交流是通过调用api-server组件提供的各种api,比如创建pod,service等,这种访问可能是来自人类例如某人执行kuectl命令,也可能是pod中的某进程想要访问api,都需要认证,api-server可不是随随便便就能被任何人访问的,那么就需要有一套认证机制,详细的见 【爬坑系列】之解读kubernetes的认证原理&实践,否则只需要做如下操作即可:
0)生成需要的证书
使用CFSSL工具或者openssl都可以,网上也有很多教程,详细的也可以看这里,反正这里我就需要一个根证书,以下的是已经生成好的一些证书
[root@master ~]# ll /etc/kubernetes/apiserver/
total 36
-rw-rw-rw- 1 root root 997 May 22 10:46 ca.csr
-rw-rw-rw- 1 root root 1679 May 22 10:46 ca-key.pem
-rw-rw-rw- 1 root root 1350 May 22 10:46 ca.pem ---我所需要的
-rw-rw-rw- 1 root root 1338 May 22 11:59 server.csr
-rw-rw-rw- 1 root root 1679 May 22 11:59 server-key.pem
-rw-rw-rw- 1 root root 1704 May 22 11:59 server.pem
1)重新安装controller manage,只配置service-account-private-key-file这一个认证相关的参数
[root@master ~]# docker run -d --name=cm --net=host \
-v /etc/kubernetes/apiserver:/run/ssl \
k8s.gcr.io/kube-controller-manager:v1.13.6-beta..39_ddd2add0dd3dbc \
kube-controller-manager \
--master=0.0.0.0: \
--service-account-private-key-file=/run/ssl/ca-key.pem
2),重启所有节点的kublete (重要)
[root@master ~]# systemctl restart kubelet.service
k8s会做两件事
1)自动给生成一个secret:属于服务账号的,用来给pod提供一个缺省的身份(名字 和 token),让他得以访问apiserver,具体怎么给pod用的,看这里
2)在/var/run/kubernetes/目录下生成一对证书,由配置的CA证书签发的 ---干什么用的?目前没时间研究,在说....
3),此时创建pod,可以成功
[root@master ~]# kubectl create -f centos.yaml
pod/myapp-centos created
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-centos / Running 6s
【坑2】
配置了证书启动kube-controller-manager后还是报同样的错误,secret也没生成,为什么?
定位过程:
- kube-controller-manager的日志显示文件不存在,命名在的啊:
#docker logs -f cm
...
F0529 ::21.535516 controllermanager.go:] error starting controllers: error reading key for service account token controller: open /etc/kubernetes/apiserver/ca-key.pem: no such file or directory
- 看了源码,根据源码我还本地写了个小程序,发现是可以顺利读取的,那说明文件是没问题,为什么到了容器里就有问题了。突然,我意识到这可是容器啊,代码读取的可是容器内的路径,而我的配置是host上的路径。于是
- 于是增加了卷挂载,即把host中的证书挂载到容器中,结果:OK
docker run -d --name=cm --net=host \
-v /etc/kubernetes/apiserver:/run/ssl \
k8s.gcr.io/kube-controller-manager:v1.13.6-beta..39_ddd2add0dd3dbc \
kube-controller-manager \
--master=0.0.0.0: \
--root-ca-file=/run/ssl/ca.pem \
--service-account-private-key-file=/run/ssl/ca-key.pem
水鬼子:这是一个很low的错误,很无语啊,只是希望万一你也有这个问题,也许这是一个提示...
【爬坑系列】之kubernetes环境搭建:二进制安装与镜像安装的更多相关文章
- Docker Kubernetes 环境搭建
Docker Kubernetes 环境搭建 节点规划 版本 系统:Centos 7.4 x64 Docker版本:18.09.0 Kubernetes版本:v1.8 etcd存储版本:etcd-3. ...
- 【爬坑系列】之vxlan网络实现
linux 内核从3.7之后就内部集成了vxlan功能,所以可以使用linux内核提供的vxlan功能,经过配置创建vxlan网络. 而从Docker自Docker Engine 1.9之后,就自带o ...
- 【转】RHadoop实践系列之一:Hadoop环境搭建
RHadoop实践系列之一:Hadoop环境搭建 RHadoop实践系列文章,包含了R语言与Hadoop结合进行海量数据分析.Hadoop主要用来存储海量数据,R语言完成MapReduce 算法,用来 ...
- MyBatis学习系列一之环境搭建
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 学习一个新的知识,首先做一个简单的例子使用一下,然后再逐步深入.MyBat ...
- Spring5.x源码分析 | 从踩坑到放弃之环境搭建
Spring5.x源码分析--从踩坑到放弃之环境搭建 前言 自从Spring发行4.x后,很久没去好好看过Spring源码了,加上最近半年工作都是偏管理和参与设计为主,在技术细节上或多或少有点疏忽,最 ...
- 傲视Kubernetes(二):Docker镜像搭建与本地Kubernetes环境搭建
主要内容: 1.Docker与Kubernetes的关系 2.SpringBoot微服务的Docker镜像创建 3.Kubernetes本地环境搭建 一.Docker与Kubernetes的关系 在说 ...
- hadoop2.7.3+spark2.1.0+scala2.12.1环境搭建(4)SPARK 安装
hadoop2.7.3+spark2.1.0+scala2.12.1环境搭建(4)SPARK 安装 一.依赖文件安装 1.1 JDK 参见博文:http://www.cnblogs.com/liugh ...
- mac OS X下Java项目环境搭建+IntelliJ IDEA Jrebel插件安装与破解+Office 2016破解版安装
一.mac OS X下Java项目环境搭建 因为某些原因新入手了台最新版的MacBook Pro,意味着今天要花一天时间安装各种软件以及项目环境搭建╮(╯▽╰)╭ 项目环境搭建步骤: 1.安装jdk ...
- 部署k8s集群之环境搭建和etcd单节点安装
环境搭建以及etcd 单节点安装过程 安装之前的环境搭建 在进行k8s安装之前先把虚拟机准备好,这里准备的是三台虚拟机 主机名 ip地址 角色 master 172.16.163.131 master ...
随机推荐
- 寒武纪camp Day1
补题进度:8/10 A(组合计数) 题意: 一个人站在数轴原点,每秒有1/4概率向前走一步,1/4概率向后走一步,1/2概率不动,问t秒后在p位置的概率. t,p<=100000 分析: 枚举不 ...
- 框架-弹出选择框(Jquery传递Json数组)
给一个button按钮,执行方法 Json传值$("body").on("click", "#btnsure", function() { ...
- Download Software Top 10
We are quite rich in terms of web browsers! Nevertheless, it's a bit surprising to know that even so ...
- Vs2012在Linux开发中的应用(5):项目属性的定义
VS的项目属性表实际上是由一系列的XML文件定义的,都存放在C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\2052文件夹下.我们全然能够 ...
- MongoDB中对象反序列化的一个小问题
今天在mongoDB存取对象数据的时候,碰到一个小问题:对象的某一个字段类型是抽象类或者接口.在存入的时候没有问题.可是在读取的时候,因为没有详细类的信息,无法完毕对象的又一次构建.就会报错: Can ...
- 【转】TestNG常用注解
http://blog.csdn.net/d6619309/article/details/52435084 TestNG的注解大部分用在方法级别上.常用的注解列举如下: 1. Before类别和Af ...
- 大话设计模式C++实现-第14章-观察者模式
一.UML图 关键词:Subject维护一个Observer列表.Subject运行Notify()时就运行列表中的每一个Observer的Update(). 二.概念 观察者模式:定义了一种一对多的 ...
- 2016/04/26 流程 数据库lcdb 四个表 1,用户表users 2,流程表(设定有哪些流程)liucheng 3,流程发起者表(记录谁发起到哪里) 4,流程经过的人员表 flowpath (order排序)
流程: 十一 个页面 1,denglu.php(登录) <!DOCTYPE html> <html lang="en"> <head> ...
- 配置mahout
构建Mahout要求系统事先安装 1)JDK 1.6 或更高版本 2)Maven 2.0.9 或 2.0.10 Mahout是Hadoop的一种高级应用.运行Mahout需要提前安装好Hadoop.H ...
- hexSHA1散列加密解密(不可逆)
1.maven引入codec和commons依赖: <dependency> <groupId>commons-codec</groupId> <artifa ...