Kubernetes--环境搭建kubeadm

    技术2022-07-14  67

    一. 前言

    官方提供了三种Kubernetes部署方式

    1. minikube

    Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用。不能用于生产环境。

    2. kubeadm

    Kubeadm是一个工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群

    3. 二进制包

    从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。

    二. 环境要求

    1.一台或多台机器,操作系统 CentOS7.x-86_x64 2. 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘20GB或更多 3. 集群中所有机器之间网络互通 4. 可以访问外网,需要拉取镜像 5. 禁止swap分区

    三. kubeadm工具搭建

    1. 设备准备

    192.168.214.129 k8s-master (管理节点) 192.168.214.131 k8s-node (工作节点)

    2. 环境准备

    1)关闭防火墙(所有节点)

    $ systemctl stop firewalld $ systemctl disable firewalld $ iptables -F

    2)关闭swap(所有节点)

    $ swapoff -a $ 临时 $ vim /etc/fstab $ 永久 $ sed -i 's/.*swap.*/#&/' /etc/fstab

    ps: Swap是操作系统在内存吃紧的情况申请的虚拟内存,按照Kubernetes官网的说法,Swap会对Kubernetes的性能造成影响,不推荐使用Swap。

    3)主机名配置(所有节点)

    3. 安装docker(所有节点)

    ps:Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。

    ##安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 ##添加软件源信息 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo ##更新并安装Docker-CE sudo yum makecache fast sudo yum -y install docker-ce sudo yum -y install epel-release sudo yum -y install python-pip sudo yum clean all sudo pip install docker-compose ##开启Docker服务 sudo service docker start ##开机自启 systemctl enable docker

    查看安装结果:docker info ps:docker安装完后Cgroup Driver=cgroupfs和kubelet的Cgroup Driver=systemd不一致,需要修改docker的Cgroup Driver为systemd,修改如下:

    sudo curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://b81aace9.m.daocloud.io vim /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"] }

    重启docker查看结果:

    systemctl daemon-reload systemctl restart docker systemctl enable docker docker info

    4. 增加dns解析(所有节点)

    echo nameserver 8.8.8.8 >> /etc/resolv.conf systemctl restart network

    5. 创建/etc/sysctl.d/k8s.conf文件(所有节点)

    vi /etc/sysctl.d/k8s.conf

    增加如下内容: net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1

    使配置生效:

    modprobe br_netfilter sysctl -p /etc/sysctl.d/k8s.conf

    6. 配置国内数据源(所有节点)

    yum install -y wget mkdir /etc/yum.repos.d/bak && mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo yum clean all && yum makecache

    7. 配置国内Kubernetes数据源(所有节点)

    cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF setenforce 0

    8. 安装kubeadm,kubelet和kubectl(所有节点)

    1)安装kubeadm,kubelet和kubectl

    yum install -y kubelet kubeadm kubectl

    2)启动kubectl

    systemctl enable kubelet && systemctl start kubelet

    9. 部署Kubernetes(master节点)

    kubeadm init --kubernetes-version=v1.18.0 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.214.132 --ignore-preflight-errors=Swap

    结果会报如下错误: ps:由于是国外镜像,基本上无法下载对应的镜像包。仔细查看报错信息里面明确列出了安装需要用到的镜像名称和tag,那么我们只需要提前把这些镜像pull下来,再安装就ok了。

    下载镜像:

    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.0 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.18.0 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.0 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.0 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7

    打成tag:

    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.0 k8s.gcr.io/kube-apiserver:v1.18.0 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.18.0 k8s.gcr.io/kube-controller-manager:v1.18.0 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.0 k8s.gcr.io/kube-scheduler:v1.18.0 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.0 k8s.gcr.io/kube-proxy:v1.18.0 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7 k8s.gcr.io/coredns:1.6.7

    再次执行:

    kubeadm init --kubernetes-version=v1.18.0 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.214.132 --ignore-preflight-errors=Swap

    结果如下(打印结果的最后一句kubeadm join在后面环节有用到):

    10. 初始化k8s环境(master节点)

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

    11. flannel网络设置(master节点)

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

    执行结果: 查看节点状态(master节点)

    kubectl get node

    结果:状态为NotReady(不正常) 再查看所有pod(master节点)

    kubectl get pods --all-namespaces

    结果:有两个节点为pending状态(不正常) 再查看日志(master节点)

    journalctl -f -u kubelet.service

    结果:网络错误(不正常) 回头想下刚才执行的kubectl apply -f kube-flannel.yml,其实是在下载flannel镜像。 因此查看下有没有flannel镜像

    docker images|grep flannel

    说明:镜像还在下载中,因此此处需要等待大概4到5分钟,之后再查看,发现主节点正常

    12. node节点添加到master节点(node节点)

    下载镜像:

    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.0 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7

    打成tag:

    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.0 k8s.gcr.io/kube-proxy:v1.18.0 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7 k8s.gcr.io/coredns:1.6.7

    执行第9步生成的添加语句:

    kubeadm join 192.168.214.132:6443 --token 5cy1j4.y5kb1jgsn3rluejb \ --discovery-token-ca-cert-hash sha256:b7fc5e9a72ba34b00494600280c593a8828efb8be8d4dade6cbeba988c270bb2

    结果: 在master上查看节点状态, 为NotReady 大概需要等待半分钟,再次查看

    Processed: 0.009, SQL: 9