文章目录
  • 一、前言
  • 二、Centos最小化安装
  • 2.1 vmware最小化安装centos7
  • 2.2 配置静态IP
  • 三、K8S集群搭建
  • 3.1 更新yum(所有机器都执行)
  • 3.2 安装Docker(所有机器都执行)
  • 3.3 修改hosts文件(所有机器都执行)
  • 3.4 系统基础前提配置(所有机器都执行)
  • 3.5 安装 kubeadm, kubelet and kubectl(所有机器都执行)
  • 3.6 准备好镜像(所有机器都执行)
  • 3.7 kube init初始化master(仅主节点机器执行)
  • 3.8 部署calico网络插件(仅主节点机器执行)
  • 3.9 kube join(仅所有从节点机器执行)
  • 3.10 新建Pod测试整个集群(仅主节点机器执行)
  • 四、尾声


一、前言

本文讲述从零开始搭建k8s集群,均使用国内镜像,版本均统一,使用两个虚拟机,一个主节点,一个从节点,保证k8s一次搭建成功。

之前我都是使用 v1.14.0 版本,但是学习一些高级属性,无法这样使用了,现在换成 v1.21.0

注意:Kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写。

docker-ce 19.03.0

kubectl kubeadm kubelet v1.21.0

docker images | grep k8s.gcr.io 相关镜像版本

coredns:v1.8.0

etcd 3.4.13-0

pause 3.4.1

Kubernetes部署_02_从零开始搭建k8s集群v1.21.0(亲测可用)_kubernetes

calico v3.9
kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml

对于 coredns etcd pause 的版本,无需记忆,k8s每个版本都会有的,如果错了,kubeadm init 会报错出来的。笔者操作的时候,这三个用的还是 v1.14.0 集群需要版本,当执行 kubeadm init --kubernetes-version=1.21.0 --apiserver-advertise-address=192.168.100.152 --pod-network-cidr=10.244.0.0/16 安装的时候,报错如下:

Kubernetes部署_02_从零开始搭建k8s集群v1.21.0(亲测可用)_子网_02


说明需要 pause 3.4.1 etcd 3.4.13.0 coredns:v1.8.0 这三个镜像,可以从国内的 阿里云镜像仓 或者dockerHub下载,我是从 dockerHub 下载的,然后docker tag一下


Kubernetes部署_02_从零开始搭建k8s集群v1.21.0(亲测可用)_ico_03

二、Centos最小化安装

安装K8S需要使用Centos7,每个机器至少2个处理器和2G,这是k8s官网是要求的。

Kubernetes部署_02_从零开始搭建k8s集群v1.21.0(亲测可用)_docker_04

2.1 vmware最小化安装centos7

vmware最小化安装centos7,下载好镜像,不断下一步,直到完成。

先到官网 https://www.centos.org/download/ 下载centos.iso,如下:

Kubernetes部署_02_从零开始搭建k8s集群v1.21.0(亲测可用)_docker_05

国内的,直接选阿里云镜像就好 http://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/

具体安装可以参见

其实没这么麻烦,只需要配置磁盘这个必选就好了,其他都不用配置,不断下一步,最好就安装好了。

2.2 配置静态IP

创建好的虚拟机 ping www.baidu.com 失败,需要配置好静态ip,才能连同外网。
输入 vi /etc/sysconfig/network-scripts/ifcfg-ens33 然后按照如下图编辑,最后 service network restart 保存即可

Kubernetes部署_02_从零开始搭建k8s集群v1.21.0(亲测可用)_docker_06

BOOTPROTO=static ONBOOT=yes DNS1=114.114.114.114 这三个是写死的,那么其他三个ip 子网掩码 网关是如何确定的呢?这个和本机的ip无关,只和vmware的虚拟网络编辑器有关。

vware的虚拟网络编辑器,需要配置子网掩码、子网ip、网关ip

首先是子网掩码,一般都是C类,配置为 255.255.255.0 ,没什么好说的,然后是子网ip,这个子网ip要受到子网掩码的限制,只有前面三个字节,最后一个字节为0,一般是 xxx.xxx.xxx.0,这里子网IP配置为192.168.100.0,然后再是网关(就是虚拟网络编辑器的ip),网关ip又受到子网ip的限制,前面三个字节需要和子网ip一样,表示是这个子网段内的ip,这里配置为192.168.100.2,其他可以配置为该子网内任意一个 192.168.100.1 - 192.168.100.127,如下图:

Kubernetes部署_02_从零开始搭建k8s集群v1.21.0(亲测可用)_ico_07

配置好虚拟网络编辑器之后,再来看静态ip的三个字段,NETMASK=255.255.255.0 没问题,c类都是这样配置,然后是网关ip GATEWAY,这里必须和虚拟网络编辑器的那个网关ip一致就是192.168.100.2,所以配置GATEWAY=192.168.100.2,然后就是自己的IPADDR了,要保证两点,在子网段内 且 不和网关ip及该子网段内其他ip冲突,在子网段内就是 192.168.100 开头,不和网关ip及该子网段内其他ip冲突,就是最后一个不能为 2 或者其他用过的,所以是152,即 192.168.100.152 。

配置静态ip之后,就可以用xshell连接并操作了,不用再使用vmware敲命令,也有yum命令,缺少什么都可以随时下载,比如最小安装没有wget命令,可以yum -y install wget。

因为我们的两个虚拟机需要作为K8S的两个节点,每个虚拟机处理数量一定要大于等于2,每个虚拟机内存数量一定要大于等于2G,vmware默认是每个虚拟机处理器数量是1,内存是1G,需要手动设置一下,

Kubernetes部署_02_从零开始搭建k8s集群v1.21.0(亲测可用)_kubernetes_08

三、K8S集群搭建

从3.1到3.6,所有机器都执行
3.7和3.8只在主节点上执行
3.9的kube join只在从节点上执行(测试kubectl get nodes在主节点上执行,因为从节点没有.kube/,无法通过kubectl操作k8s集群)
3.10集群新建pod测试,在主节点上执行,因为从节点没有.kube/,无法通过kubectl操作k8s集群

3.1 更新yum(所有机器都执行)

3台机器都需要执行

yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
  • 1.
  • 2.

3.2 安装Docker(所有机器都执行)

在每一台机器上都安装好Docker,版本为19.03.0

01 安装必要的依赖

sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
  • 1.
  • 2.
  • 3.

02 设置docker仓库

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 1.

然后设置一下阿里云镜像加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://orptaaqe.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

03 安装docker

yum install -y docker-ce-19.03.0 docker-ce-cli-19.03.0 containerd.io
  • 1.

04 启动docker

sudo systemctl start docker && sudo systemctl enable docker
  • 1.

05 检查docker是否安装并启动好了

ps -ef|grep docker
  • 1.

3.3 修改hosts文件(所有机器都执行)

01 机器192.168.100.152执行两句

sudo hostnamectl set-hostname w2
  • 1.
vi /etc/hosts
192.168.100.150 w2
  • 1.
  • 2.

02 每天机器上都要测试

ping w2
  • 1.

每个步骤配置完成之后,都要局部测试,这样才不会出问题

Kubernetes部署_02_从零开始搭建k8s集群v1.21.0(亲测可用)_kubernetes_09

3.4 系统基础前提配置(所有机器都执行)

每个机器上都要执行(机器192.168.100.152),如下:

# (1)关闭防火墙
systemctl stop firewalld && systemctl disable firewalld

# (2)关闭selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# (3)关闭swap 且 写入到 /etc/fstab 文件中,保证重启机器也生效(即永久生效)
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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

Kubernetes部署_02_从零开始搭建k8s集群v1.21.0(亲测可用)_kubernetes_10

3.5 安装 kubeadm, kubelet and kubectl(所有机器都执行)

每个机器上都要执行(机器192.168.100.152),如下:

(1)配置yum源(为了能够 yum -y install kubelet/kubectl/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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

(2)安装kubeadm&kubelet&kubectl

yum install -y kubectl-1.21.0-0
yum install -y kubelet-1.21.0-0
yum install -y kubeadm-1.21.0-0
  • 1.
  • 2.
  • 3.

这三个东西一定要保证版本统一,一定要安装这个安装顺序来完成

因为kubeadm依赖kubelet,如果先安装kubeadm,则kubelet的1.23版本就会被安装上去,然后再执行 yum install -y kubelet-1.21.0-0 会安装不上去,然后版本不统一,主节点初始化init报错

Kubernetes部署_02_从零开始搭建k8s集群v1.21.0(亲测可用)_子网_11

这才是正确的

Kubernetes部署_02_从零开始搭建k8s集群v1.21.0(亲测可用)_ico_12

及时测试:

kubectl version
kubelet --version
kubeadm version
  • 1.
  • 2.
  • 3.

版本必须都是 1.21.0,如果版本错了要删除

yum -y remove kubelet
yum -y remove kubectl 
yum -y remove kubeadm
  • 1.
  • 2.
  • 3.

(3) docker和k8s设置同一个cgroup

默认情况下,docker和kubelet的cgroup driver都是groupfs,这里是都修改为systemd.

步骤1:修改 docker 的 cgroup driver

# 编辑docker的daemon.json文件,每个节点都要执行
vi /etc/docker/daemon.json
    "exec-opts": ["native.cgroupdriver=systemd"],
    
systemctl restart docker
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

步骤2:修改 kubelet 的 cgroup driver

# kubelet,这边如果发现输出directory not exist,也说明是没问题的,大家继续往下进行即可
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

systemctl enable kubelet && systemctl start kubelet
  • 1.
  • 2.
  • 3.
  • 4.

3.6 准备好镜像(所有机器都执行)

(1) 创建kubeadm.sh脚本,用于拉取镜像/打tag/删除原有镜像

#!/bin/bash

set -e

KUBE_VERSION=v1.21.0
KUBE_PAUSE_VERSION=3.4.1
ETCD_VERSION=3.4.13-0
CORE_DNS_VERSION=v1.8.0

GCR_URL=k8s.gcr.io
ALIYUN_URL=registry.cn-beijing.aliyuncs.com/dadfdafsd

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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.

(2) 运行脚本和查看镜像

# 运行脚本
sh ./kubeadm.sh

# 查看镜像
docker images
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

最后执行

docker tag k8s.gcr.io/coredns:v1.8.0 k8s.gcr.io/coredns/coredns:v1.8.0
  • 1.

至此,上面的3.1到3.6是每个节点都要执行的,就是所以机器都要同时执行的,在Xshell里面,通过

3.7 kube init初始化master(仅主节点机器执行)

到此为止,所有机器还没有主次之分,还没有说哪个是k8s的主节点,现在 3.7 这个步骤只需要在 192.168.100.152 节点执行,让这个机器成为k8s主节点。

(1)初始化master节点

kubeadm init --kubernetes-version=1.21.0 \
--apiserver-advertise-address=192.168.100.152 --pod-network-cidr=10.244.0.0/16
  • 1.
  • 2.

在 192.168.100.152 机器上执行,然后这个 --apiserver-advertise-address=192.168.100.152 这样写

会得到一句

kubeadm join 192.168.100.152:6443 --token 7oahxf.bk0rywevgu0xjouy
–discovery-token-ca-cert-hash sha256:4f84a48cc41343848d0b2f807c38937bc96d3d43e821f06b0c143a5282a38204

一定要复制粘贴出来,下一个步骤在 192.168.100.151 机器上执行这句。

Kubernetes部署_02_从零开始搭建k8s集群v1.21.0(亲测可用)_kubernetes_13

(2) 初始化完成执行后,继续只在 主节点 上执行,这三句,如下:

mkdir -p $HOME/.kube
cd .kube/
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 1.
  • 2.
  • 3.
  • 4.

注意:我们所说的只有主节点才能通过 kubectl 命令操作k8s集群是因为,只有主节点上才完成这三步操作,才有 .kube 目录,如果从节点上也完成了这三句,也有 .kube 目录,也是可以通过 kubectl 命令操作k8s集群的。

(3) 测试:验证pod和健康检查(这两句也是只在master节点上执行)

# 验证pod
kubectl get pods -n kube-system
# 健康检查(不要怀疑,就是healthz)
curl -k https://localhost:6443/healthz
  • 1.
  • 2.
  • 3.
  • 4.

3.8 部署calico网络插件(仅主节点机器执行)

k8s中,网络插件是为了k8s集群内部通信,所以必须安装一个网络插件,有很多选择,这里选择calico,同样在master节点上操作

# 在k8s中安装calico(这条命令很快的)
kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml

# 确认一下calico是否安装成功  -w可以实时变化(看到calico都好了表示网络插件好了)
kubectl get pods --all-namespaces -w
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

测试验证是否安装成功,这里的calico两个显示Running就表示安装成功了。

Kubernetes部署_02_从零开始搭建k8s集群v1.21.0(亲测可用)_容器_14

从3.1到3.6,所有机器都执行,3.7和3.8只在主节点上执行,接下来的3.9的kube join只在从节点上执行(测试kubectl get nodes在主节点上执行,因为从节点没有.kube/,无法通过kubectl操作k8s集群)

3.9 kube join(仅所有从节点机器执行)

(1) 在从节点上执行kube join命令,如下

kubeadm join 192.168.100.150:6443 --token 7oahxf.bk0rywevgu0xjouy \
    --discovery-token-ca-cert-hash sha256:4f84a48cc41343848d0b2f807c38937bc96d3d43e821f06b0c143a5282a38204
  • 1.
  • 2.

记得保存初始化master节点的最后打印信息,注意这边大家要自己的,下面我的只是一个参考

(2)在master节点上检查集群信息(node的正常状态是ready,pod的正常状态是running)

kubectl get nodes
  • 1.

当每个节点都是Ready,表示完成。

3.10 新建Pod测试整个集群(仅主节点机器执行)

(1)定义pod.yml文件,比如pod_nginx_rs.yaml

cat > pod_nginx_rs.yaml <<EOF
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
  labels:
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      name: nginx
      labels:
        tier: frontend
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
EOF
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

(2)根据pod_nginx_rs.yml文件创建pod

kubectl apply -f pod_nginx_rs.yaml
  • 1.

(3)查看pod

kubectl get pods
kubectl get pods -o wide
kubectl describe pod nginx
  • 1.
  • 2.
  • 3.

(4)感受通过rs将pod扩容

kubectl scale rs nginx --replicas=5
kubectl get pods -o wide
  • 1.
  • 2.

(5)删除pod

kubectl delete -f pod_nginx_rs.yaml
  • 1.

四、尾声

从零开始搭建k8s集群,完成了。

天天打码,天天进步!!