ubuntu18.04.1 搭建kubernetes1.15.0集群(2019.07.10亲测)

ubuntu18.04.1 搭建kubernetes1.15.0集群(2019.07.10亲测)

  1. VMware生成三台虚拟机

    $ uname -a
    Linux k8s-node1 4.18.0-15-generic #16~18.04.1-Ubuntu SMP Thu Feb 7 14:06:04 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
    
  2. 准备工作
    2.1. 安装基本工具

    $ sudo apt update && \
    sudo apt -y upgrade && \
    sudo apt install -y vim \
    curl \
    apt-transport-https \
    ca-certificates \
    software-properties-common
    

    2.2. 更换dns管理服务

    $ sudo apt install -y unbound
    $ sudo systemctl stop systemd-resolved
    $ sudo systemctl disable systemd-resolved
    $ sudo rm -rf /etc/resolv.conf
    $ sudo vim /etc/NetworkManager/NetworkManager.conf
     # 在[main]下面添加
     dns=unbound
    # 重启生效
    $ reboot
    

    tips: 系统自带的systemd-resolved服务会将/etc/resolv.conf软链接到/run/systemd/resolv/stub-resolv.conf,并在里面写入localloop地址。而coredns会读取/etc/resolv.conf文件中的dns服务器地址,如果读到的是localloop,那么coredns会启动失败。当然有很多种方法来解决这个问题,这里采用禁用systemd-resolved,更换为unbound来管理dns服务

    2.2. 修改主机名

    # 按照自己的命名喜好,我的叫k8s-nodeX
    # 分别在三台机器上修改名字
    $ sudo hostnamectl set-hostname k8s-node1
    

    2.3. 修改/etc/sysctl.conf,配置数据包转发

    $ sudo vim /etc/sysctl.conf
    net.ipv4.ip_forward = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    

    使配置生效(但是reboot之后会自动失效)

    $ sudo modprobe br_netfilter
    $ sudo sysctl -p
    

    设置开机自动载入br_netfilter

    $ sudo vim /etc/init.d/load_br_netfilter.sh
      #!/bin/bash
      ### BEGIN INIT INFO
      # Provides:       svnd.sh
      # Required-Start: $local_fs $remote_fs $network $syslog
      # Required-Stop:  $local_fs $remote_fs $network $syslog
      # Default-Start:  2 3 4 5
      # Default-Stop:   0 1 6
      # Short-Description: starts the svnd.sh daemon
      # Description:       starts svnd.sh using start-stop-daemon
      ### END INIT INFO
      sudo modprobe br_netfilter
    
    $ sudo chmod 775 /etc/init.d/load_br_netfilter.sh
    $ sudo update-rc.d load_br_netfilter.sh defaults 90
    # 如果要取消开机自动载入模块
    $ sudo update-rc.d -f load_br_netfilter.sh remove
    

    2.4. 禁用swap

    $ sudo swapoff -a
    

    设置swap开机不启动

    $ sudo vim /etc/fstab
    # 注释掉swapfile这一行
    

    2.5. 关闭防火墙

    $ sudo ufw disable
    

    2.6. 禁用selinux

    $ sudo vim /etc/selinux/config
    SELINUX=disabled
    

    2.7. 安装docker 18.06.3-ce

    # 卸载旧版本的docker
    $ sudo apt remove docker docker-engine docker.io
    # 添加GPG key,用阿里云的
    $ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    # 添加镜像,用阿里云的
    $ sudo add-apt-repository \
    "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
    # 查看可用的docker版本
    $ apt-cache madison docker-ce
    # 安装docker
    $ sudo apt install -y docker-ce=18.06.3~ce~3-0~ubuntu
    # 设置开机启动
    $ sudo systemctl enable docker && sudo systemctl start docker
    # 将当前用户加入docker组
    $ sudo usermod -aG docker $(whoami)
    # 切换组
    $ newgrp docker
    

    2.8. 配置docker

    $ sudo vim /etc/docker/daemon.json
    {
        "log-driver":"json-file",
        "log-opts":{
          "max-size":"100m"
        },
        "storage-driver":"overlay2"
    }
    
  3. 安装kubeadm, kubectl, kubelet
    3.1. 配置源

    $ sudo curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
    $ sudo tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF'
    deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
    EOF
    $ sudo apt update
    

    3.2. 查看可用版本

    $ apt-cache madison kubeadm
    

    3.3. 安装指定版本

    $ sudo apt install -y kubelet=1.15.0-00 kubeadm=1.15.0-00 kubectl=1.15.0-00
    $ sudo apt-mark hold kubelet=1.15.0-00 kubeadm=1.15.0-00 kubectl=1.15.0-00
    

    3.4. 设置开机启动

    $ sudo systemctl enable kubelet && sudo systemctl start kubelet
    
  4. 启动集群
    4.1. 启动master节点

    $ kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.15.0 --pod-network-cidr=10.244.0.0/16
    

    tips:因为我们后面用的cni是flannel,所以这里网段要写10.244.0.0/16,和flannel的yaml文件中的配置保持一致,不然集群内部的数据转发会有问题。

    如果启动成功,则会得到类似下面信息

    kubeadm join 192.168.117.132:6443 --token ozbspb.7m5ux5qrzuhjw2ja \
    --discovery-token-ca-cert-hash sha256:ac17927e2c27730292dffb7719fb4ea0349bda3ed04d0c7e88eee98dfed2783c
    

    记下这些信息,需要在从节点上执行这条命令来加入集群

    tips: token默认有效期为24小时,如果失效了则执行下面命令重新生成token

    $ kubeadm token create --print-join-command
    

    4.2. 检查kubelet使用的driver是否和docker的一致

    tips:我这里用的是默认的cgroup,不过貌似官方推荐用systemd,如果需要手动更改的,参考:https://kubernetes.io/docs/setup/cri/

    查看docker的driver

    $ docker info | grep -i cgroup
    

    查看kubelet的driver

    $ sudo cat /var/lib/kubelet/kubeadm-flags.env
    

    4.3. 创建kubectl的配置文件

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

    4.4. 安装CNI flannel

    tips:不同cni的选择,参考:https://kubernetes.io/docs/concepts/cluster-administration/addons/

    $ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
    

    4.5. pod默认是不会被调度到master节点的,如果需要master节点也能被调度到,则需要去除master节点上面自带的taint

    $ kubectl taint nodes $(MASTER_NODE_HOST_NAME) node-role.kubernetes.io/master:NoSchedule-
    
  5. slave节点加入集群

    # 从节点上执行命令加入集群,如果token过期了,需要重新生成
    $ kubeadm join 192.168.117.132:6443 --token ozbspb.7m5ux5qrzuhjw2ja \
    --discovery-token-ca-cert-hash sha256:ac17927e2c27730292dffb7719fb4ea0349bda3ed04d0c7e88eee98dfed2783c
    
  6. 查看相关信息

    # 查看default namespace中nodes信息
    $ kubectl get nodes
    # 查看default namespace中pod信息
    $ kubectl get pods
    # 查看集群系统信息
    $ kubectl -n kube-system get pod
    # 更改配置
    $ kubectl -n kube-system edit cm 
    
  7. 安装nfs
    k8s中数据持久化方式有很多种,比如emptyDir,hostPath,还有各云服务商提供的网络存储方案。这里就简单的采用nfs,将各个容器中的数据持久化在nfs服务器上

    # 每台服务器都执行下面命令安装nfs
    $ sudo apt install nfs-kernel-server, nfs-common
    # $sharedDir是你要共享的目录
    # rw表示可读可写
    # no_root_squash表示root用户具有完全管理权限
    # async表示数据暂存在内存中,先不写入磁盘,可以提高性能
    $ sudo vim /etc/exports
      $sharedDir *(rw,no_root_squash,async)
    $ sudo systemctl start rpcbind.service
    $ sudo systemctl start nfs.service
    

你可能感兴趣的:(kubernetes)