zoukankan      html  css  js  c++  java
  • ubuntu 安装k8s 1.22.3 (VirtualBox虚拟机)

    前言

    本文介绍如何在ubuntu上部署k8s集群,大致可以分为如下几个步骤:

    • 修改ubuntu配置

    • 安装docker

    • 安装kubeadmkubectl以及kubelet

    • 初始化master节点

    • slave节点加入网络

    如果你对上面的某些名字感到陌生,没关系,下文会一一进行讲解,如果你想先了解一下 docker 和 k8s,可以参考 10分钟看懂Docker和K8S。好了,在正式开始之前,首先看一下我们都有哪些服务器,如果你对如何组建如下虚拟机网络感兴趣的话,可以参考 virtualbox 虚拟机组网

    主机名主机ip版本CPU内存
    master1 192.168.56.11 Ubuntu server 18.04 2核 1G
    worker1 192.168.56.21 Ubuntu server 18.04 2核 1G

    因为k8s分为管理节点和工作节点,所以我们将要 master1上部署管理节点,在worker1上部署工作节点。如果想了解如何创建这两个节点,可以参考 virtualbox 虚拟机组网 。服务器配置上,k8s 要求 CPU 最低为 2 核,不然在安装过程中会报错,虽然这个错误可以避免,但是为了稳定起见还是把虚拟机的配置成它想要的,至于内存 k8s 没有硬性要求,所以我就按我电脑的性能来分配了。

    注意,本文的 docker、k8s 等软件安装均未指定具体版本,在本文完成时2021/11/11,下载到的版本如下,如有特殊版本需要请自行指定版本。

    软件名版本
    docker 20.10.10
    kubectl 1.22.3
    kubeadm 1.22.3
    kubelet 1.22.3

    一. 修改 ubuntu 配置

    首先,k8s 要求我们的 ubuntu 进行一些符合它要求的配置。很简单,包括以下两步:关闭 Swap 内存 以及 配置免密登录,这一步两台主机都需要进行配置。

    关闭 swap 内存

    这个swap其实可以类比成 windows 上的虚拟内存,它可以让服务器在内存吃满的情况下可以保持低效运行,而不是直接卡死。但是 k8s 的较新版本都要求关闭swap。所以咱们直接动手,修改/etc/fstab文件:

     

    sudo vi /etc/fstab

    你应该可以看到如下内容,把第二条用#注释掉就好了,注意第一条别注释了,不然重启之后系统有可能会报file system read-only错误。

     

    UUID=e2048966-750b-4795-a9a2-7b477d6681bf /   ext4    errors=remount-ro 0    1
    # /dev/fd0       /media/floppy0 auto   rw,user,noauto,exec,utf8 0       0

    然后输入reboot重启即可,重启后使用top命令查看任务管理器,如果看到如下KiB Swap后均为 0 就说明关闭成功了。

    img

    关闭swap之后的任务管理器

    上面说的是永久关闭swap内存,其实也可以暂时关闭,使用swapoff -a命令即可,效果会在重启后消失。

    配置免密登录

    k8s 要求 管理节点可以直接免密登录工作节点 的原因是:在集群搭建完成后,管理节点的 kubelet 需要登陆工作节点进行操作。而至于怎么操作很简单,这里就不详提了,可以参见文章 virtualbox 虚拟机组网 的最后一个章节 免密钥登录

    二. 安装 docker

    docker 是 k8s 的基础,在安装完成之后也需要修改一些配置来适配 k8s ,所以本章分为 docker 的安装docker 的配置 两部分。如果你已经安装并使用了一段时间的 docker 了话,建议使用docker -v查看已安装的 docker 版本,并在 k8s 官网上查询适合该版本的 k8s 进行安装。这一步两台主机都需要进行安装。

    docker 的安装

    docker 在 ubuntu 的安装上真是再简单不过了,执行如下命令即可,在安装之前请记得把镜像源切换到国内。

     

    sudo apt install docker.io

    等安装完成之后使用docker -v来验证 docker是否可用。

    docker 的配置

    安装完成之后需要进行一些配置,包括 切换docker下载源为国内镜像站 以及 修改cgroups

    这个cgroups是啥呢,你可以把它理解成一个进程隔离工具,docker就是用它来实现容器的隔离的。docker 默认使用的是cgroupfs,而 k8s 也用到了一个进程隔离工具systemd,如果使用两个隔离组的话可能会引起异常,所以我们要把 docker 的也改成systemd

    这两者都是在/etc/docker/daemon.json里修改的,所以我们一起配置了就好了,首先执行下述命令编辑daemon.json

     

    sudo vi /etc/docker/daemon.json

    打开后输入以下内容:

     

    {
     "registry-mirrors": [
       "https://dockerhub.azk8s.cn",
       "https://reg-mirror.qiniu.com",
       "https://quay-mirror.qiniu.com"
    ],
     "exec-opts": [ "native.cgroupdriver=systemd" ]
    }

    然后:wq保存后重启 docker:

     

    sudo systemctl daemon-reload
    sudo systemctl restart docker

    然后就可以通过docker info | grep Cgroup来查看修改后的 docker cgroup 状态,发现变为systemd即为修改成功。

    三. 安装 k8s

    安装完了 docker 就可以下载 k8s 的三个主要组件kubeletkubeadm以及kubectl了。这一步两台主机都需要进行安装。先来简单介绍一下这三者:

    • kubelet: k8s 的核心服务

    • kubeadm: 这个是用于快速安装 k8s 的一个集成工具,我们在master1worker1上的 k8s 部署都将使用它来完成。

    • kubectl: k8s 的命令行工具,部署完成之后后续的操作都要用它来执行

    其实这三个的下载很简单,直接用apt-get就好了,但是因为某些原因,它们的下载地址不存在了。所以我们需要用国内的镜像站来下载,也很简单,依次执行下面五条命令即可:

     

    # 使得 apt 支持 ssl 传输
    apt-get update && apt-get install -y apt-transport-https
    # 下载 gpg 密钥
    curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
    # 添加 k8s 镜像源
    cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
    deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
    EOF
    # 更新源列表
    apt-get update
    # 下载 kubectl,kubeadm以及 kubelet
    apt-get install -y kubelet kubeadm kubectl

    直接在/etc/apt/sources.list里添加https://mirrors.aliyun.com/kubernetes/apt/是不行的,因为这个阿里镜像站使用的ssl进行传输的,所以要先安装apt-transport-https并下载镜像站的密钥才可以进行下载。

    四. 安装 master 节点

    下载完成后就要迎来重头戏了,初始化master节点,这一章节只需要在管理节点上配置即可,大致可以分为如下几步:

    • 初始化master节点

    • 部署flannel网络

    • 配置kubectl工具

    初始化 master 节点

    使用kubeadminit命令就可以轻松的完成初始化,不过需要携带几个参数,如下。先不要直接复制执行,将赋值给--apiserver-advertise-address参数的 ip 地址修改为自己的master主机地址,然后再执行。

     

    kubeadm init 
    --apiserver-advertise-address=192.168.56.11
    --image-repository registry.aliyuncs.com/google_containers
    --pod-network-cidr=10.244.0.0/16

    这里介绍一下一些常用参数的含义:

    • --apiserver-advertise-address: k8s 中的主要服务apiserver的部署地址,填自己的管理节点 ip

    • --image-repository: 拉取的 docker 镜像源,因为初始化的时候kubeadm会去拉 k8s 的很多组件来进行部署,所以需要指定国内镜像源,下不然会拉取不到镜像。

    • --pod-network-cidr: 这个是 k8s 采用的节点网络,因为我们将要使用flannel作为 k8s 的网络,所以这里填10.244.0.0/16就好

    • --kubernetes-version: 这个是用来指定你要部署的 k8s 版本的,一般不用填,不过如果初始化过程中出现了因为版本不对导致的安装错误的话,可以用这个参数手动指定。

    • --ignore-preflight-errors: 忽略初始化时遇到的错误,比如说我想忽略 cpu 数量不够 2 核引起的错误,就可以用--ignore-preflight-errors=CpuNum。错误名称在初始化错误时会给出来。

    当你看到如下字样是,就说明初始化成功了,请把最后那行以kubeadm join开头的命令复制下来,之后安装工作节点时要用到的,如果你不慎遗失了该命令,可以在master节点上使用kubeadm token create --print-join-command命令来重新生成一条。

     

    Your Kubernetes master has initialized successfully!

    To start using your cluster, you need to run the following as a regular user:

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

    You should now deploy a pod network to the cluster.
    Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
     https://kubernetes.io/docs/concepts/cluster-administration/addons/

    You can now join any number of machines by running the following on each node
    as root:

    kubeadm join 192.168.56.11:6443 --token wbryr0.am1n476fgjsno6wa --discovery-token-ca-cert-hash sha256:7640582747efefe7c2d537655e428faa6275dbaff631de37822eb8fd4c054807

    如果在初始化过程中出现了任何Error导致初始化终止了,使用kubeadm reset重置之后再重新进行初始化。

    配置 kubectl 工具

    这一步就比较简单了,直接执行如下命令即可:

     

    mkdir -p /root/.kube && 
    cp /etc/kubernetes/admin.conf /root/.kube/config

    执行完成后并不会刷新出什么信息,可以通过下面两条命令测试 kubectl是否可用:

     

    # 查看已加入的节点
    kubectl get nodes
    # 查看集群状态
    kubectl get cs

    部署 flannel 网络

    flannel是什么?它是一个专门为 k8s 设置的网络规划服务,可以让集群中的不同节点主机创建的 docker 容器都具有全集群唯一的虚拟IP地址。想要部署flannel的话直接执行下述命令即可:

     

     

    flannel地址:
    https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

    kubectl apply -f kube-flannel.yml

    输出如下内容即为安装完成:

     

    至此,k8s 管理节点部署完成。

    五. 将 slave 节点加入网络

    首先需要重复步骤 1 ~ 3 来安装 docker 、k8s 以及修改服务器配置,之后执行从步骤 4 中保存的命令即可完成加入,注意,这条命令每个人的都不一样,不要直接复制执行:

     

    kubeadm join 192.168.56.11:6443 --token wbryr0.am1n476fgjsno6wa --discovery-token-ca-cert-hash sha256:7640582747efefe7c2d537655e428faa6275dbaff631de37822eb8fd4c054807

    待控制台中输出以下内容后即为加入成功:

     

    This node has joined the cluster:
    * Certificate signing request was sent to apiserver and a response was received.
    * The Kubelet was informed of the new secure connection details.
    Run 'kubectl get nodes' on the master to see this node join the cluster.

    随后登录master1查看已加入节点状态,可以看到worker1已加入,并且状态均为就绪。至此,k8s 搭建完成:

     

    root@master1:~# kubectl get nodes
    NAME      STATUS   ROLES    AGE    VERSION
    master1   Ready    master   145m   v1.22.3
    worker1   Ready    <none>   87m    v1.22.3

    默认网卡问题修复

    如果你是使用virtualBox部署的虚拟机,并且虚拟机直接无法使用网卡1的 ip 地址互相访问的话(例如组建双网卡,网卡1为 NAT 地址转换用来上网,网卡2为Host-only,用于虚拟机之间访问)。就需要执行本节的内容来修改 k8s 的默认网卡。不然会出现一些命令无法使用的问题。如果你的默认网卡可以进行虚拟机之间的相互访问,则没有该问题。

    修改 kubelet 默认地址

    访问kubelet配置文件:

     

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

    在最后一行ExecStart 之前 添加如下内容:

     

    Environment="KUBELET_EXTRA_ARGS=--node-ip=192.168.56.21"

    重启kubelet

     

    systemctl stop kubelet.service && 
    systemctl daemon-reload &&
    systemctl start kubelet.service

    至此修改完成,更多信息详见 kubectl logs、exec、port-forward 执行失败问题解决

    修改 flannel 的默认网卡

    编辑flannel配置文件

     

    sudo kubectl edit daemonset kube-flannel-ds -n kube-system

    找到spec.template.spec.containers.args字段并添加--iface=网卡名,例如我的网卡是enp0s8

     

    - args:
     - --ip-masq
     - --kube-subnet-mgr
     # 添加到这里
     - --iface=enp0s8

    :wq保存修改后输入以下内容删除所有 flannel,k8s 会自动重建:

     

    kubectl delete pod -n kube-system -l app=flannel

    至此修改完成,更多内容请见 解决k8s无法通过svc访问其他节点pod的问题

     

    测试

    docker get node
    docker pull nginx
    kubectl create deployment nginx --image=nginx
    kubectl get pod

     

    1- 安装dashboard

    dashboard地址:https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml

    kind: Service
    apiVersion: v1
    metadata:
      labels:
          k8s-app: kubernetes-dashboard
      name: kubernetes-dashboard
      namespace: kubernetes-dashboard
    spec:
      type: NodePort # 添加内容
      ports:
          - port: 443
            nodePort: 30001 # 添加内容
            targetPort: 8443
      selector:
      k8s-app: kubernetes-dashboard    

     

    2- 修改后完整文件内容:

    kubectl apply -f recommended.yml

    3- 查看

    kubectl get svc -n kubernetes-dashboard

     

     

    NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
    dashboard-metrics-scraper   ClusterIP   10.105.240.105   <none>        8000/TCP       2m53s
    kubernetes-dashboard       NodePort    10.105.193.180   <none>        443:30043/TCP   2m53s

    4- 浏览器登录

    https://192.168.56.111:30043/

     

     

    5- 生成dashboard登陆的token

    kubectl create serviceaccount dashboard-admin -n kube-system

    kubectl create clusterrolebinding dashboard-admin
    --clusterrole=cluster-admin
    --serviceaccount=kube-system:dashboard-admin


    kubectl get secret -n kube-system

    # 找到dashboard-admin-token-klk6z

    kubectl describe secret dashboard-admin-token-klk6z -n kube-system
    # 把token输入,登陆

     

    以上内容,基本安装完成。

     

    6- 加入节点

     

    加入节点:
    # 查看节点加入命令
    kubeadm token create --print-join-commandkubeadm join 192.168.177.6:6443 --token 5wmpns.84ltuxc6fgydsum9
    --discovery-token-ca-cert-hash sha256:b0bf6365b53672f4f1cb40c4558105e43023348f1fc98a3a61ef2a683d294b2c


    # token过期后,新节点的加入方法
    kubeadm token list# 创建token
    kubeadm token create# 创建加密
    openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

    # join时可以加 --node-name k8s-new-node,节点名
    kubeadm join --token aa78f6.8b4cafc8ed26c34f --discovery-token-ca-cert-hash sha256:0fd95a9bc67a7bf0ef42da968a0d55d92e52898ec37c971bd77ee501d845b538 192.168.177.6:6443

     

    踩坑:解决

     

    1:默认是从谷歌下载,我们可以添加阿里的k8s源

    cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
    deb Index of /kubernetes/apt/ kubernetes-xenial main
    EOF

     

    2:执行以下命令进行下载

    apt-get update && apt-get install -y apt-transport-https curl
    apt-get install -y kubelet kubeadm kubectl --allow-unauthenticated

     

    1):可能报错

    Err:6 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease
    The following signatures couldn't be verified because the public key is not available: NO_PUBKEY FEEA9169307EA071 NO_PUBKEY 8B57C5C2836F4BEB
    Reading package lists... Done
    W: GPG error: https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY FEEA9169307EA071 NO_PUBKEY 8B57C5C2836F4BEB
    E: The repository 'https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease' is not signed.
    N: Updating from such a repository can't be done securely, and is therefore disabled by default.
    N: See apt-secure(8) manpage for repository creation and user configuration details.

    解决方法:

    执行以下命令,给阿里云源添加key:

    apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys FEEA9169307EA071

     

    3:执行下面命令测试是否正常

    kubeadm init --image-repository registry.aliyuncs.com/google_containers

    1):可能报错

    error execution phase preflight: [preflight] Some fatal errors occurred:
      [ERROR Swap]: running with swap on is not supported. Please disable swap
    [preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
    To see the stack trace of this error execute with --v=5 or higher

    解决方法:

    swapoff  -a
    sed -ri 's/.*swap.*/#&/' /etc/fstab

     

    2):可能报错

    HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp 127.0.0.1:10248: connect: connection refused.

     

    解决办法:

    create daemon.json
    vim /etc/docker/daemon.json
    {"exec-opts": ["native.cgroupdriver=systemd"]}

    systemctl daemon-reload
    systemctl restart docker
    systemctl restart kubelet

    sudo kubeadm reset
    sudo kubeadm init --image-repository registry.aliyuncs.com/google_containers

     

    4:修改TAG标签(根据自己打情况)

    查看当前从阿里云获取的镜像

    docker images
    registry.aliyuncs.com/google_containers/kube-apiserver           v1.22.3

    然后执行,查看需要修改成什么tag标签

    kubeadm config images list

    k8s.gcr.io/kube-apiserver:v1.22.3

    使用 docker tag {旧名称:版本} {新名称:版本} ,将镜像改名。

    例:

    docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.22.3 k8s.gcr.io/kube-apiserver:v1.22.3

    5:使主节点生效

     

    添加环境变量

    export KUBECONFIG=/etc/kubernetes/admin.conf

    添加网络插件

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

     

    此时如果显示无法找到 raw.githubusercontent.com,则需要找到其对应的IP,放在/etc/hosts文件内,该文件默认为只读,需要先修改该文件的权限

    185.199.108.133 raw.githubusercontent.com
    185.199.109.133 raw.githubusercontent.com
    185.199.110.133 raw.githubusercontent.com
    185.199.111.133 raw.githubusercontent.com

    如果仍旧不行,那就搞个VPN试试吧

    flannel镜像

    #每个节点都需要拉取镜像

    docker pull lwolf/flannel:v0.12.0

     

    为什么要打tag,

    因为kube-flannel.yaml文件里面的镜像名称就是

    quay.io/coreos/flannel:v0.12.0-amd64

    docker tag lwolf/flannel:v0.12.0 quay.io/coreos/flannel:v0.12.0-amd64
    dns插件的安装与应用

    没有网络插件的话,dns也不能正常起作用

    kubectl get svc -n kube-system -o wide #获取dns服务的ip地址
    nslookup svc-nginx.default.svc.cluster.local 10.96.0.10 #只能完整域名查找,并且要包含dns服务器的ip

     

     

  • 相关阅读:
    android平台从froyo 2.2开始支持jni单步调试
    Ubuntu java 环境变量
    ubuntu 10.04安装sunjava5jdk
    proc文件系统usb部分信息输出
    Linux lftp乱码解决及使用书签的方法
    用find & grep查找文件内容
    ubuntu10.10 下安装android 2.2开发环境
    VIM复制粘贴大全!
    kinect 无法在我的android开发板上显示的分析
    hdu 1087 Super Jumping! Jumping! Jumping!
  • 原文地址:https://www.cnblogs.com/a208606/p/15539600.html
Copyright © 2011-2022 走看看