利用kubeadm搭建kubernetes集群

前言

k8s的部署方式:

  1. 传统方式,从github上拉取对应的二进制安装包,解压安装各个组件和节点,过程步骤复杂,特别是各组件要通信,配置各种ca证书。GitHub链接
  2. 由于传统方式安装比较麻烦,所以我们用kubeadm(k8s官方提供的集群部署工具)安装,只需按照以下基本步骤安装即可:
    • master,nodes机器上安装:kubelet、kubeadm和docker,其中node和master都要运行在kebulet和docker环境之上
    • Master:用kubeadm init 命令,拉取下载相关的组件镜像,并启动相关pods(静态pods,不受k8s自身管理),相关的pods组件有:etcd、api-server、controller-manager、scheduler
    • Nodes:用kubeadm join命令把nodes加入到k8s集群中
    • flannel组件,也是运行在pods的守护级进程,起到个nodes的通信作用。是一个额外的组件(adds on)。GitHub链接
    • kubeadm相关参考文档

一、准备工作

  1. kubernetes需要容器运行时的支持,目前官方支持的容器运行时包括:Docker、Containerd、CRI-O和frakti。本次以Docker作为容器运行环境,推荐版本为Docker CE 18.09。宿主机操作系统使用CentOs

  2. 由于Kubernetes的master和node之间会进行大量通信,安全做法是开放对应的通信端口,在安全的内网环境下可以关闭防火墙服务:

    sudo systemctl disable firewalld

    sudo systemctl stop firewalld

  3. 关闭swap:swapoff -a

  4. 另外,建议在主机上禁用SELinux,让容器可以读取主机的文件系统

    sudo setenforce 0

  5. 解决路由异常:`

    1
    2
    3
    4
    5
    echo "net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    vm.swappiness=0" >> /etc/sysctl.d/k8s.conf`
    sudo sysctl -p /etc/sysctl.d/k8s.conf
    若报不存在目录的错误,则运行:sudo modprobe br_netfilter

二、用kubeadm快速安装kubernetes集群

Kubernetes 从1.4版开始引入了命令行工具kubeadm,致力于简化集群安装的过程,并解决集群的高可用问题。

  • 下载yum-key.gpg和rpm-package-key.gpg

    sudo wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg

    sudo wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

    导入:

    sudo rpm –import yum-key.gpg

    sudo rpm –import rpm-package-key.gpg

  • 安装docker环境,docker运行时环境的配置:https://kubernetes.io/docs/setup/production-environment/container-runtimes/

    cd /etc/yum.repos.d/

    wget <https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    yum install -y docker-ce

    最后安装18.09版本,不然后面会出现各种问题。

    1
    2
    yum list docker-ce --showduplicates|sort -r  
    yum install docker-ce-18.09.0 -y
  • 安装kubeadm和相关工具

  • 启动kubelet和docker服务,并开启开机启动。但是现在启动kubelet是会失败的,可先忽略

    systemctl enable docker && systemtcl start docker

    systemctl enable kubelet && systemtcl start kubelet

  • 使用kubeadm config print init-defaults > init-config.yaml 初始化一份配置文件,并且修改文件中配置为:imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers,因为默认的镜像地址在国内是会被墙的。(注意,如果advertiseAddress的值配置有问题,到加入节点kubeadm join的时候会出现卡住的情况,这时候检查advertiseAddress配置的ip是否有问题)

  • kubeadm config images pull --config=init-config.yaml 拉取下载所需镜像。

三、master节点的安装

  • 至此,准备工作已经完毕。运行kubeadm init --config=init-config.yaml 进行初始化,如运行结果提示kubelet没启动或者启动失败,可以重启kubelet。然后运行kubeadm rest重置,再进行kubeadm init操作

  • 安装完毕后,按照提示命令,复制配置文件到普通用户的home目录下:

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

    这样就在master安装了kubernetes,但是在集群内还没有任何的node和缺乏对容器网络的配置。其中值得注意的是,在kubeadm init完成后,最后几行提示信息包含了加入其他节点的指令和所要的token。如果遗忘。可用命令sudo kubeadm token create --print-join-command重新打印出来。

四、安装Node

  • 新增一个节点,系统准备所需的yun源是一样的,安装的工具可以不装kubectl。安装完毕后,启动docker和kubelet服务。

  • 为kubeadm命令生成配置文件,文件内容如下:

    其中apiServerEndpoint的值是master的服务器地址,token和tlsBootstrapToken的值是master安装最后的一行信息。

  • kubeadm join大致的生命流程是:1、preflight checks;2、从集群中读取配置,也就是apiServerEndpoint中配置的地址中获取;也就是在master的这个配置,可以用命令kubectl -n kube-system get cm kubeadm-config -oyaml查看。3、下载这个配置,然后写入到/var/lib/kubelet/config.yaml;4、激活kubelet。如果在第二部中,读取配置出现问题,有可能出现卡住的情况,这时要检查maste的apiServerEndpoint和node的是否一致。

  • node join完毕后,可以在master节点kubectl get nodes查看节点列表和状态等

五、安装网络插件(一定要指定pod-network的配置,否则会出现网络插件的pod启动或者通信失败等问题)

  1. 执行kubectl get nodes 你会发现master和node节点都是NoReady状态,那是因为还没安装CNI网络插件

  2. 对于CNI网络插件,可有很多选择,可参考:<https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network

  3. 这里,我们选择weave插件,执行命令kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"即可完成安装。

  4. 运行命令:

    sudo kubeadm join 10.0.2.15:6443 --token 9le8zj.k1y8fvr09b4h4pww --discovery-token-ca-cert-hash sha256:10187a814644dab00611161c3079fdeeef579b999c6c506c33ff55dd9bb032fa --ignore-preflight-errors=Swap

    把节点nodes加入,等nodes的机器拉取完镜像后,这个节点就加入完毕了。可以用这个命令查看更多pods的扩展信息:

    kubectl get pods -n kube-system -o wide

  5. 我们在master节点上运行:kubectl get nodes ,可以看到节点已经成功加入

    至此,我们简单的k8s集群已经部署完毕。。。

六、一些有用的命令

  • sudo netstat -ntlp | grep LISTEN 查看监听的端口
  • kubectl get pods -n kube-system -o wide 查看pods的更多扩展信息
  • kubectl get ns 获取所有的命名空间
  • sudo yum list kubelet –showduplicates //查看所有yum包的可用版本
  • kubectl get pods –all-namespaces 查看所有命名空间下的pods

参考链接:

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2015-2020 谭家俊
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

微信