从0开始构建一个k8s集群

环境准备

安装k8s集群需要的配置较高,官方建议是最低 2核2G
本篇安装k8s是在本地搭建的3台centos虚拟机,使用Vagrant构建centos。有关Vagrant的安装使用可以参考Vagrant快速构建虚拟机

构建3台centos7

创建目录 ~/Documents/temp/k8s

$ mkdir  ~/Documents/temp/k8s

~/Documents/temp/k8s下创建Vagrantfile文件,下面是文件内容。

# Vagrantfile
boxes = [
    {
        :name => "manager-node",
        :eth1 => "192.168.8.11",
        :mem => "4096",
        :cpu => "2"
    },
    {
        :name => "worker01-node",
        :eth1 => "192.168.8.12",
        :mem => "2048",
        :cpu => "2"
    },
    {
        :name => "worker02-node",
        :eth1 => "192.168.8.13",
        :mem => "2048",
        :cpu => "2"
    }
]

Vagrant.configure(2) do |config|

  config.vm.box = "centos7"

   boxes.each do |opts|
      config.vm.define opts[:name] do |config|
        config.vm.hostname = opts[:name]
        config.vm.provider "vmware_fusion" do |v|
          v.vmx["memsize"] = opts[:mem]
          v.vmx["numvcpus"] = opts[:cpu]
        end

        config.vm.provider "virtualbox" do |v|
          v.customize ["modifyvm", :id, "--memory", opts[:mem]]
          v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]
          v.customize ["modifyvm", :id, "--name", opts[:name]]
        end

        config.vm.network :public_network, ip: opts[:eth1]
      end
  end

end

启动虚拟机,启动过程中会碰到让你选择网络,就随便选一个就行了。

$ cd  ~/Documents/temp/k8s
$ vagrant up

在这里插入图片描述

每个虚拟机需要安装上docker

# (安装 Docker CE)
## 设置仓库
### 安装所需包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 设置docker源
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
## 安装 Docker CE
sudo yum update -y && sudo yum install -y \
  containerd.io-1.2.13 \
  docker-ce-19.03.11 \
  docker-ce-cli-19.03.11
## 创建 /etc/docker 目录
sudo mkdir /etc/docker
# 设置 Docker daemon
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF
# Create /etc/systemd/system/docker.service.d
sudo mkdir -p /etc/systemd/system/docker.service.d
# 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
# 设置开机启动
sudo systemctl enable docker

开始安装k8s

开始前的准备(每台机器均需处理)

# (1)关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
# (2)关闭selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# (3)关闭swap
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
# (4)配置iptables的ACCEPT规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
# (5)设置系统参数
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system

安装kubeadm

# 配置源
cat <<EOF > /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
EOF
# 安装
yum install -y kubelet-1.19.4-0 kubeadm-1.19.4-0 kubectl-1.19.4-0 --disableexcludes=kubernetes
systemctl enable --now kubelet

拉取docker镜像(master节点执行)

因为k8s google源拉取的比较慢我们提前将所需要到的镜像从阿里源拉到本地。

# 查看所需要到的镜像列表
kubeadm config images list

在这里插入图片描述
创建kubeadm.sh

vi kubeadm.sh

下面是配置

#!/bin/bash
set -e
KUBE_VERSION=v1.19.4
KUBE_PAUSE_VERSION=3.2
ETCD_VERSION=3.4.13-0
CORE_DNS_VERSION=1.7.0
GCR_URL=k8s.gcr.io
ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers
images=(kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
coredns:${CORE_DNS_VERSION})
for imageName in ${images[@]} ; do
        docker pull $ALIYUN_URL/$imageName
        docker tag  $ALIYUN_URL/$imageName $GCR_URL/$imageName
        docker rmi $ALIYUN_URL/$imageName
done

执行脚本拉取镜像

sh ./kubeadm.sh

在这里插入图片描述

使用kubeadm初始化集群(master节点执行)

执行初始化命令,192.168.8.11是master节点ip

kubeadm init --kubernetes-version=1.19.4 \
--apiserver-advertise-address=192.168.8.11 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

在这里插入图片描述
按照指示我们执行下列命令,目的是增加权限配置用来访问apiserver。

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

包含kubeadm join的命令一定要粘贴复制下来保存好,这个需要在node节点进行执行,注册到master。

我们检查下master有没有问题,查询下所有pod。

kubectl get po -A

在这里插入图片描述
查询下自己本地的master看看是不是包含上述所有的pod,名字无所谓只看前缀。这就代表完成了。

配置node节点

执行上面拷贝下来的内容,分别在两个node节点执行

kubeadm join 192.168.8.11:6443 --token psm8iv.y7y1k29nut1q2pmz \
    --discovery-token-ca-cert-hash sha256:c40441f4dbf754a6ad903503335a229f53ba846b347b421168db96b38d16f599

执行完成之后我们在master查看下node情况

kubectl get node

在这里插入图片描述

安装网络插件

默认情况下节点的STATUS都是NotReady,不要在意我的上图,那是我早些时间执行的,懒得重新弄了。
为什么状态都是NotReady呢,因为kubeadm 默认不提供网络插件,所以我们需要安装上网络插件才行,网络插件有以下选择

  • ACI 通过 Cisco ACI 提供集成的容器网络和安全网络。
  • Calico 是一个安全的 L3 网络和网络策略驱动。
  • Canal 结合 Flannel 和 Calico,提供网络和网络策略。
  • Cilium 是一个 L3 网络和网络策略插件,能够透明的实施 HTTP/API/L7 策略。 同时支持路由(routing)和覆盖/封装(overlay/encapsulation)模式。
  • CNI-Genie 使 Kubernetes 无缝连接到一种 CNI 插件, 例如:Flannel、Calico、Canal、Romana 或者 Weave。
  • Contiv 为多种用例提供可配置网络(使用 BGP 的原生 L3,使用 vxlan 的覆盖网络, 经典 L2 和 Cisco-SDN/ACI)和丰富的策略框架。Contiv 项目完全开源。 安装工具同时提供基于和不基于 kubeadm 的安装选项。
    基于 Tungsten Fabric 的 Contrail 是一个开源的多云网络虚拟化和策略管理平台,Contrail 和 Tungsten Fabric 与业务流程系统 (例如 Kubernetes、OpenShift、OpenStack和Mesos)集成在一起, 为虚拟机、容器或 Pod 以及裸机工作负载提供了隔离模式。
  • Flannel 是一个可以用于 Kubernetes 的 overlay 网络提供者。
  • Knitter 是为 kubernetes 提供复合网络解决方案的网络组件。
  • Multus 是一个多插件,可在 Kubernetes 中提供多种网络支持, 以支持所有 CNI 插件(例如 Calico,Cilium,Contiv,Flannel), 而且包含了在 Kubernetes 中基于 SRIOV、DPDK、OVS-DPDK 和 - VPP 的工作负载。
  • OVN-Kubernetes 是一个 Kubernetes 网络驱动, 基于 OVN(Open Virtual Network)实现,是从 Open vSwitch (OVS) 项目衍生出来的虚拟网络实现。 OVN-Kubernetes 为 Kubernetes 提供基于覆盖网络的网络实现,包括一个基于 OVS 实现的负载均衡器 和网络策略。
  • OVN4NFV-K8S-Plugin 是一个基于 OVN 的 CNI 控制器插件,提供基于云原生的服务功能链条(Service Function Chaining,SFC)、多种 OVN 覆盖 网络、动态子网创建、动态虚拟网络创建、VLAN 驱动网络、直接驱动网络,并且可以 驳接其他的多网络插件,适用于基于边缘的、多集群联网的云原生工作负载。
  • NSX-T 容器插件(NCP) 提供了 VMware NSX-T 与容器协调器(例如 Kubernetes)之间的集成,以及 NSX-T 与基于容器的 CaaS / PaaS 平台(例如关键容器服务(PKS)和 OpenShift)之间的集成。
  • Nuage 是一个 SDN 平台,可在 Kubernetes Pods 和非 Kubernetes 环境之间提供基于策略的联网,并具有可视化和安全监控。
  • Romana 是一个 pod 网络的第三层解决方案,并支持 NetworkPolicy API。 Kubeadm add-on 安装细节可以在这里找到。
  • Weave Net 提供在网络分组两端参与工作的网络和网络策略,并且不需要额外的数据库。

这里我们选择使用calico。在 官网中我们可以看到
在这里插入图片描述
如果是小于50个node,使用curl https://docs.projectcalico.org/manifests/calico.yaml -O
如果是超过50个node使用curl https://docs.projectcalico.org/manifests/calico-typha.yaml -o calico.yaml
在这里插入图片描述
我们就按照上述的步骤

#下载yaml文件
curl https://docs.projectcalico.org/manifests/calico.yaml -O
# 安装
kubectl apply -f calico.yaml
#下面是持续监控pod的pending情况 --watch代表持续查看
kubectl get po -A --watch

在这里插入图片描述
安装完插件之后执行kubectl get node就可以看到所有的节点的status都是ready状态了。
这样我们的k8s的集群就算创建完成了,后面文章会持续分享k8s的使用以及一些resource的介绍。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值