通过kubeadm搭建Kubernetes(1.16.0版本)集群环境

  |   0 评论   |   浏览

安装Docker(所有节点)

  • Docker的安装
    CentOS 7下安装Docker及基础操作

    注意,不要安装最新的版本
    请结合Kubernets官方网站的文档说明,安装Kubernetes对于的Docker的版本;安装不匹配的版本,可能会出现问题,安装k8s的时候也会提示警告;这里安装的k8s 1.16.0,对应的Docker的版本查找方式如下

    • 进入Github的官方仓库
      Kubernetes github仓库

    • 找到对应的版本

      找到的你要安装的版本
      

      file

    • 找到Unchanged
      file

镜像制作

指定阿里云的镜像仓库(推荐)

// 只要docker安装好之后,不需要做过多的操作
// 在使用kubeadm init的时候 加上阿里云的仓库地址
// master节点安装的时候有详细说明
--image-repository registry.aliyuncs.com/google_containers

手动制作镜像

采用上面的方式可以忽略这个步骤!!
如果你扛的一手好梯子(科学上网),也可以忽略这一步;但是普遍情况下是无法访问到k8s.gcr.io进行镜像的下载;因此我们可以通过Docker的镜像转换为k8s的镜像;

  • 创建 k8s_pull.sh

    docker pull mirrorgooglecontainers/kube-apiserver-amd64:v1.16.0
    docker pull mirrorgooglecontainers/kube-controller-manager-amd64:v1.16.0
    docker pull mirrorgooglecontainers/etcd-amd64:3.3.15-0
    docker pull mirrorgooglecontainers/kube-scheduler-amd64:v1.16.0
    docker pull mirrorgooglecontainers/kube-proxy-amd64:v1.16.0
    docker pull mirrorgooglecontainers/pause:3.1
    docker pull coredns/coredns:1.6.2
    
    docker tag mirrorgooglecontainers/kube-apiserver-amd64:v1.16.0 k8s.gcr.io/kube-apiserver:v1.16.0
    docker tag mirrorgooglecontainers/kube-controller-manager-amd64:v1.16.0 k8s.gcr.io/kube-controller-manager:v1.16.0
    docker tag mirrorgooglecontainers/kube-scheduler-amd64:v1.16.0 k8s.gcr.io/kube-scheduler:v1.16.0
    docker tag mirrorgooglecontainers/kube-proxy-amd64:v1.16.0 k8s.gcr.io/kube-proxy:v1.16.0
    docker tag mirrorgooglecontainers/etcd-amd64:3.3.15-0 k8s.gcr.io/etcd:3.3.15-0
    docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
    docker tag coredns/coredns:1.6.2 k8s.gcr.io/coredns:1.6.2
    
    docker rmi mirrorgooglecontainers/kube-apiserver-amd64:v1.16.0 mirrorgooglecontainers/kube-controller-manager-amd64:v1.16.0 mirrorgooglecontainers/etcd-amd64:3.3.15-0  mirrorgooglecontainers/kube-scheduler-amd64:v1.16.0 mirrorgooglecontainers/kube-proxy-amd64:v1.16.0 mirrorgooglecontainers/pause:3.1 coredns/coredns:1.6.2
    
  • 下载镜像

    sh k8s_pull.sh
    

    file

准备工作

  • 基础配置

    • 设置hosts(每个节点都做)

      vi /etc/hosts
      //添加以下配置
      192.168.1.26 master
      192.168.1.22 node01
      192.168.1.21 node02
      
    • 设置hostnamectl(每个节点)

      // 在每个节点设置自己的主机名  即: /etc/hostname 下的值  设置好之后建议重启一下
      // 也可以在各个节点  vim /etc/hostname   进行修改
      hostnamectl set-hostname master
      hostnamectl set-hostname node01
      hostnamectl set-hostname node02
      
    • 关闭防火墙(测试环境)

      // 在内网网络环境安全的情况下,可以关闭防火墙 
      systemctl disable firewalld
      systemctl stop firewalld
      
    • 开放端口(生产)

      //防火墙对外开放以下端口
      //MASTER节点
      6443 Kubernetes API server 
      2379-2380 etcd server client API 
      10250 Kubelet API 
      10251 kube-scheduler 
      10252 kube-controller-manager 
      10255 Read-only Kubelet API (Heapster) 
      //Worker节点
      10250 Kubelet API 
      10255 Read-only Kubelet API (Heapster) 
      30000-32767 Default port range for NodePort Services. Typically, these ports would need to be exposed to external load-balancers, or other external consumers of the application itself.
      
    • 更新系统时间(每个节点)重要

      yum install -y ntpdate
      // 更新系统时间  时间不一致将无法加入到集群
      ntpdate time.windows.com
      // 将系统时间同步到硬件,防止系统重启后时间被还原
      hwclock --systohc
      
      // 由于部分机器重启之后系统时间会恢复 因此做以下设置
      // 添加定时任务,设置5分钟更新一次时间
      echo "*/5 * * * * /usr/sbin/ntpdate time.windows.com > /dev/null 2>&1" >> /var/spool/cron/root
      // 配置开机执行,电脑在开机之后会执行更新时间
      echo "/usr/sbin/ntpdate time.windows.com > /dev/null 2>&1" >> ~/.bashrc
      // 重启定时任务
      systemctl restart crond.service
      // 查看定时任务
      crontab -l
      
  • 主机禁用SELinux

    setenforce 0
    sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
    

    file

  • 禁用Swap

    swapoff -a # 临时
    sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab #永久
    
  • 配置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 -p /etc/sysctl.d/k8s.conf
    sysctl --system
    
  • 配置Kubernetes国内yum源

    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
    

    file

安装(所有节点)

  • 安装kubelet、kubeadm、kubectl

    // -后面跟的是版本,安装k8s匹配的版本
    yum install -y kubelet-1.16.0 kubeadm-1.16.0 kubectl-1.16.0
    

    file

  • Docker访问hub.docker.com不稳定的设置

    // 如果访问稳定的话可以不设置
    curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
    
  • 重启Docker

    systemctl daemon-reload && systemctl restart docker && systemctl enable docker
    
  • 启动 kubelet

    systemctl enable kubelet && systemctl start kubelet
    

部署主节点

  • 日志查看路径

    tail -f /var/log/messages
    
  • 初始化主节点

    kubeadm init \
    --apiserver-advertise-address=192.168.1.26 \
    --image-repository registry.aliyuncs.com/google_containers \
    --kubernetes-version=v1.16.0 \
    --service-cidr=10.96.0.0/12 \
    --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=Swap
    
    // --apiserver-advertise-address apiserver的地址,也就是master节点的地址
    // --image-repository 指定镜像仓库的地址
    // --kubernetes-version k8s的版本
    // --pod-network-cidr=10.244.0.0/16  后面使用flannel作为网络插件 这里指定pod的网络
    // --service-cidr service的网络
    // --ignore-preflight-errors=Swap 忽略swap的错误
    

    file
    安装成功之后,docker ps可以看到以下运行的容器
    file

  • node加入集群的指令(注意!!! 以下的这部分很重要)

    成功日志的最后一行为node节点加入的指令

    kubeadm join 192.168.1.22:6443 --token 91bfpw.smdtbfzc5ebsyldr \
      --discovery-token-ca-cert-hash sha256:a769a93dbec36b321195398380b590787cae98e9eb408d1fdb9e52af8c58d2dd
    
    • 查看token

      //在master节点执行以下指令 
      kubeadm token list
      

      file

    • 创建一个新的token

      //创建一个临时token(24小时失效)
      kubeadm token create
      // 创建一个永久有效的token
      kubeadm token create --ttl 0 --print-join-command
      

      file

  • 复制配置文件到普通用户的host目录

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
  • 验证configmap

    kubectl get -n kube-system configmap
    

    file

  • 安装网络插件

    // 建议先按以下方式下载,避免耗时
    docker pull pengfeilu/flannel:v0.11.0-amd64
    docker tag pengfeilu/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64
    docker rmi pengfeilu/flannel:v0.11.0-amd64
    
    // 或者直接下载
    docker pull quay.io/coreos/flannel:v0.11.0-amd64
    
    // 再执行
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    // 上面的指令执行成功之后需要等几分钟之后相关pod才能正常启动,下面是启动前后的截图
    kubectl get pods -n kube-system
    
    // 下载成功之后就不用管了,k8s会自动将镜像启动的
    // 同理,如果node节点更新失败,也可以手动下载镜像
    

    file

Node节点部署

  • 准备工作

    从本文的开始到镜像制作的部分都在Node节点上执行一遍;也就是准备工作部分安装部分镜像准备部分都与主节点操作一致

  • 加入主节点

    • 通过Master启动时的指令

      kubeadm join 192.168.1.22:6443 --token 91bfpw.smdtbfzc5ebsyldr \
      --discovery-token-ca-cert-hash sha256:a769a93dbec36b321195398380b590787cae98e9eb408d1fdb9e52af8c58d2dd \
      --ignore-preflight-errors=Swap
      

      file

    • 更多节点同上操作即可

  • 主节点查看节点情况

    kubectl get nodes
    // 出现下图说明集群环境已经正常
    

    file

  • 查看端口占用情况

    // 查看当前主机的那些端口被占用了
    ss -tnl
    // 根据端口号查询对应的进程id
    ss -lnp | grep 端口号
    

重装Master

master安装可能因为一些配置的问题导致失败,但是由于master是由很多模块组成,因此可能装到一半,因为一些异常导致安装失败,再次安装的时候,可能会报端口被占用的情况;可以使用下面的指令重装

kubeadm reset

file

// 查询初始化安装
kubeadm init --config kubeadm.yaml
  • 重装可能出现的错误

    [kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp [::1]:10248: connect: connection refused.
    

    file

    解决方案可参考可参考:https://cloud.tencent.com/developer/article/1454325

其他错误

  • python版本错误

    yum 安装的时候 出现以下错误
    

    file

    //vim /usr/bin/yum
    //将第一行的python版本
    #!/usr/bin/python
    //改为下面这一行
    #!/usr/bin/python2.7
    
    //vim /usr/libexec/urlgrabber-ext-down   修改同上
    
  • 关闭Swap

    swapoff -a
    yes | cp /etc/fstab /etc/fstab_bak
    cat /etc/fstab_bak |grep -v swap > /etc/fstab
    

    file

  • Swap错误

    //启动指令加上  --ignore-preflight-errors=Swap
    

    file

  • SELINUX禁用错误

    准备工作的时候有说道相关错误
    

    file

  • Docker Cgroup Driver

    sed -i "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g" /usr/lib/systemd/system/docker.service
    

    file


到此使用kubeadm搭建的kubernetes集群完成!!!



标题:通过kubeadm搭建Kubernetes(1.16.0版本)集群环境
作者:码霸霸
地址:https://lupf.cn/articles/2019/11/23/1574512937074.html