zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Palindrome Linked List 解答
    Word Break II 解答
    Array vs Linked List
    Reverse Linked List II 解答
    Calculate Number Of Islands And Lakes 解答
    Sqrt(x) 解答
    Find Median from Data Stream 解答
    Majority Element II 解答
    Binary Search Tree DFS Template
    188. Best Time to Buy and Sell Stock IV
  • 原文地址:https://www.cnblogs.com/laiyuan/p/8607821.html
Copyright © 2011-2022 走看看