Kubernetes学习---环境搭建篇

Linux系统
452
0
0
2022-07-18
标签   Kubernetes

最近开始学习了Kubernetes相关的知识,通过极客时间的深入剖析Kubernetes和慕课网相关的实战课程,对Kubernetes也有了初步的了解,写博客也是记录一下学习的过程。

下面开始Kubernetes的环境搭建

前置知识

  • 了解docker相关的知识
  • 了解Linux相关的知识
  • 了解一些常见的开发软件如(nginx,mysql等)

环境说明

  • windows10操作系统
  • virtual box最新版
  • vagrant最新版
  • centos7

上面的涉及的软件可在官网自行下载

这里需要搭建Kubernetes集群,所以需要使用virtual box创建多个虚拟机,然后使用vagrant来管理多个虚拟机。

虚拟机环境搭建

通过vagrant创建三台虚拟机,分别为一个manager主节点和两个node节点

下载centos的vagrant box并将box添加到本地

下载完成后添加box,执行vagrant box add centos/7 下载的box路径添加相应的box

定义Vagrantfile文件,文件内容如下,文件通过定义三个虚拟机,分别为master,node1,node2。为其分配对应的静态ip,内存,cpu核数。由于Kubernetes对节点的要求是最低不能小于2048M和cpu核数需大于等于2,所以这里不能低于我给的配置。并为虚拟机分配私有网络,在创建时执行setup.sh脚本,用于在虚拟机上下载docker

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.require_version ">= 1.6.0"

boxes = [
    {
        :name => "master",
        :eth1 => "192.168.205.10",
        :mem => "2048",
        :cpu => "2"
    },
    {
        :name => "node1",
        :eth1 => "192.168.205.11",
        :mem => "2048",
        :cpu => "2"
    },
    {
        :name => "node2",
        :eth1 => "192.168.205.12",
        :mem => "2048",
        :cpu => "2"
    }
]

Vagrant.configure(2) do |config|

  config.vm.box = "centos/7"

  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]]
        end

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

  config.vm.provision "shell", privileged: true, path: "./setup.sh"

end

setup.sh文件内容如下:

#/bin/sh

# install some tools
sudo yum install -y git vim gcc glibc-static telnet bridge-utils

# install docker
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh

# start docker service
sudo groupadd docker
sudo gpasswd -a vagrant docker
sudo systemctl start docker
sudo systemctl enable docker.service
rm -rf get-docker.sh

然后执行vagrant up启动虚拟机,这里可能要花费一些时间来创建虚拟机和初始化环境

Kubernetes集群搭建

虚拟机启动后,可通过vagrant ssh 虚拟机名称进入对应的虚拟机

首先我们先进入master节点,在master节点上安装Kubernetes集群主节点

开启br_netfilter

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

将桥接的IPV4流量传递到iptables(使用docker的话,不设置也没什么问题,因为dockerd会帮我们设置,但是如果使用containerd的话,就需要设置)

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

让sysctl生效

sysctl --system

配置k8s的阿里云源

cat >>/etc/yum.repos.d/kubernetes.repo <<EOF
[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

安装kubelet、kubeadm、kubectl

yum install -y kubelet-1.19.3 kubeadm-1.19.3 kubectl-1.19.3

开机启动

systemctl enable kubelet

在 master 上,设置 hostname

hostnamectl set-hostname master

配置/etc/hosts

192.168.205.10 master
192.168.205.11 node1
192.168.205.12 node2

初始化kubeadm

在初始化kubeadm之前,有一些注意项

注意点:节点配置最低为2核2G,所以在配置虚拟机时,要配置最低为2核2G

创建/etc/docker/daemon.json文件添加内容,设置docker驱动,并重启docker服务

{ 
 "exec-opts": ["native.cgroupdriver=systemd"]
}

关闭swap,并在初始化时增加ignore-preflight-errors参数

swapoff -a

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

使用 kubeadm 初始化 master 节点

  • kubeadm的本质把 kubelet 直接运行在宿主机上,然后使用容器部署其他的 Kubernetes 组件。
  • 使用 kubeadm 的第一步,是在机器上手动安装 kubeadm、kubelet 和 kubectl 这三个二进制文件。
  • 当你执行 kubeadm init 指令后,kubeadm 首先要做的,是一系列的检查工作,以确定这台机器可以用来部署 Kubernetes。这一步检查,我们称为“Preflight Checks”,它可以为你省掉很多后续的麻烦。
  • 在通过了 Preflight Checks 之后,kubeadm 要为你做的,是生成 Kubernetes 对外提供服务所需的各种证书和对应的目录。
  • 接下来,kubeadm 会为 Master 组件生成 Pod 配置文件。
  • 然后,kubeadm 就会为集群生成一个 bootstrap token。在后面,只要持有这个 token,任何一个安装了 kubelet 和 kubadm 的节点,都可以通过 kubeadm join 加入到这个集群当中。
  • kubeadm init 的最后一步,就是安装默认插件。Kubernetes 默认 kube-proxy 和 DNS 这两个插件是必须安装的。它们分别用来提供整个集群的服务发现和 DNS 功能。其实,这两个插件也只是两个容器镜像而已,所以 kubeadm 只要用 Kubernetes 客户端创建两个 Pod 就可以了。
kubeadm init --kubernetes-version=1.19.3 
 --apiserver-advertise-address=192.168.205.10 \ --image-repository registry.aliyuncs.com/google_containers \ --service-cidr=10.1.0.0/16 \ --pod-network-cidr=10.244.0.0/16 

注意:–kubernetes-version 为上面安装时的 kubernetes 版本,–apiserver-advertise-address 为 master 节点的 ip 地址

看到successful! 说明已经成功了

Kubernetes学习---环境搭建篇

配置kube环境

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

Kubernetes集群默认需要加密方式访问。所以,这几条命令,就是将刚刚部署生成的Kubernetes 集群的安全配置文件,保存到当前用户的.kube目录下,kubectl默认会使用这个目录下的授权信息访问Kubernetes集群。

如果不这么做的话,我们每次都需要通过 export KUBECONFIG 环境变量告诉 kubectl 这个安全配置文件的位置。

配置kubeconfig环境变量

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >>~/.bash_profile

使配置生效

source ~/.bash_profile

验证一下,看到以下信息,说明配置已经生效,但是当前集群的master节点仍未生效,处于NotReady状态,原因是我们还没有安装网络组件

[vagrant@master ~]$ kubectl get node
NAME            STATUS     ROLES    AGE   VERSION
master         NotReady   master   45m   v1.19.3
[vagrant@master ~]$

在 Kubernetes 项目“一切皆容器”的设计理念指导下,部署网络插件非常简单,只需要执行一句 kubectl apply 指令

安装calico网络组件,calico.yaml可以直接到calico官网下载到虚拟机后,执行以下命令

kubectl apply -f calico.yaml

再次查看节点

[vagrant@master ~]$ kubectl get node
NAME            STATUS   ROLES    AGE   VERSION
master          Ready    master   48m   v1.19.3
[vagrant@master ~]$

查看一下kubernetes都运行了哪些pod

Kubernetes学习---环境搭建篇

到目前为止,已经配置好了master主节点,下面再来配置node节点

node节点配置

进入node1节点,与之前master节点操作类似,要先安装好对应的环境,就是初始化kubeadm之前的操作

通过刚刚在master节点初始化成功后的显示的kubeadm join命令,使node节点能加入集群中

拷贝kubeadm join加入集群命令,可通过命令kubeadm token create –print-join-command查看:

kubeadm join 192.168.205.10:6443 --token d3jpig.rv554dxknrb3ptsd     --discovery-token-ca-cert-hash sha256:3cab09ca90964bd8f74952ae572b6f8ee79b4ca09e6b09fdbcad1883bb8e2b15

加入集群后,可以在 master 再次查看节点,可以查看到node1节点已加入集群

[vagrant@master ~]$ kubectl get node
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   34m   v1.19.3
node1    Ready    <none>   64s   v1.19.3

node2节点与node1节点操作一致,完成操作后,就正式完成了集群的初始化操作,可以正式开始学习Kubernetes了。

Kubernetes学习---环境搭建篇