美文网首页
kubernetes1.9.6墙内离线部署(附资源)

kubernetes1.9.6墙内离线部署(附资源)

作者: Feel_狗焕 | 来源:发表于2018-04-03 11:44 被阅读1609次

    简介:

    k8s新的版本与之前1.5的部署方式发生改变,官方将kubernetes大组件中的服务例如(kube-proxy、kube-api等服务)剥离出来封装成容器的形式来简化部署的方式。以下为三个必装的服务:

    kubelet #----运行在 Cluster 所有节点上,主要负责启动 Pod 和容器。新版的的k8s默认将cadvisor集成到kubelet中了,我们只需要开放相应的端口(4194)即可。
    kubeadm #--用于初始化和引导Cluster(是官方推出快速部署k8s集群,其本质是将k8s的相关服务容器化)
    kubectl #----是 Kubernetes 命令行工具与api交互。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件


    1. 部署环境:

    centos7.3、docker-ce-17-03.0、kubelet-1.9.6-0、kubeadm-1.9.6-0、kubectl-1.9.6-0

    ka8-master:192.168.100.135

    k8s-node:192.168.100.134

    注意:两台机器的时间一定要一致,并且docker-ce的版本不能大于17.03,docker可以使用官方的源进行安装,安装的时候指定需要安装的版本,或者使用rpm包安装即可。

    k8s需要用到的镜像已经打包好上传到云盘:

    链接: https://pan.baidu.com/s/1CVuCwX3Fl-VcUxftXPEN1g 密码: 56a3


    2. 安装部署:

    1)、前期环境配置:

    按照官方的方式安装会失败因为使用k8s源在Google上,这里我们可以使用阿里云的源来进行yum安装必要的三个组件。

    • Master和Node上操作如下:
    ##关闭防火墙:
    $systemctl stop firewalld
    $systemctl disable firewalld
    
    ##关闭swap:
    $swapoff -a 
    $sed -i 's/.*swap.*/#&/' /etc/fstab
    
    ##关闭selinux:
    $setenforce  0
    
    ##添加kubernetes源
    $cat:
    cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
           http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    
    ## 安装iptables
    $ yum install iptables-services -y 
    ## 将/etc/sysconfig/iptables规则改成如下:
    # Generated by iptables-save v1.4.21 on Fri Apr 13 17:36:35 2018
    *nat
    :PREROUTING ACCEPT [0:0]
    :INPUT ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    :POSTROUTING ACCEPT [0:0]
    COMMIT
    # Completed on Fri Apr 13 17:36:35 2018
    # Generated by iptables-save v1.4.21 on Fri Apr 13 17:36:35 2018
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A INPUT -p tcp -m tcp --dport 1:65535 -j ACCEPT
    -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -p icmp -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
    -A OUTPUT -p tcp -m tcp --sport 1:65535 -j ACCEPT
    COMMIT
    
    ## 启用iptables
    $ systemctl start iptables &&  iptables -P FORWARD -ACCEPT &&systemctl enable iptables
    
    注意:这里这样操作是为了不让iptables拦截我们需要开放的端口,以及将FORWARD表设置为默认转发,
    用于跨主机pod之间的通信。
    

    2)、Master和Node上安装docker-ce并导入镜像:
    ##安装docker-ce:
    $rpm -ihv docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm
    $rpm -ivh docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm
    
    ##启动docker-ce
    $systemctl start docker
    $systemctl enable docker
    
    ##解压下载的镜像包:
    $tar -jvxf k8s-1.9.6-images.tar.bz2
    $cd k8s-1.9.6-images
    
    ##导入所需要的镜像包:
    $docker load <etcd-amd64_3.1.11.tar
    $docker load < flannel_v0.10.0-amd64.tar
    $docker load < k8s-dns-dnsmasq-nanny-amd64_v1.14.7.tar
    $docker load < k8s-dns-kube-dns-amd64_1.14.7.tar
    $docker load < k8s-dns-sidecar-amd64_1.14.7.tar
    $docker load < kube-apiserver-amd64_v1.9.6.tar
    $docker load < kube-controller-manager-amd64_v1.9.6.tar
    $docker load < kube-proxy-amd64_v1.9.6.tar
    $docker load < kubernetes-dashboard-amd64_v1.8.3.tar
    $docker load < kube-scheduler-amd64_v1.9.6.tar
    $docker load < pause-amd64_3.0.tar
    
    

    为了加快(toulan)导入镜像的效率,写了一个简单的脚本来一键导入,需要在上文解压的镜像包目录(k8s-1.9.6-images)下创建脚本并且执行,例如在master上执行/root/k8s-1.9.6-images/dockerload-images.sh选择1即可。

    #!/bin/bash
    declare serial
    PS3="Enter a Number:"
    serial=(1 2)
    script_path=$(cd $(dirname $0) && pwd)
    
    select var in "master" "node"
    do
       if ! echo ${serial[@]} | grep -q $REPLY;then
       echo "Error Number,Please Enter[1-2]"
       continue
       fi
       case $var in
       master)
          echo "this is master"
          docker load < ${script_path}/etcd-amd64_3.1.11.tar
          docker load < ${script_path}/flannel_v0.10.0-amd64.tar
          docker load < ${script_path}/k8s-dns-dnsmasq-nanny-amd64_v1.14.7.tar
          docker load < ${script_path}/k8s-dns-kube-dns-amd64_1.14.7.tar
          docker load < ${script_path}/k8s-dns-sidecar-amd64_1.14.7.tar
          docker load < ${script_path}/kube-apiserver-amd64_v1.9.6.tar
          docker load < ${script_path}/kube-controller-manager-amd64_v1.9.6.tar
          docker load < ${script_path}/kube-proxy-amd64_v1.9.6.tar
          docker load < ${script_path}/kubernetes-dashboard-amd64_v1.8.3.tar
          docker load < ${script_path}/kube-scheduler-amd64_v1.9.6.tar
          docker load < ${script_path}/pause-amd64_3.0.tar
          break
          ;;
       node)
          docker load < ${script_path}/etcd-amd64_3.1.11.tar
          docker load < ${script_path}/flannel_v0.10.0-amd64.tar
          docker load < ${script_path}/k8s-dns-dnsmasq-nanny-amd64_v1.14.7.tar
          docker load < ${script_path}/k8s-dns-kube-dns-amd64_1.14.7.tar
          docker load < ${script_path}/k8s-dns-sidecar-amd64_1.14.7.tar
          docker load < ${script_path}/kube-apiserver-amd64_v1.9.6.tar
          docker load < ${script_path}/kube-proxy-amd64_v1.9.6.tar
          docker load < ${script_path}/kubernetes-dashboard-amd64_v1.8.3.tar
          docker load < ${script_path}/pause-amd64_3.0.tar
          break
          ;;
       *)
          break
          ;;
       esac
    
    done
    

    3)、Master和Node节点安装k8s:
    • Master和Node节点修改参数
    ##修改内核两个参数(这两个是参数是防止应用部署在centos系统情况下由于iptables被绕过而导致的路由错误)
    简单的说就是使流过网桥的流量也进入iptables/netfilter框架中:
    cat <<EOF >  /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    
    $sysctl --system
    
    ##yum安装必要的三个组件:
    yum install -y kubelet-1.9.6-0  kubectl-1.9.6-0 kubeadm-1.9.6-0
    
    ##确保kubelets使用的cgroup-driver和docker使用的cgroup-driver一样:
    $sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
    
    ##开启k8s默认的cAdvisor服务,开放kubelet 4194端口:
    编辑:vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 修改如下:
    Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=4194"
    
    ##启动kubelet服务:
    $systemctl daemon-reload
    $systemctl start kubelet
    $systemctl enable kubelet
    

    4)、集群初始化:
    • master上执行如下进行初始化:
    $kubeadm init --apiserver-advertise-address 192.168.100.135 --pod-network-cidr=10.244.0.0/16 --kubernetes-version 1.9.6
    --apiserver-advertise-address #--指明用Master的哪个interface与Cluster 的其他节点通信
    --pod-network-cidr #---指定Pod网络的范围k8s支持多种网络方案不同的网络方案对这个配置有不同的要求,这里设置为 10.244.0.0/16是因为我们将使用flanne 网络方案,所以设置成这个 CIDR。
    --kubernetes-version #--指定k8s版本
    
    ## 要是初始化失败的话执行如下命令后再重新开始初始化
    $ kubeadm reset
    
    
    image.png

    按照上面提示,此时root用户还不能使用kubelet控制集群,需要配置下环境变量:

    ##对于非root用户:
    $mkdir -p $HOME/.kube
    $cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    $chown $(id -u):$(id -g) $HOME/.kube/config
    
    ##对于root用户:
    $echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile 
    $source ~/.bash_profile
    
    ##测试下:
    $kubectl version
    

    显示如下表示正常:


    image.png
    • 部署pod网络:
    #Master上执行:
    $kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    
    • Node节点上执行如下加入:
    #node节点注册加入:
    $kubeadm join --token 0428e2.35a3db294493bfdb 192.168.100.135:6443 --discovery-token-ca-cert-hash sha256:d598c1b5229bc1e3b118bed424a5f369cbbb61c03072dcd126f209ca7b5efbba
    
    ##这里的token为我们在maste初始化时候给出的token,若是忘记或者关闭了master窗口没记录下来可以在master上执行如下来获取token加入:
    $kubeadm token list
    
    • Master上查看各节点状态:
    image.png

    从上图中看目前所有节点都是 NotReady,这是因为每个节点都需要启动若干组件,这些组件都是在 Pod 中运行,

    都需要先从google下载镜像,这里由于我们已经将需要的镜像导入到本地,所以可以正常运行这些pod。

    若遇到过了一段时间还处于NotReady我们可以通过如下命令查看 Pod 的状态:

    kubectl get pod --all-namespaces

    image.png

    对于存在问题的pod可以执行如下命令来查看具体的详细原因:

    kubectl describe pod kube-flannel-ds-snfxj --namespace=kube-system

    这里就不贴出来我的pod问题图片(因为我node节点忘记导入需要的镜像了............-_-!)

    集群正常的健康状态是这样子滴:

    image.png

    3.kubernetes-dashboard部署:

    • Master上执行如下:
    #给master主机设置一个label用来后面部署dashborad的时候指定部署到master主机上,防止部署到node节点上
    $kubectl label nodes k8s-master master=node1
    
    #用于部署kubernetes-dashboard的yaml文件也在刚刚下载的压缩包里面,所以一样进入k8s-1.9.6-images目录
    $kubectl create -f kubernetes-dashboard.yaml
    
    注意:设置label是因为我修改了kubernetes-dashboard.yaml,防止部署到node节点上去,到时候还得修改其他配置,麻烦
    (-_-),压缩包中的该配置文件我已经改成如下,若不想(aojiao)设置label和上面的一样,需要自行修改。
    
    image.png

    访问:https://192.168.100.135:32666


    image.png
    • kubernetes-dashboard的认证:
      dashboard的认证可以基于kubeconfig文件、口令、基本(用户名和密码)这三种方式的认证。根据官网说是可以支持basic的认证,但是我在这个版本下试了下没成功,所以这里我就使用了基于口令的方式来认证。

    3.1、基于口令的方式部署:

    ## 我们先删除前面创建的dashboard:
    kubectl delete -f kubernetes-dashboard.yaml
    

    从官网下载的1.8.3的dashboard的yaml配置文件默认是开启basic的认证,没有基于口令
    的方式,我们使用基于口令认证的方式前提需要将kubernetes-dashboard.yaml文件中
    的basic这行注释掉。
    如下图:


    image.png

    1)、## 这里创建一个dashboard的资源:

    $ kubectl create -f kubernetes-dashboard.yaml
    

    2)、## 创建一个基于RBAC认证的角色绑定资源:

    $ vim Dashboard-ServiceAccount-ClusterRoleBind.yaml
    添加如下内容:
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: admin-user
      namespace: kube-system
    
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
      name: admin-user
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
    - kind: ServiceAccount
      name: admin-user
      namespace: kube-system
    
    ## 创建该资源
    $ kubectl create -f Dashboard-ServiceAccount-ClusterRoleBind.yaml
    

    3)、 ## 获取上面创建的用户(admin-user)的Token

    $ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
    

    4)、## 打开https://ip:32666=>选择口令=>输入上面的口令即可:

    image.png image.png

    3.2、基于账户信息的方式部署:
    之前发现基于basic方式部署的dashboard方式发现是验证信息的文件中的密码和账户位置搞错了。。。。。
    1)、## 创建静态密码文件,密码文件格式为csv格式:

    $ vim /etc/kubernetes/pki/basic_auth_file
    admin,admin,2004
    
    注意:格式为 密码,账户,id
    

    这里将静态文件放在/etc/kubernetes/pki/目录下的原因是,apiserver通过容器启动,这个路径已经挂载容器中了,可以被访问到。放在其他路径需要额外配置挂载路径。apiserver只会启动在master节点上,故仅需要在master节点上配置即可。

    2)、###开启api server的basic认证:

    $ vim /etc/kubernetes/manifests/kube-apiserver.yaml 
    添加如下一行参数配置
        - --basic-auth-file=/etc/kubernetes/pki/basic_auth_file
    

    注意1:
    在修改完apiserver后执行相关的命令kubectl get node,多半是执行不成功的,因为修改apiserver配置文件后,apiserver自动重启,然后启动失败,所以就无法访问集群了。这里我们可以手动来重启apiserver的容器,使用docker命令来重启apiserver的容器,最后在将kubelet服务重启下既可。

    注意2:
    要是修改了账户的密码后不重启apiserver新修改的密码将不会生效。

    3)、###创建账户映射:
    这里是为了进行权限的授权,这里暂时不多讲,后期会对认证机制进行详细的讲解。

    $ vim basic-auth-admin-clusterrolebinding.yaml
    添加如下内容:
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
      name: ClusterRoleBinding-admin
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
    - kind: User
      name: admin
      apiGroup: rbac.authorization.k8s.io
    
    $ kubectl create -f basic-auth-admin-clusterrolebinding.yaml
    

    4)、###修改dashboard认证配置:
    开启dashboard的两个验证,若只开一个basic会导致访问出错


    basic.png

    删除之前的dashboard然后在重新创建一个dashboard既可:


    basic-login.png

    小白初次入门,文章存在不妥之处还望各路大牛多踩踩,一定要多踩踩,多踩踩:)

    参考:

    https://kubernetes.io/docs/reference/access-authn-authz/authentication/#static-password-file

    相关文章

      网友评论

          本文标题:kubernetes1.9.6墙内离线部署(附资源)

          本文链接:https://www.haomeiwen.com/subject/tjkqhftx.html