最近开始学习了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! 说明已经成功了
配置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
到目前为止,已经配置好了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了。