目录
- 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
配置文件。
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 其他配置
#!/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
。
注意,
#!/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
EOFyum 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
EOFchmod +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
成功:
如果你为了保护钱包没按开头规定买服务器,选了低规格的云服务器,就会出现这个。。
# 如果你是 root 用户,成功后执行下这个
export KUBECONFIG=/etc/kubernetes/admin.conf
3.1 calico
选一个 pod network 插件下载。这里我们选 calico。
按照官网的版本匹配关系,我们该安指定版本v3.20.6。可能阿里云觉得它比较小众,所以阿里云加速器里存的 calico 并不全。想 pull 指定 tag 是走不了加速器的,最终还是会去 dockerHub pull。除非运气爆棚,否则就是失败,失败,再失败。。
本教程中我的解决方式是曲线救国。由于我的 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.tgzcd 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
EOFchmod +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
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]
全都成功的话长这样:
使用本教程遇到坑的话欢迎留言探讨~
本文链接:https://my.lmcjl.com/post/11099.html
4 评论