引言:
用的云服务器,整个过程读者还是需要准备些软妹币的…
另外众所周知,K8S最难的部分是什么?——是安装。。。
目录
- 0. 技术选型( :bell: 重要!)
- 0.0 version
- 0.1 云服务器
- 1. 容器运行时
- 2. k8s 安装前准备
- 2.0 网络连接
- 2.1 hostname
- 2.2 其他配置
- 3 安装 k8s
- 3.0 kubeadm
- pod-network-cidr
- 3.1 calico
- pod-network-cidr
- 4. 成功
0. 技术选型( 🔔 重要!)
0.0 version
组件 | version |
---|---|
docker-ce | 19.03.8 |
docker-ce-cli | 19.03.8 |
container.io | 1.3.9 |
kubelet | 1.20.9 |
kubeadm | 1.20.9 |
kubectl | 1.20.9 |
calico | v3.20.6 |
0.1 云服务器
规格:
- 一台 master 2core 4G
- 两台 slave 4core 8G
操作系统发行版:
- CentOS 7.8
网络:
(注意本教程所选的 vpc 网段不是 192.168.xx.xx)
ecs | hostname | private IP |
---|---|---|
master | cluster-endpoint | 172.31.0.2 |
slave0 | cluster-slave0 | 172.31.0.3 |
slave1 | cluster-slave1 | 172.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.exe
或 xx-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).
成功:
如果你为了保护钱包没按开头规定买服务器,选了低规格的云服务器,就会出现这个。。
# 如果你是 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]
全都成功的话长这样:
使用本教程遇到坑的话欢迎留言探讨~