环境准备
安装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的介绍。