kubernetes快速安装部署实践

kubernetes快速安装部署实践目录

  • 简介
  • kubernetes部署方式
  • 本文目标
  • 安装前准备(所有机器均操作)
    • 机器和系统准备
    • 系统相关配置(待补充一键运行脚本)
    • 安装docker,运行,并设置开机自启
    • 安装kubeadm、kubelet、kubectl
  • 集群部署
    • 控制节点部署
      • kubeadm init
      • 配置kubectl
      • 配置容器网络插件flannel
    • 工作节点部署
      • kubeadm join
      • 容器网络部署flannel
  • 部署后检查和测试
    • 节点状态
    • 组件状态
    • 创建资源测试

简介

实践kubernetns的第一步即安装部署测试环境。
本文采用官方推荐的kubeadm(官方英文文档:link)快速搭建一套多节点kubernetes集群环境,从而上手熟悉和学习kubernetes项目。
本文持续更新中,最近更新时间2020-07-31。

kubernetes部署方式

  1. kubeadm,官方推荐的部署方案,也是本文采用的方案。
    优点:部署简单快速,理论上只需要两条部署命令即可部署一套kubernetes的测试环境。
    缺点:仍不算是完善的部署方案,比较不适合在生产环境直接使用。
  2. kubespray,据说目前较适合用于生产环境部署的方案,待补充。
  3. 手动部署,如手动部署kubernetes-master和kubernetes-node。更进一步可以直接手动部署kube-apiserver等基本组件。
    优点:完全自由
    缺点:要求对kubernetes很熟悉,不适合新手。

本文目标

部署一套测试的kubernetes环境(1.16.0版本),包含以下两种节点:

  • 控制节点,单节点部署,主要组件如下,
    • etcd
    • kube-apiserver
    • kube-sheduler
    • kube-control-manager
    • kubelet
    • kubectl
    • coredns(插件)
    • flannel(插件)
    • docker(容器环境,版本docker-ce-19.03.12-3.el7,建议使用18.09版本)
  • 工作节点,多节点部署,主要组件如下,
    • kubelet
    • kube-proxy
    • flannel(插件)
    • docker(容器环境,版本docker-ce-19.03.12-3.el7,建议使用18.09版本)

安装前准备(所有机器均操作)

机器和系统准备

虚拟机:vmware(实体机更佳),2G内存以上,2个CPU以上,2-3台
Centos7系统,本文使用系统如下,
centos7 uname信息

系统相关配置(待补充一键运行脚本)

  • 主机重命名(建议)
    # hostnamectl set-hostname $主机名
    hostnamectl set-hostname k8s-master
    
  • 网络配置,保证多台机器可互相通信,略
  • 关闭防火墙(推荐,否则需要额外配置放通kubernetes使用的端口)
    systemctl stop firewalld
    systemctl disable firewalld
    
  • 关闭SElinux(必选,因为kubelet不支持)
    #临时关闭
    setenforce 0
    #永久关闭,重启生效。该命令本质是改配置文件,可以先cat文件查看原有内容
    sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
    
  • 关闭交换分区(建议,影响kubelet运行,也可能导致部署失败)
    #临时关闭
    swapoff -a
    #永久关闭,重启生效。该命令本质是改配置文件,可以先cat文件查看原有内容
    sed -i.bak '/swap/s/^/#/' /etc/fstab
    
  • 配置使得iptables可以发现linux网桥流量(必选,原因待确认)
    #检查br_netfilter模块是否加载,docker启动后,一般该模块会自动加载
    lsmod |grep br_netfilter
    # 如果模块不存在,则加载
    modprobe br_netfilter
    #添加sysctl配置文件,新增sysctl配置
    cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    # 配置生效
    sudo sysctl --system
    

安装docker,运行,并设置开机自启

由于一般yum源的docker包都是开发的最新版本,因此以下添加了阿里云的镜像源从而获取到稳定版本的docker包。
安装的docker版本为2020-07月目前最新的稳定版本docker-ce-19.03.12-3.el7。目前判断该版本和kubernetes 1.16.0版本可能存在不兼容情况。如果有测试到不兼容的场景,可以根据kubernetes发布版本的发布内容选择合适的docker版本。根据kubeadm提示,目前kubernetes1.16.0版本有测试的最高docker版本为18.09版本

#安装镜像源管理的依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
#设置镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#查看docker的版本
yum list docker-ce --showduplicates | sort -r
#安装指定版本的docker
yum install docker-ce-19.03.12-3.el7
#设置docker开机自启,并启动docker
systemctl enable docker
systemctl start docker

安装kubeadm、kubelet、kubectl

同样由于kubeadm的官方源国内无法访问,所以为了顺利安装kubeadm、kubelet、kubectl组件,本文更改使用了阿里云的yum源。

  1. 创建/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
    kubernetes快速安装部署实践_第1张图片
  2. 安装对应组件
    #安装对应包,指定版本v1.16.0,目前测试v1.17.x和v1.18.x版本均无法从阿里云镜像下包,原因未知
    yum install kubeadm-1.16.0 kubelet-1.16.0 kubectl-1.16.0
    #yum install kubeadm kubelet kubectl,不指定版本则默认安装最新为1.18.x版本
    #设置kubelet启动,开机自启
    systemctl start kubelet
    systemctl enable kubelet
    

集群部署

由于是使用kubeadm工具进行部署,理论上我们只需要在控制节点执行kubeadm init命令、工作节点执行kubeadm joint命令即可完成部署。实际具体步骤如下,

控制节点部署

kubeadm init

  1. (可选)提前下载kubeadm部署所需要的docker镜像

    #提前下载所需要的相关镜像,检查kubeadm镜像源的连通性
    kubeadm config images pull
    

    在这里插入图片描述
    如果出现上述错误,即可能是无法联通k8s.gcr.io(国内基本无法访问),则可以尝试使用阿里云镜像源,增加–image-repository配置,

    kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.16.0
    

    如下即表示镜像下载成功,
    在这里插入图片描述

  2. 执行kubeadm init命令进行控制节点初始化

    #执行kubeadm init命令进行控制节点初始化
    kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.16.0 --pod-network-cidr=10.8.0.0/16
    #备注1:pod-network-cidr为容器网络所需要的参数,后续部署flannel插件时需要使用
    #备注2:image-repository同样使用了阿里云源,如果第1步未执行的话
    #备注3:kubernetes-version和我们上述部署的kubeadm、kubelet等组件版本保持一致(建议)。
    

    命令输出如下图,请关注红框部分,其输出即为后续需要做的操作。
    关键:请保存kubeadm init的输出内容kubernetes快速安装部署实践_第2张图片
    kubernetes快速安装部署实践_第3张图片
    kubernetes快速安装部署实践_第4张图片

配置kubectl

上述kubeadm执行成功之后,etcd、kube-apiserver、kube-scheduler、kube-control-manager部件其实已经以docker容器的形式部署并运行在控制节点上,可以对外提供服务了。根据上图红框的提示,我们配置kubectl后就可以执行kubernetes相关命令了。

#kubectl需要经过配置后才能与kube-apiserver正常通信,从而执行命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#上述命令本质上就是拷贝/etc/kubernetes/admin.conf配置到该用户目录$HOME/.kube/config下

此时就可以执行kubectl命令测试了,比如执行kubectl get node查询kubernetes集群节点,可以看到当前本控制节点已经加入集群,然而状态是NotReady,原因为还未部署容器网络插件。
在这里插入图片描述

配置容器网络插件flannel

上一节kubectl get node命令获取到控制节点的状态为NotReady,原因为还未部署容器网络,因此kubernetes认为节点还处于不可用状态,因此接下去我们就先部署容器网络插件,当前选择flannel,因为部署简单。另外有macvlan等插件也可以选择,可以参考文档(待链接)。
由于本文选择的flannel插件部署方式也是在控制节点上以docker容器形式部署进行服务的,而flannel的docker镜像不容易下载,直接使用以下命令部署会因为flannel镜像无法下载而导致部署失败(理论上部署flannel只需要这么一条命令即可),

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

因此,我们选择了从github的flannel项目中手动下载flannel镜像的方式来避开flannel部署失败的问题。

  1. 从github上flannel项目(链接:https://github.com/coreos/flannel/releases)下载flannel镜像
    在这里插入图片描述

  2. 上传至虚拟机,手动将flannel镜像导入docker

    # 导入镜像
    docker load -i flannel.v0.12.0-amd64.docker
    # 查询镜像
    docker image list
    

    kubernetes快速安装部署实践_第5张图片

  3. 下载flannel.yml文件,用于部署的配置文件

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

    备注:如果上述下载失败,一般是由于raw.githubusercontent.com这个地址无法解析,可以检查下dns,甚至是直接将该地址对应的IP写入host文件中。

  4. 修改flanne.yml文件,主要是为了适配kubeadm init时指定的pod-network-cidr配置
    kubernetes快速安装部署实践_第6张图片

  5. 部署flannel

    kubectl apply -f kube-flannel.yml
    
  6. 再次查询节点状态,
    在这里插入图片描述
    备注:上图是在部署完成之后查的状态,因此master和node1节点状态均为Ready。

至此,控制节点部署完成,接下去开始部署工作节点

工作节点部署

kubeadm join

  1. 工作节点的系统配置、安装前准备和控制节点保持一致

  2. 工作节点只需要执行kubeadm join命令即可加入kubernetes集群,命令来源为控制节点执行kubeadm init时最后输出的部分!

    kubeadm join 192.168.50.202:6443 --token dav0mt.nfk8kj3a6wfhup6k --discovery-token-ca-cert-hash sha256:bff27c7dc1b259d966b119ba39999d9399b7bf000061e9fe06bc66b7026113ee
    

    kubernetes快速安装部署实践_第7张图片
    备注:如果忘了kubeadm init的输出,则需要在控制节点重新生成。待补充解决方法。

  3. 此时在控制节点上,执行kubectl get node -o wide则可以看到新加进来的节点,但是状态仍然为NotReady,原因同控制节点部署中一样为容器网络插件还未初始化。
    在这里插入图片描述

容器网络部署flannel

  1. 在工作节点上也导入flannel镜像,步骤同控制节点
  2. 无需再特殊操作,稍等一会再查询集群节点状态即可。如果状态未自动恢复,可以考虑在控制节点上重新apply kube-flannel.yml。

至此,工作节点部署完成,其他工作节点部署和本工作节点部署方式一致

部署后检查和测试

节点状态

当前测试环境中,我们部署了一台控制节点、一台工作节点组成了节点集群(后续会再部署1台工作节点)。使用kubectl get node -o wide命令我们已经可以查询到节点信息和节点状态,

kubectl get nodes -o wide

在这里插入图片描述

组件状态

kubeadm的安装方式是将各个k8s组件以容器的方式部署在主机上的,通过kubectl我们即可查询到所有节点上的组件部署情况和运行情况,

kubectl get pods --all-namespaces -o wide

kubernetes快速安装部署实践_第8张图片
同样在控制节点上我们使用docker ps命令也能看到本节点上相关组件信息,
kubernetes快速安装部署实践_第9张图片
以kube-apiserver组件为例,通过ps命令我们即可以看到kube-apiserver的进程(docker拉起的进程),
在这里插入图片描述

创建资源测试

上述过程中我们已经搭建了一套kubernetes测试系统,接下去就创建个资源来熟悉下kubernetes的功能。以下以deployment资源为例,创建和管理2个centos容器。
备注:为方便测试,我在环境中又新加了一台工作节点,当前环境为1控制节点、2工作节点的环境。

  1. 创建deployment的配置文件centos_deployment1.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    	name: centos
    	labels:
    		app: centos
    spec:
    	replicas: 2
    	selector:
    		matchLabels:
      			app: centos
    	template:
    		metadata:
      			labels:
        			app: centos
    		spec:
      		containers:
      		- name: centos
        	  image: centos
        	  imagePullPolicy: IfNotPresent
        	  command: [ "/bin/bash", "-c", "--" ]
        	  args: [ "while true; do sleep 30; done;" ]
    

    kubernetes快速安装部署实践_第10张图片

  2. 执行kubectl命令根据配置文件创建对应资源

    kubectl create -f centos-deployment1.yaml
    
  3. 之后就可以通过kubectl查询到所创建出来的deployment资源,由于副本数为2,因此创建了2个centos的容器,分别调度在2台工作节点上。
    备注:如果查询到容器状态异常,则可以使用kubectl logs $name,查询下问题原因然后进行排查。一般是容器镜像无法下载,可以采用手动导入的方式,再重新执行kubectl apply -f centos-deployment1.yaml命令更新。
    在这里插入图片描述

  4. 进入容器,测试两台容器的连通性

    kubectl exec -it centos-666b67cd79-mwt22 /bin/bash
    

    kubernetes快速安装部署实践_第11张图片

你可能感兴趣的:(kubernetes)