Ubuntu 18.04 安装 Kubernetes1.18.3(未完结) - W

Ubuntu 18.04 安装 Kubernetes1.18.3(未完结)

分类:Kubernetes ; 热度:58 ; 最后更新于2020 年 06 月 08 日

wwww

Kubernetes 集群搭建

Kubernetes 1.18.3 集群搭建

Ubuntu 18.04 安装 Kubernetes1.18.3 。

Q:

why ubuntu ?

A:

学术这块,Ubuntu 用的比 CentOS 多。 笔者喜欢也习惯用 Ubuntu

网络上关于 Kubernetes 的搭建大部分都是基于 CentOS,所以在实践之后才有这篇文章

  1. 设备规划

    实体机 :one: 台236 ,虚机:three:台在156上。

    注:

    name 后带有 N 标志,是运行 NVIDIA-Docker

    未标志或带有D 的    ,是运行Docker

    156:其实就是同事 王 x 晓 退役的一台笔记本,配置如下:

    image-20200605094706605

    nameCPUMEMGPU InfoDiskremark
    236Di7-4710HQ
    2.50GHz
    16GBGeForce MX1102GB1Tmaster
    worker
    239Di7-4710HQ
    2.50GHz
    2GBNil60Gworker
    240Di7-4710HQ
    2.50GHz
    2GBNil60Gworker
    241Di7-4710HQ
    2.50GHz
    2GBNil60Gworker
  2. 集群搭建
  3. 单节点

    略。

    别问为什么,这种自慰的方式其实连官方都不推荐。

    如果缺少机器,可以联系笔者。笔者近期在公司内部孵化一个云计算平台 的内部项目

    可以给各位伙伴开几个虚拟。

  4. kubeadm 单主机多从机

    好了伙伴们,重头戏来了。

    如下命令如果没有特殊说明,则表明需要在所有机器上都执行一遍。

    talk again :

    Ubuntu 18.04

    注 Ubuntu 16.04 也适用此教程,因为 236 那台 Master,就是 16.04 的。

    • 申请管理员权限

      sudo su
    • 临时关闭交换空间

      swapoff -a
    • 关闭开机启动交换空间

    如果你有自己习惯的编辑器,可以不用 nano。

    • 输入下面的命令,打开 /etc/fstab 文件

      nano /etc/fstab
    • 输入下面的命令,打开 /etc/fstab 文件

      nano /etc/fstab
    • 注释掉 swap 开头的。ctrl+o 保存,ctrl+x 退出 Nano 编辑器
      image-20200605100222166
    • 关闭防火墙

      ufw disable
    • 配置 DNS

      nano /etc/systemd/resolved.conf

      取消 DNS 行注释,并增加 DNS 配置:180.76.76.76

    image-20200605100514253

    • 安装 Docker
      替换源,这里推荐清华大学的 mirrors 源

    清华大学 mirrors 源

    2020-05-02 北京外国语大学镜像站上线 , 新站,用户比较少,速度比较快

    替换源的步骤不再详细描述,清华大学开源镜像站里面有教程
    点我直达: Ubuntu 镜像使用帮助
    安装 Docker
    点我直达:Docker Community Edition 镜像使用帮助
    配置 Docker 加速器
    /etc/docker/daemon.json文件中,写入如下内容(提示没有就新建)

    {
      "registry-mirrors": ["https://z36sqtsa.mirror.aliyuncs.com"]
    }

    这是笔者的阿里云 Docker 镜像加速地址,你也可以自己申请

    重启 Docker

      systemctl restart docker
    • 安装 Kubernetes 必备工具 kubeadmkubeletkubectl

    阿里云官方教程地址:Kubernetes 镜像
    安装系统工具

    apt update && apt install -y apt-transport-https

    安装 GPG 证书

    curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -

    写入软件源;注意:我们 18.04 代号为 bionic,但目前没有 bionic 的 ubuntu 仓库,所以沿用 16.04 的 xenial

    cat << EOF >/etc/apt/sources.list.d/kubernetes.list
    deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
    EOF

    安装

    apt update && apt install -y kubelet kubeadm kubectl

    image-20200605115503892

    这里我的版本是目前最新的 1.18.3

    • 同步时间
      设置时区

      dpkg-reconfigure tzdata

    选 "Asia"
    image-20200605102747501

    选"Shanghai"
    image-20200605102834733
    时间同步

    apt-get install ntpdate

    设置系统时间与网络时间同步

    ntpdate cn.pool.ntp.org

    将系统时间写入硬件时间

    hwclock --systohc

    确认时间

    在所有机器上输入,查看时间是否是同步的

    date

    image-20200605103120639

    • 修改 cloud.cfg

    这一步的作用 : 防止重启后主机名还原
    如果你的电脑没有/etc/cloud/cloud.cfg文件,运行

    cloud-init --version

    如果提示没有cloud-init

    apt install cloud-init

    安装后,/etc/cloud/cloud.cfg文件就有了

    nano /etc/cloud/cloud.cfg

    preserve_hostname的值修改为true
    image-20200605103547909
    然后重启一下

    reboot
    • Master 和 Node 节点配置

    注意将 master 和 node 的节点 IP,设置成静态的
    静态 IP,ubuntu 18.04 的配置命令

    nano /etc/netplan/50-cloud-init.yaml

    image-20200605104211369
    ubuntu 16.04 的配置命令

    nano /etc/network/interfaces

    规划如下:

    master 的主机名:kubernetes-master

    node1 的主机名 :kubernetes-slave1

    node2 的主机名 :kubernetes-slave2

    node3 的主机名 :kubernetes-slave3

    修改主机名命令如下:
    在 master(236)上执行:

    hostnamectl set-hostname kubernetes-master

    在 node1(239)上执行

    hostnamectl set-hostname kubernetes-slave1

    其他的机器,同理。

    • 配置 hosts 文件

    所有机器都要更改 hosts

    nano /etc/hosts

    image-20200605104121381

    • 配置 kubernetes-master

    仅在 master 上执行

    • 进入/usr/local/目录创建kubernetes文件夹
    • 进入/usr/local/目录创建kubernetes文件夹

    image-20200605104850273

    • 在 kubernetes 文件里创建 cluster

    image-20200605105002145

    完整命令如下

    cd /usr/local;mkdir kubernetes;cd kubernetes;mkdir cluster;cd cluster;

    在 cluster 目录里创建并修改配置文件

    kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml

    上述命令会创建一个kubeadm.yml文件,在执行下述命令

    nano /usr/local/kubernetes/cluster/kubeadm.yml

    修改为自己 master 主机的 IP 和 k8s 国内阿里云镜像

    国内不能访问 Google,修改为阿里云

    增加一个配置

    imageRepository: registry.aliyuncs.com/google_containers

    注意:podSubnet的网络配置一定不能和你物理网络相同

    我的物理网络是 192.168.2.0/24
    所以我配置的是 192.168.10.0/24

    podSubnet: 192.168.10.0/24

    image-20200605105752762

    拉取所需镜像

    kubeadm config images pull --config kubeadm.yml

    安装主节点

    kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log

    执行上述命令初始化主节点,该命令指定了初始化时需要使用的配置文件,其中添加
    --upload-certs 参数可以在后续执行加入节点时自动分发证书文件。
    追加的 tee kubeadm-init.log 用以输出日志。
    image-20200605110023233
    红色圈圈,圈出来的地方是 node 节点需要执行的命令。
    我特地把这个图截得稍微大一点,我们从这张图的第一行英文开始读:

    你的 Kubernetes control-plane 已经初始化成功!

    要开始使用你的群集,您需要运行一下命令以一个常规用户:

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

    blah blah blah blah

    了解了 Kubernetes 跟我们说的话之后,剩下的就是执行上述命令,用普通用户
    验证是否成功

    kubectl get node

    image-20200605111022465

    • 安装 node 节点
      分别在 kubernetes-slave1、kubernetes-slave2、kubernetes-slave3 上执行命令(自己生成的)

    也就是上两张图的红色圈圈圈出来的,执行你自己的命令,执行我的没有效果

    下面我展示一下我的,不要复制,要用你自己的

    kubeadm join 192.168.2.236:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:2a746239f2a6eea34398025abcd41344c67f9e261da6e0dc082542eb3e436199

    在主节点查询集群

    kubectl get node

    你也可以在 node 节点执行上述命令,看看是不是会报如下错误:

    The connection to the server localhost:8080 was refused - did you specify the right host or port?

    出现这个问题的原因是 kubectl 命令需要使用 kubernetes-admin 来运行,而你的 kubeadm 没有相关配置文件

    解决办法:

    将主节点中的/etc/kubernetes/admin.conf文件拷贝到 node 节点相同目录下:

    scp -r /etc/kubernetes/admin.conf kubernetes-slave1:/etc/kubernetes/admin.conf

    配置环境变量

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

    立即生效

    source ~/.bashrc
    • 配置网络

    在 master 节点

    • 下载 Calico 配置文件

      wget https://docs.projectcalico.org/manifests/calico.yaml
    • 修改

      nano calico.yaml

      image-20200605112558611

      将文档里CALICO_IPV4POOL_CIDRvalue值,改成之前定义的podSubnet的值,

      这里我定义的是192.168.10.0/24

    • 让 k8s 安装网络环境

      kubectl apply -f calico.yaml
    • 查看网络环境是否安装成功

      kubectl get pods --all-namespaces

      STATUS 必须全部是 Running

      image-20200605112953428

    • 查看集群是否全部准备好

    STATUS 为:ready

    kubectl get node

    image-20200605113027340

    • 测试集群

      • 创建 nginx 的 Deployment

        touch nginx-deployment.yaml;nano nginx-deployment.yaml

        写入如下内容:

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: nginx-deployment
          labels:
            app: nginx
        spec:
          replicas: 2
          selector:
            matchLabels:
              app: nginx
          template:
            metadata:
              labels:
                app: nginx
            spec:
              containers:
                - name: nginx
                  image: nginx:1.14.2
                  ports:
                    - containerPort: 80
      • 开始部署

        kubectl create -f nginx-deployment.yaml
      • 发布服务,暴露端口

        kubectl expose deployment nginx-deployment --port=80 --type=LoadBalancer
      • 查看端口,打开浏览器

      输入如下命令查看端口

      kubectl get services --all-namespaces

      image-20200605113902356

      打开浏览器输入 masterIP:30484

      192.168.2.236:30484

      image-20200605113947512

      能成功访问,这个时候,你的集群就部署成功了,如果这个 nginx 你不想要了想把他删掉

      • 删除已部署的服务

        kubectl delete deployment nginx-deployment

      也可以执行

      kubectl delete -f nginx-deployment.yml
    • 集群配置错误,想重新开始配置

      • 在 master 节点上执行

        kubectl drain kubernetes-slave1 --delete-local-data --force --ignore-daemonsets;
        
        kubectl drain kubernetes-slave2 --delete-local-data --force --ignore-daemonsets;
        
        kubectl drain kubernetes-slave3 --delete-local-data --force --ignore-daemonsets;
        
        kubectl delete node kubernetes-slave1;
        kubectl delete node kubernetes-slave2;
        kubectl delete node kubernetes-slave3;
        
        kubeadm  reset;

      在子节点上执行

      kubeadm  reset

      根据提示,让你手动删除一下配置文件

      rm -rf /var/lib/cni/;
      rm -rf /etc/cni/net.d/;
      rm -rf ~/.kube/;
      rm -rf /home/{普通用户}/.kube/;

      注意替换上述命令最后一条:{普通用户}
      清除之后,建议重启所有机器,从第 10 节重新开始。

    • 安装 Dashboard

    Dashboard 可以给用户提供一个可视化的 Web 界面来查看当前集群的各种信息。
    用户可以用 k8sdashboard 部署容器化的应用,监控应用的状态,执行故障排查任务以及管理 k8s 各种资源。
    托管在:https://github.com/kubernetes/dashboard

    官网教程:Dashboard

    • 下载 yaml 文件

      这是目前最新的

      wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.1/aio/deploy/recommended.yaml
    • 修改 recommended.yaml 文件

      nano recommended.yaml

      image-20200605120414457

      找到kind: ServiceAccount这一行
      增加如下两行,在上图中圈出来的位置

      type: NodePort
      nodePort: 30005
    • 执行下列命令安装

      kubectl apply -f recommended.yaml

      等待一会,等他安装完成之后,查看 service

      kubectl get services --all-namespaces

      image-20200605121031941

    • 打开浏览器输入https://masterip:30005
      如:https://192.168.2.236:30005/#/login
      image-20200605121139456
    • 创建 Dashboard 用户,以便登录 Dashboard
      Dashboard 默认只支持 token 认证,所以如果使用 KubeConfig 文件,需要在该文件中指定 token,我们这里使用 token 的方式登录

      # 创建service account
      $ kubectl create sa dashboard-admin -n kube-system
      # 创建角色绑定关系
      $ kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
      # 查看dashboard-admin的secret名字
      $ ADMIN_SECRET=$(kubectl get secrets -n kube-system | grep dashboard-admin | awk '{print $1}')
      # 打印secret的token
      $ kubectl describe secret -n kube-system ${ADMIN_SECRET} | grep -E '^token' | awk '{print $2}'

      命令执行完,就会输入 Token,复制,去网页上粘贴,你会发现 你登陆成功了
      image-20200605121408897

    • 至此你的 Kubernetes 集群和 Dashboard 都已经安装好了
  5. keepalived 高可用集群
  6. Harbor
  7. ingress-nginx
  8. 业务迁移
  9. CICD
  10. 服务调度与编排
  11. 日志和监控
  12. Istio
  13. 总结

评论卡