引言:
用的云服务器,整个过程读者还是需要准备些软妹币的…
另外众所周知,K8S最难的部分是什么?——是安装。。。

0. 技术选型( 🔔 重要!)

0.0 version

组件version
docker-ce19.03.8
docker-ce-cli19.03.8
container.io1.3.9
kubelet1.20.9
kubeadm1.20.9
kubectl1.20.9
calicov3.20.6

0.1 云服务器

规格:

  • 一台 master 2core 4G
  • 两台 slave 4core 8G

操作系统发行版:

  • CentOS 7.8

网络:

(注意本教程所选的 vpc 网段不是 192.168.xx.xx)

ecshostnameprivate IP
mastercluster-endpoint172.31.0.2
slave0cluster-slave0172.31.0.3
slave1cluster-slave1172.31.0.4

1. 容器运行时

我们选择 docker 。

随便选个空目录,新建脚本文件 docker.sh。内容如下:

#!/bin/bash

# ============================== 先安装 ==================================
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息 用阿里云的 不然慢死
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE,指定版本
sudo yum makecache fast
sudo yum -y install docker-ce-19.03.8 docker-ce-cli-19.8 container.io-1.3.9 
# Step 4: 开启Docker服务
sudo systemctl enable docker --now

# ====================== 再改配置 ======================================
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "registry-mirrors": ["https://xxxxxxxxx.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

# 使上述配置生效
systemctl daemon-reload
systemctl restart docker

建好后,

# 添加可执行权限
chmod +x docker-install.sh
# 然后执行
./install-docker.sh

解释说明:

上面脚本文件的第二部分“===再安装===”是为了创建 /etc/docker/daemon.json 配置文件。

“registry-mirror” 是在配阿里云 mirror 加速器(由于一些科学上网相关的原因)(不知道怎么找自己加速器地址的可自行百度)。
“exec-opts” 是在修改控制组 cgroup driver 为 systemd。

2. k8s 安装前准备

请参考 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ 的 《Before you begin》

2.0 网络连接

请你确保3台服务器加入同一vpc, 网段为 172.31.0.0/16 ,设置内网网络互信

(这里有个小坑,后面讲)

2.1 hostname

设 hostname 用命令 hostnamectl set-hostname xxx. 按照上面 1.0 章节的表设置。

2.2 其他配置

注意 ⚠ :
把 “你的master内网IP” 处改为自己的IP。

#!/bin/bash

# 域名解析
echo "你的master内网ip cluster-enpoint" >> /etc/hosts

# 暂时关防火墙
systemctl stop firewalld
# 然后永久关
systemctl disable firewalld

# 暂时禁用交换分区
sudo swapoff -a
# 永久禁用交换分区. 不同发行版这个配置文件位置可能不同,可根据自己情况修改
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 允许 iptables 检查桥接流量。(把一些 ipv6 的流量桥接到 ipv4 方便统计)
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
# 设置 bridge
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
EOF

# 让上面配置生效
sudo sysctl --system

# 暂时关selinux
sudo setenforce 0
# 永久关selinux
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

加权限,执行。日志大概长这样:

没有报错就是执行成功!

3 安装 k8s

k8s 集群的主流安装方式有三种,我们选用最常见的 kubeadm 方式。

  • minikube 单机版的本地 kube
  • 二进制安装
  • kubeadm 等安装工具

3.0 kubeadm

这是一个引导安装工具。有点像 windows 里我们的安装向导程序 xx-setup.exexx-setup.msi


下面我们执行下面这个脚本文件 kubeadm.sh

注意,

注意 ⚠ :
把 “你的master内网IP” 处改为自己的 IP。
在 slave 节点上请去掉分割线后的部分!

#!/bin/bash

# 添加阿里的 yum 源服务器
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-\$basearch
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 clean all && yum makecache

# 开始下载!!
yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes
# 安好了 查看版本
kubeadm version
# kubelet 开机自启
systemctl enable kubelet --now

# ======================= slave 节点不需要下面 ====================

# 害怕init master 卡住,于是提前下 images 的一段脚本。master 需要以下这些组件。这里我用了b站尚硅谷教程里的 image-repository,感谢尚硅谷啊
sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOF

chmod +x ./images.sh && ./images.sh

# 初始化 master 节点. 这里我用了b站尚硅谷教程里的 image-repository
kubeadm init \
--apiserver-advertise-address=你的master内网IP \
--control-plane-endpoint=cluster-master \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16

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

pod-network-cidr

如果你的云服务器 vpc 没用我推荐的网段,,大部分人估计是 192.168.xx.xx,那会和上面 init master 的 pod-network-cidr 冲突。

如果你是这种情况,复制脚本文件时改下这个字段,改成任意一个避开你自己 vpc 的网段即可,比如改成 ‘172.31.0.0/16’…

详情参见 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network

Take care that your Pod network must not overlap with any of the host networks: you are likely to see problems if there is any overlap. (If you find a collision between your network plugin’s preferred Pod network and some of your host networks, you should think of a suitable CIDR block to use instead, then use that during kubeadm init with --pod-network-cidr and as a replacement in your network plugin’s YAML).

成功:

image.png

如果你为了保护钱包没按开头规定买服务器,选了低规格的云服务器,就会出现这个。。

image.png

# 如果你是 root 用户,成功后执行下这个
export KUBECONFIG=/etc/kubernetes/admin.conf

3.1 calico

选一个 pod network 插件下载。这里我们选 calico。

按照官网的版本匹配关系,我们该安指定版本v3.20.6。可能阿里云觉得它比较小众,所以阿里云加速器里存的 calico 并不全。想 pull 指定 tag 是走不了加速器的,最终还是会去 dockerHub pull。除非运气爆棚,否则就是失败,失败,再失败。。

“阿里云镜像加速器” 的 “镜像” 是指‘mirror’. 实质上是个缓存备份(cache),详情参见 https://docs.docker.com/registry/recipes/mirror/

本教程中我的解决方式是曲线救国。由于我的 windows 笔记本是有 VPN 的,可以从 calico 的 github 飞速地下载 image 们的 tar 包们。Release v3.20.6 · projectcalico/calico (github.com)。下完传到云服务器上。然后加载(docker load) tar 包形成 image。

release-v3.20.6.tgz同目录新建 calico.sh

# !/bin/bash

# 解压
tar -zxvf release-v3.20.6.tgz

cd release-v3.20.6
cd images

# 循环加载 image
sudo tee load-images.sh <<-'EOF'
#!/bin/bash
tars=(
calico-kube-controllers.tar
calico-node.tar
calico-typha.tar
calico-cni.tar
calico-pod2daemon-flexvol.tar
)
for tar in ${tars[@]} ; do
docker load < $tar
done
EOF

chmod +x load-images.sh && ./load-images.sh

# 替换 docker.io 前缀
cp ../k8s-manifests/calico.yaml ../k8s-manifests/calico.cp.yaml
sed -i 's/image: docker.io\//image: /g' calico.yaml

# 如果你的 VPC 网段和 pod-network 不冲突,那么可以解开下面注释
# kubectl apply -f ../k8s-manifests/calico.yaml

说明 ✒:
原本 calico.yaml 中所规定的 image 资源都是长这样的 docker.io/calico/cni:v3.20.6, 由于这个 docker.io/ 前缀会导致 k8s 去 DockerHub 上找 image (前面已解释了走不了阿里加速器的原因),而不是使用刚才我们导入进本地的 images。所以我们用 sed -i 来全局查找替换,去掉它们。

pod-network-cidr

关于最后一行脚本——

再一次,如果你的云服务器 vpc 没用我推荐的网段,,,大部分人估计是 192.168.xx.xx,那会和上面 calico 默认的 Ipv4pool_cidr 冲突。

修改 calico.yaml 文件,解注释,改网段:

在这里插入图片描述

🔔 和章节 4.1 中你 init master 用的 pod-network-cidr 的地址保持一致!!

然后可以编排资源了:

kubectl apply -f calico.yaml

4. 成功

# 检查下 k8s 集群的 pod 们
kubectl get pod -A

如果你的哪个 pod 有问题,可以用 describe 排查:

kubectl describe pod [POD_NAME] -n [NAMESPACE]

全都成功的话长这样:

image.png

使用本教程遇到坑的话欢迎留言探讨~

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐