kubernetes 安装手册

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

http://k8s02.firstshare.cn

http://etcd02.firstshare.cn

node

172.31.101.172
172.31.101.173
172.31.101.174 

8G内存
8核CPU 

kubelet、kube-proxy、docker、flannel  
node

172.31.101.115
172.31.101.116
172.31.101.117 

32G内存
8核CPU 

kubelet、kube-proxy、docker、flannel  

master节点可以不安装 docker的,但是需要安装flannel,否则一些转发请求不好使。

 

机器初始化

采用CentOS 7系统,线下的yum.repos.d的配置和线上不一样,导致安装的一些软件不是最新的。需要做如下操作:

独立的数据盘 /data 必须是ext4格式的,否则会有问题

  1. 同步172.31.101.166:/etc/yum.repos.d/* 到 本机 /etc/yum.repos.d/ 目录下
  2. 运行 echo 'overlay' > /etc/modules-load.d/overlay.conf 启用overlay的模块支持
  3. 运行 yum -y update 命令等待更新系统
  4. 运行 yum -y install flannel docker 安装docker 程序
  5. 运行 yum -y install lrzsz telnet strace bridge_utils 等工具方便后续定位问题
  6. 运行 yum -y install ceph-common 组件
  7. 运行 pip install docker-compose 组件
  8. 运行 systemctl enable docker 把docker放到开机自启动中
  9. 升级内核到最新4.x的版本,匹配ceph分布式存储的要求
  10. 运行 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,
    "registry-mirrors": ["https://vbe6ja2b.mirror.aliyuncs.com"]
}

将设备目录等放到/data盘,避免撑爆根目录

调整docker目录
# 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'

配置后重新加载

  1. systemctl daemon-reload
  2. systemctl restart docker

安装kubernetes

关闭防火墙

由于master和node之间有频繁的网络操作,而且在内网使用,所以关闭防火墙,避免影响效率

  1. systemctl disable firewalld  去掉开机自启动
  2. systemctl stop firewalld  停止防火墙服务
  3. 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_DATA_DIR="/data/etcd-storage/"
ETCD_HEARTBEAT_INTERVAL="1000"
ETCD_ELECTION_TIMEOUT="10000"
ETCD_LISTEN_PEER_URLS="http://172.31.101.175:2380"
ETCD_LISTEN_CLIENT_URLS="http://172.31.101.175:2379,http://127.0.0.1:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.31.101.175:2380"
ETCD_INITIAL_CLUSTER="vlnx101175=http://172.31.101.175:2380,vlnx101176=http://172.31.101.176:2380,v
lnx101177=http://172.31.101.177:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-k8s"
ETCD_ADVERTISE_CLIENT_URLS="http://172.31.101.175:2379"

ETCD_NAME=vlnx101176
ETCD_DATA_DIR="/data/etcd-storage/"
ETCD_HEARTBEAT_INTERVAL="1000"
ETCD_ELECTION_TIMEOUT="10000"
ETCD_LISTEN_PEER_URLS="http://172.31.101.176:2380"
ETCD_LISTEN_CLIENT_URLS="http://172.31.101.176:2379,http://127.0.0.1:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.31.101.176:2380"
ETCD_INITIAL_CLUSTER="vlnx101175=http://172.31.101.175:2380,vlnx101176=http://172.31.101.176:2380,v
lnx101177=http://172.31.101.177:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-k8s"
ETCD_ADVERTISE_CLIENT_URLS="http://172.31.101.176:2379"

ETCD_NAME=vlnx101177
ETCD_DATA_DIR="/data/etcd-storage/"
ETCD_HEARTBEAT_INTERVAL="1000"
ETCD_ELECTION_TIMEOUT="10000"
ETCD_LISTEN_PEER_URLS="http://172.31.101.177:2380"
ETCD_LISTEN_CLIENT_URLS="http://172.31.101.177:2379,http://127.0.0.1:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.31.101.177:2380"
ETCD_INITIAL_CLUSTER="vlnx101175=http://172.31.101.175:2380,vlnx101176=http://172.31.101.176:2380,v
lnx101177=http://172.31.101.177:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-k8s"
ETCD_ADVERTISE_CLIENT_URLS="http://172.31.101.177:2379"

验证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"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=true"
KUBE_MASTER="--master=http://127.0.0.1:8080"

 
apiserver

KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--insecure-port=8080 --secure-port=6443"
KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.137.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota"
KUBE_API_ARGS="--service-node-port-range=80-50000 \
--client-ca-file=/etc/kubernetes/ssl/ca.crt \
--tls-cert-file=/etc/kubernetes/ssl/server.crt \
--tls-private-key-file=/etc/kubernetes/ssl/server.key \
--basic-auth-file=/etc/kubernetes/ssl/basic_auth.csv \
--token-auth-file=/etc/kubernetes/ssl/known_tokens.csv"

支持ssl/bash/token等安全认证
controller-manager

KUBE_CONTROLLER_MANAGER_ARGS="--leader-elect=true \
--leader-elect-lease-duration=150s \
--leader-elect-renew-deadline=100s \
--leader-elect-retry-period=20s \
--root-ca-file=/etc/kubernetes/ssl/ca.crt \
--service-account-private-key-file=/etc/kubernetes/ssl/server.key"

必须设置认证方式,否则创建deploy的时候会报错:
No API token found for service account "default", retry after the token is automatically created and added to the service account 

scheduler

KUBE_SCHEDULER_ARGS="--leader-elect=true \
--leader-elect-lease-duration=150s \
--leader-elect-renew-deadline=100s \
--leader-elect-retry-period=20s"

 

配置开机自启动

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/ 目录下。

注意事项:

  1. 需要修改可执行权限:chmod a+x /bin/kube* , 这里比较坑,否则会报没有可执行权限的错误,无法启动。
  2. 删除 /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

/etc/sysconfig/docker
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"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=true"
KUBE_MASTER="--master=http://k8s02.firstshare.cn"

不需要配置override-hostname,直接使用本机hostname就可以了
kubelet

KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_PORT="–port=10250"

#KUBELET_HOSTNAME="--hostname-override=127.0.0.1"
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
clusters:
- cluster:
insecure-skip-tls-verify: true
server: http://k8s02.firstshare.cn
name: k8s
contexts:
- context:
cluster: k8s
user: ""
name: firstshare
current-context: firstshare
kind: Config
preferences: {}
users: []

/var/lib/kubelet/kubeconfig



配置启动依赖顺序

  1. docker要在flanneld之后启动
  2. 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/ 目录下。

注意事项:

  1. 需要修改可执行权限: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

posted @ 2018-03-20 10:41  初期网工  阅读(2054)  评论(0编辑  收藏  举报