zoukankan      html  css  js  c++  java
  • 使用离线包部署kubernetes 1.9.0、kubernetes-dashboard 1.8

    ===============================================

     2018/3/22_第2次修改                       ccb_warlock

     

    更新说明:

    2018/3/22:修改了6.7中k8s-dashboard中url错误的问题;

    ===============================================

    为了让产品在迎来业务量爆发式增长前完成应对措施,在浏览无数的资料后,决定将服务逐渐进行容器化,最终能达到容器集群的效果。而容器集群的解决方案中,kubernetes(简称k8s)看起来是个可行的方案。我目前的理解是,k8s就是docker容器集群的一个管理系统,有很多实用功能能提高开发、运维的效率。

    尝试过使用在线部署的方式,当时记得即使配了代理有些资源仍然拉不下来,纠结了一天最后查找到了离线部署的教程(https://segmentfault.com/a/1190000012755243),这篇教程基本可以部署出可用的k8s。

    本篇的部署内容和这个教程大体相同,我只是根据我部署的过程增补了一些描述和图片、修改了原教程中一些存在问题的内容。

    节点配置信息表
    节点 主机名 IP OS CPU核数   内存大小   
    Master     K8s-master        192.168.12.21        centos 7        4 4G
    Node1  K8s-node-1 192.168.12.22 centos 7 4 4G
    Node2  K8s-node-2 192.168.12.23 centos 7 4 4G

     

     

     

      

     


     一、基础设置

     1.1 安装vim

    yum install -y vim

     1.2 设置主机名

     Master上执行:

    hostnamectl --static set-hostname  k8s-master

     Node1上执行:

    hostnamectl --static set-hostname  k8s-node-1

     Node2上执行:

    hostnamectl --static set-hostname  k8s-node-2

     # 重启

    reboot

     1.3 分别修改三个节点的hosts文件,并使内容保持一致

    # 编辑hosts文件

    vim /etc/hosts

    # 新增下面的内容,wq保存。

    192.168.12.21 k8s-master
    192.168.12.22 k8s-node-1
    192.168.12.23 k8s-node-2

     1.4 关闭防火墙

    这里为了部署方便,我跟原教程一样直接关了防火墙。

    systemctl stop firewalld
    systemctl disable firewalld

     1.5 关闭selinux

    为了允许容器访问主机文件系统,这是pod网络所需的。目前必须这样做,直到在kubelet中改进SELinux支持。

    # 编辑config文件

    vim /etc/selinux/config

    将SELINUX=enforcing改为SELINUX=disabled,wq保存。

     

    # 当前临时关闭selinux(不重启临时关闭selinux的方式)

    setenforce 0

     1.6 关闭swap

    试验下来k8s需要关闭虚拟内存。

    # 当前临时关闭虚拟内存

    swapoff -a

    # 修改/etc/fstab文件

    vim /etc/fstab

    # 加#注释掉下面的语句屏蔽SWAP的自动挂载,wq保存

    #/dev/mapper/centos-swap swapswapdefaults0 0

    # 查看内存使用情况

    free -m

     1.7 配置路由参数,防止kubeadm报路由警告

    CentOS 7上的某些用户报告了由于iptables被绕过而导致流量被错误路由的问题。你应该确保net.bridge.bridge-nf-call-iptables在你的sysctl配置中设置为1。试验下来即使是firewalld的也要修改配置。

    # 将内容写入k8s.conf文件

    cat <<EOF >  /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF

    # 立即生效

    sysctl --system

     1.8 获取离线包

    离线包链接:https://pan.baidu.com/s/1eTWTXSI 

    密码:6uma

    (教程里作者提供的文件中有个文件名和其教程的命令不一致,我修改该文件名后重新打包)

    将k8s_images.tar.bz2上传到/root下。

    # 安装 bzip2

    yum install -y bzip2

    # 解压k8s_images.tar.bz2

    tar -xjvf k8s_images.tar.bz2

     二、部署docker

     选择安装docker1.2,因为官方建议的版本。1.11、1.13和17.03版本也可以。17.06+版本可能有效,但未经过Kubernetes团队的测试。

     2.1 安装

    yum install -y docker

     2.2 启动

    systemctl start docker
    systemctl enable docker

     2.3 查看版本

    docker version

     2.4 设置镜像加速器

    墙的缘故,访问docker hub不够稳定,故需要设置镜像加速器来解决这个问题。
    这里我使用的是阿里云的镜像加速器。登录阿里云后,访问https://cr.console.aliyun.com/#/accelerator

     

     ps:registry-mirrors的值必须带https:// (有段时间阿里云的教程中只有域名),否则会出现docker重启报错的情况。

     2.5 查看docker文件驱动 

    docker info

    这里我们主要是看cgroup driver。因为K8S要求cgroup driver与docker的保持一致。yum方式部署的应该是1.12.6,其Cgroup Driver为systemd。

     


     三、分别在三个节点上部署kubeadm、kubelet、kubectl

     3.1 导入镜像 

    docker load </root/k8s_images/docker_images/etcd-amd64_v3.1.10.tar
    docker load </root/k8s_images/docker_images/flannel_v0.9.1-amd64.tar
    docker load </root/k8s_images/docker_images/k8s-dns-dnsmasq-nanny-amd64_v1.14.7.tar
    docker load </root/k8s_images/docker_images/k8s-dns-kube-dns-amd64_1.14.7.tar
    docker load </root/k8s_images/docker_images/k8s-dns-sidecar-amd64_1.14.7.tar
    docker load </root/k8s_images/docker_images/kube-apiserver-amd64_v1.9.0.tar
    docker load </root/k8s_images/docker_images/kube-controller-manager-amd64_v1.9.0.tar
    docker load </root/k8s_images/docker_images/kube-scheduler-amd64_v1.9.0.tar
    docker load </root/k8s_images/docker_images/kube-proxy-amd64_v1.9.0.tar
    docker load </root/k8s_images/docker_images/pause-amd64_3.0.tar
    docker load </root/k8s_images/kubernetes-dashboard_v1.8.1.tar

     3.2 安装

    cd /root/k8s_images
    rpm -ivh socat-1.7.3.2-2.el7.x86_64.rpm
    rpm -ivh kubernetes-cni-0.6.0-0.x86_64.rpm  kubelet-1.9.9-9.x86_64.rpm
    rpm -ivh kubectl-1.9.0-0.x86_64.rpm
    rpm -ivh kubeadm-1.9.0-0.x86_64.rpm

     3.3 修改kubelet的配置文件

     kubelet默认的cgroup-driver和docker的不一样,docker有的版本可能是cgroupfs,kubelet默认为systemd,如果不修改则会引起kubelet启动失败。

    vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

    # 重新载入

    systemctl daemon-reload

     3.4 启动

    systemctl enable kubelet && systemctl start kubelet

    ps:此时用systemctl status查看会发现服务没有完全起来,这是因为还缺少许多文件在K8S初始化补齐后才能完全运行,所以我们继续部署。

     


     四、部署master节点

     4.1 初始化k8s

    kubeadm init --kubernetes-version=v1.9.0 --pod-network-cidr=10.244.0.0/16

     等待1分钟后,出现下面的内容。

    如果长时间(等待的时间超过3分钟以上)始终停留在“[init] This might take a minute or longer if the control plane images have to be pulled.”,就要查看/var/log/message里的内容,是什么错误导致初始化失败。
    排除错误后,先重置,再初始化。

    # 初始化过程出现错误时,使用下面的命令重置
    kubeadm reset
    # 重置后再初始化
    kubeadm init --kubernetes-version=v1.9.0 --pod-network-cidr=10.244.0.0/16

    上图中的token信息要记得保留,等会node的加入需要使用。如果忘记了,可以在master上通过kubeadm token list得到。默认token在24小时后过期,后续的node要加入集群需要在master节点上用下面的命令重新生成token。

    kubeadm token create

     4.2 配置环境变量

    此时root用户还不能使用kubelet控制集群,还需要配置该环境变量。

    # 将信息写入bash_profile文件

    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

    # 立即生效

    source ~/.bash_profile

     4.3 查看版本

    kubectl version

     

     4.4 安装flannel

    离线包有yml文件,所以直接用。

    # 创建flannel

    kubectl create -f kube-flannel.yml

     


     五、部署node节点

     # 使用4.1保存的“kubeadm join”的命令,分别将各个node节点加入master(token信息请根据你实际部署的修改掉,这里只是我部署时生成的内容

    kubeadm join --token 1ff84c.b7828d504656ba64 192.168.12.21:6443 --discovery-token-ca-cert-hash sha256:ceb2b93ce7543174b8fa87628fbe1f3926b5206915fee06629195ea8b4b89fe7 

    根据提示,到master节点上检查下,在master上运行下面的命令。

    kubectl get nodes

    # kubernetes会在每个node节点创建flannel和kube-proxy的pod


     六、部署kubernetes-dashboard

    虽然经过几天的学习常用的k8s命令已经能熟练使用了,但是有个页面能够显示信息总比自己一个个命令查询效率来的高,还好原教程的作者也将该页面的yaml文件保存在离线包里了。

    由于k8s的工作负载都放在node节点上,所以等node部署完后才进行页面的部署。

     6.1 修改配置文件

    # 编辑kubernetes-dashboard.yaml

    cd /root/k8s_images
    vim kubernetes-dashboard.yaml 

    # 添加type: NodePort,暴露Dashboard服务。注意这里只添加行type: NodePort即可,其他配置不用改。

    (我这里需要补个截图)

     6.2 创建

    kubectl create -f kubernetes-dashboard.yaml

     6.3 设置端口

    由于系统默认的有效端口为30000-32767,故需要修改kube-apiserver.yaml设置我们需要的端口范围。

    # 修改kube-apiserver.yaml

    vim /etc/kubernetes/manifests/kube-apiserver.yaml

    # 添加下面的内容,wq保存。

        - --service-node-port-range=1-65535

    ps:-与--之间的不是空格

     6.4 设置验证方式

    默认验证方式有kubeconfig和token,这里都不用,我们使用basicauth的方式进行apiserver的验证。

    # 创建/etc/kubernetes/pki/basic_auth_file, 用于存放用户名、密码、用户ID。

    cat <<EOF >  /etc/kubernetes/pki/basic_auth_file
    admin,admin,2
    EOF

    # 编辑kube-apiserver.yaml,给kube-apiserver添加basic_auth验证

    cd /etc/kubernetes/manifests
    vim kube-apiserver.yaml

    # 添加下面的内容,wq保存。

        - --basic_auth_file=/etc/kubernetes/pki/basic_auth_file

    ps:-与--之间的不是空格

     6.5 更新apiserver

    改完kube-apiserver.yaml后如果直接更新kube-apiserver容器,有时会报“The connection to the server 192.168.12.21:6443 was refused - did you specify the right host or port?”,试验后发现在更新之前还需要重启kubelet。

    # 重启kubelet

    systemctl restart kubelet

    # 更新kube-apiserver容器

    cd /etc/kubernetes/manifests
    kubectl apply -f kube-apiserver.yaml

     6.6 授权

    k8s 1.6以后的版本都采用RBAC授权模型。

    # 查看cluster-admin

    kubectl get clusterrole/cluster-admin -o yaml

    # 给admin授权。默认cluster-admin是拥有全部权限的,将admin和cluster-admin bind这样admin就有cluster-admin的权限。

    kubectl create clusterrolebinding login-on-dashboard-with-cluster-admin --clusterrole=cluster-admin --user=admin

    # 查看

    kubectl get clusterrolebinding/login-on-dashboard-with-cluster-admin -o yaml

     6.7 登录

    由于https证书的问题,暂时只能先通过火狐浏览器增加安全例外的方式访问https://192.168.12.21:32666(端口是6.1中kubernetes-dashboard.yaml文件原作者配置的32666,如果需要修改请在6.1中进行修改后再创建)

    6.4中,我配置的用户名/密码为admin/admin,故使用该用户名密码登录。


     参考资料:

    1.https://segmentfault.com/a/1190000012755243

    2.《kubernetes权威指南》

    3.https://kubernetes.io/docs/setup/independent/install-kubeadm/

    4.https://www.cnblogs.com/liuxuzzz/p/5324749.html

  • 相关阅读:
    C++ 抽象类二(抽象类的基本语法)
    C++ 抽象类一(多继承与赋值兼容性原则)
    C++ 类的多态五(多态的语法本质分析)
    C++ 类的多态四(虚析构函数的重要性)
    C++ 类的多态三(多态的原理--虚函数指针--子类虚函数指针初始化)
    MEF等Ioc框架引起内存泄露-PartCreationPolicy
    MEF部件的生命周期(PartCreationPolicy)
    wpf prism IRegionManager 和IRegionViewRegistry
    silverlight开发实例(Prism+MVVM+RIA)(二)--创建shell及用户登录
    Prism框架 如何在主程序中合理的弹出子窗体
  • 原文地址:https://www.cnblogs.com/straycats/p/8506959.html
Copyright © 2011-2022 走看看