kubernetes逻辑部署图
机器列表
模块
|
机器
|
配置
|
备注
|
域名
|
---|---|---|---|---|
master | 172.31.101.175 172.31.101.176 172.31.101.177 |
4G内存 4核CPU |
etcd、kube-apiserver、kube-scheduler、kube-controller-manager、flannel | |
node | 172.31.101.172 |
8G内存 |
kubelet、kube-proxy、docker、flannel | |
node | 172.31.101.115 |
32G内存 |
kubelet、kube-proxy、docker、flannel |
master节点可以不安装 docker的,但是需要安装flannel,否则一些转发请求不好使。
机器初始化
采用CentOS 7系统,线下的yum.repos.d的配置和线上不一样,导致安装的一些软件不是最新的。需要做如下操作:
独立的数据盘 /data 必须是ext4格式的,否则会有问题
- 同步172.31.101.166:/etc/yum.repos.d/* 到 本机 /etc/yum.repos.d/ 目录下
- 运行 echo 'overlay' > /etc/modules-load.d/overlay.conf 启用overlay的模块支持
- 运行 yum -y update 命令等待更新系统
- 运行 yum -y install flannel docker 安装docker 程序
- 运行 yum -y install lrzsz telnet strace bridge_utils 等工具方便后续定位问题
- 运行 yum -y install ceph-common 组件
- 运行 pip install docker-compose 组件
- 运行 systemctl enable docker 把docker放到开机自启动中
升级内核到最新4.x的版本,匹配ceph分布式存储的要求- 运行 reboot 命令,重启系统
升级centos7的内核到4.9
rpm --
import
https:
//www
.elrepo.org
/RPM-GPG-KEY-elrepo
.org
rpm -Uvh http:
//www
.elrepo.org
/elrepo-release-7
.0-2.el7.elrepo.noarch.rpm
yum -y
install
yum-plugin-fastestmirror
yum -y --enablerepo=elrepo-kernel
install
kernel-ml
grub2-
set
-default 0
|
升级到4.x版本之后,和systemd/kubelet/docker的配合有问题,暂时先回退到3.x
docker设置
使用阿里镜像加速
cat
/etc/docker/daemon
.json
{
"storage-driver"
:
"overlay"
,
"live-restore"
:
true
,
}
|
将设备目录等放到/data盘,避免撑爆根目录
# docker相关信息会存储在 /var/lib/docker 下
mv
/var/lib/docker
/data/
ln
-sf
/data/docker
/var/lib/docker
# pod相关信息会存储在 /var/lib/kubelet 下,如果没有这个目录,请先创建
mv
/var/lib/kubelet
/data/
ln
-sf
/data/kubelet
/var/lib/kubelet
|
配置允许使用http方式访问harbor仓库
修改 /etc/sysconfig/docker 文件
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
INSECURE_REGISTRY='--insecure-registry reg.firstshare.cn'
配置后重新加载
- systemctl daemon-reload
- systemctl restart docker
安装kubernetes
关闭防火墙
由于master和node之间有频繁的网络操作,而且在内网使用,所以关闭防火墙,避免影响效率
- systemctl disable firewalld 去掉开机自启动
- systemctl stop firewalld 停止防火墙服务
- setenforce 0 关闭SElinux
安装etcd cluster
yum -y install etcd,目前版本是3.1.0.
配置参考文档: https://coreos.com/etcd/docs/3.1.4/op-guide/clustering.html
|
位置
|
备注
|
---|---|---|
机器 | 172.31.101.175/176/177 | 至少3台构成一个cluster,通过 http://etcd02.firstshare.cn 访问 |
配置 | /etc/etcd/etcd.conf | |
数据 | /data/etcd-storage | 需要修改为 etcd 账户可读写 |
服务 | /usr/lib/systemd/system/etcd.service | |
账户 | etcd | 不用root账户启动 |
自启动 | systemctl enable etcd | 重启后自动运行etcd |
备份 | ||
监控 |
etcd配置
172.31.101.175
|
172.31.101.176
|
172.31.101.177
|
---|---|---|
ETCD_NAME=vlnx101175 |
ETCD_NAME=vlnx101176 |
ETCD_NAME=vlnx101177 |
验证etcd是否正常
运行命令 etcdctl cluster-health 检查是否工作正常
安装master
准备好tls认证文件
从老的k8s集群172.31.101.119:/key1 目录拷贝证书等文件到所有的master节点的 /etc/kubernetes/ssl/ 目录下。配置说明如下
文件名
|
说明
|
---|---|
basic_auth.csv | basic auth user and password |
ca.crt | Certificate Authority cert |
known_tokens.csv | tokens that entities (e.g. the kubelet) can use to talk to the apiserver |
kubecfg.crt | Client certificate, public key |
kubecfg.key | Client certificate, private key |
server.cert | Server certificate, public key |
server.key | Server certificate, private key |
通过yum安装
运行 yum -y install kubernetes-master 命令,目前安装的是1.5.2,我们先用它把service相关的东西都配置好,然后手动升级到1.6.0的最新版本。
可以通过rpm -ql kubernetes-master 来看都安装了哪些文件
修改master配置文件
到 /etc/kubernetes/ 目录下修改配置
文件名
|
内容
|
备注
|
---|---|---|
文件名
|
内容
|
备注
|
config | KUBE_LOGTOSTDERR="--logtostderr=true" |
|
apiserver | KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" |
支持ssl/bash/token等安全认证 |
controller-manager | KUBE_CONTROLLER_MANAGER_ARGS="--leader-elect=true \ |
必须设置认证方式,否则创建deploy的时候会报错: |
scheduler | KUBE_SCHEDULER_ARGS="--leader-elect=true \ |
配置开机自启动
systemctl daemon-reload
systemctl
enable
kube-apiserver
systemctl
enable
kube-scheduler
systemctl
enable
kube-controller-manager
|
启动master相关服务
systemctl start kube-apiserver
systemctl start kube-scheduler
systemctl start kube-controller-manager
|
验证组件是否正常
运行命令 kubectl get componentstatuses 检查组件是否正常
apiserver 是无状态的,所以对于多个节点而言可以通过前端挡一层 nginx 、haproxy 等实现高可用和负载均衡,而对于 scheduler 和 controller-managere 而言,它们需要操作后端存储 etcd,是有状态的,为了减少同步操作后端存储带来的数据不一致性,3 个 节点 的scheduler 和 controller-manager 组件同时只有一个提供服务,具体的实现就是3个节点之间会进行一个 leader 的选举,只有 leader 节点才提供服务。因此,验证选举工作是否正常也是非常重要的。
查看当前 3 个 shcduler和controller-manager 哪个是 leader 节点:
kubectl get endpoints kube-controller-manager --namespace=kube-system -o yaml
升级新版本
下载路径:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG.md#downloads-for-v160
到上面路径下载 kubernetes-server-linux-amd64.tar.gz 文件,然后上传到服务器上,解压缩到 /opt/fs/kubernetes 目录,把 bin 目录的文件复制到 系统 /bin/ 目录下。
注意事项:
- 需要修改可执行权限:chmod a+x /bin/kube* , 这里比较坑,否则会报没有可执行权限的错误,无法启动。
- 删除 /var/run/kubernetes/apiserver* 下产生的文件,否则无法启动
然后重启master相关服务就可以了
安装node
运行 yum -y install kubernetes-node 命令,目前安装的是1.5.2,我们先用它把service相关的东西都配置好,然后手动升级到1.6.0的最新版本。
安装flanneld(注意:各个master节点上也需要安装并启动flannel,配置和下面的相同)
yum -y
install
flannel
systemctl daemon-reload
systemctl
enable
flanneld
systemctl start flanneld
|
修改flannel配置文件
修改 /etc/sysconfig/flanneld 配置文件,配置etcd的地址
FLANNEL_ETCD_ENDPOINTS="http://172.31.101.175:2379,http://172.31.101.176:2379,http://172.31.101.177:2379"
FLANNEL_ETCD_PREFIX="/atomic.io/network"
在master的机器上,修改etcd设置flannel的网段。 (SubnetLen指定分配给每个Node节点上Pod网络的掩码位数,从而在网络上间接决定了每个node上可运行的pod数,参考文档;https://github.com/coreos/flannel/blob/master/Documentation/configuration.md)
etcdctl set /atomic.io/network/config '{ "Network": "10.132.0.0/16","SubnetLen":24 }'
这样每个node节点上的flanneld启动的时候,会自动分配对应网段的地址并注册到etcd中。
修改docker配置去掉bip的设置
在启动flannel后,每个node节点的bip范围是自动分配的,不需要再docker的配置文件中指明。
修改docker的配置文件,指明cgroup用systemd
OPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false'
if [ -z "${DOCKER_CERT_PATH}" ]; then
DOCKER_CERT_PATH=/etc/docker
fi
INSECURE_REGISTRY='--insecure-registry reg.firstshare.cn'
|
flannel网络机制
经由所在主机的docker0虚拟网卡转发到flannel0虚拟网卡,这是个P2P的虚拟网卡,flanneld服务监听在网卡的另外一端。
Flannel通过Etcd服务维护了一张节点间的路由表。
修改node配置文件
到 /etc/kubernetes/ 目录下修改配置
文件名
|
内容
|
备注
|
---|---|---|
config | KUBE_LOGTOSTDERR="--logtostderr=true" |
不需要配置override-hostname,直接使用本机hostname就可以了 |
kubelet | KUBELET_ADDRESS="--address=0.0.0.0" KUBELET_API_SERVER="--kubeconfig=/var/lib/kubelet/kubeconfig" KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" KUBELET_ARGS="--cgroup-driver=systemd --require-kubeconfig --cluster_dns=10.137.254.254 --cluster_domain=cluster.local" |
必须配置cgroup-driver=systemd,否则无法启动 注释KUBELET_HOSTNAME配置或者修改值为node的真实hostname, 否则master上 kubectl get node只会显示一个127.0.0.1 |
proxy | KUBE_PROXY_ARGS="" | |
kubeconfig | apiVersion: v1 |
/var/lib/kubelet/kubeconfig |
配置启动依赖顺序
- docker要在flanneld之后启动
- kublet要在flanneld和docker之后启动
cat /usr/lib/systemd/system/docker.service
cat /usr/lib/systemd/system/kubelet.service
配置开机自启动
systemctl daemon-reload
systemctl
enable
flanneld
systemctl
enable
docker
systemctl
enable
kube-proxy
systemctl
enable
kubelet
|
启动node相关服务
systemctl start flanneld
systemctl start docker
systemctl start kube-proxy
systemctl start kubelet
|
升级新版本
下载路径:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG.md#downloads-for-v160
到上面路径下载 kubernetes-server-linux-amd64.tar.gz 文件,然后上传到服务器上,解压缩到 /opt/fs/kubernetes 目录,把 bin 目录的文件复制到 系统 /bin/ 目录下。
注意事项:
- 需要修改可执行权限:chmod a+x /bin/kube* , 这里比较坑,否则会报没有可执行权限的错误,无法启动。
然后重启node相关服务就可以了
检查node是否正常
在 master 节点上,运行命令 kubectl get node ,如果显示node为 NotReady, 则把所有node节点都重启reboot一下才可能恢复正常。
参考资料
kubernetes 1.6.0 高可靠集群部署 https://www.addops.cn/post/kubernetes-deployment.html
kubernetes + etcd ssl 支持 https://www.addops.cn/post/tls-for-kubernetes-etcd.html
kubernetes 中的服务发现和负载均衡 https://www.addops.cn/post/kubernetes_service_discovery.html
用 Flannel 配置 Kubernetes 网络 http://dockone.io/article/1186
DockOne技术分享(十八):一篇文章带你了解Flannel http://dockone.io/article/618
kubernetes 搭建过程中遇到的问题 http://www.cnblogs.com/ivictor/p/4998032.html
CentOS 7 禁用ipv6 http://blog.csdn.net/bluishglc/article/details/41390785
和我一起一步步搭建k8s集群 https://github.com/opsnull/follow-me-install-kubernetes-cluster