最开始测试部署的k8s集群是在本地的三个虚拟机上,由于服务越来越复杂,决定就直接搭在阿里云的服务器上了。目前的两台机器还行(4+8和2+4),有其它厂商的服务器,但是就得走公网,感觉没多大意义了,所以就用这两台机器来测试了。(PS:轻量应用服务器没得安全组的,hhh)
篇幅原因,这里只涉及Kubernetes集群的基础部署,KubeSphere等其他套件部署见后续文章。
0x01.环境基础
- 阿里云服务器1:4核+8G。系统:Centos8.2,内网ip:172.17.xx.xx,公网ip:39.96.xx.xx
- 阿里云服务器2:2核+4G。系统:Centos8.2,内网ip:172.17.xx.xx,公网ip:59.110.xx.xx
- 两台服务器使用同一个VPS,使用同一个安全组,内网可以互相ping通。(如果内网不能互相ping通,那么就是公网集群环境,部署的方式有较大差异。)
- 两台服务器均安装了Docker。
- 采用一主一从模式,其中master节点也作为一个node。
- 安装的Kubernetes及其组件的版本为v1.17.3。
- 如果nodes增加,只需要按照nodes的部署步骤操作即可。
0x02.Kubenetes组件安装及准备(所有节点执行)
1.准备:关闭swap分区
- 该版本的Kubernetes默认不支持开启swap的情况下运行。(也可以修改配置保持在开启swap分区的情况下运行,但最好关闭swap分区)
- 关闭swap分区:
# 暂时关闭swap分区
swapoff -a
# 永久关闭swap分区 或进入/etc/fstab文件,注释掉swap所在行
sed -ri's/.*swap.*/#&/' /etc/fstab
2.准备:关闭selinux安全策略
- selinux实际上没多大用处,但会产生很多没必要的提示。最好关掉。
- 永久关闭slinux:
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
3.准备:桥接IPv4流量
- 桥接IPv4流量传递到iptables链 ,便于流量统计。
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf
4.配置:yum配置阿里云的Kubernetes源
- 告诉yum下载阿里云镜像上的Kubernetes。
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
5.安装:kubeadm,kublet,kubectl
- 配置好源后直接用yum下载。
yum install -y kubelet-v1.17.3 kubeadm-v1.17.3 kubectl-v1.17.3
- 安装成功的界面:
6.设置开机启动
systemctl enable kubelet
systemctl start kubelet
7.开放相关端口
- 由于需要多个服务器间通信,可以选择关闭防火墙或者开放相关的端口。
- 端口信息:https://v2-1.docs.kubesphere.io/docs/zh-CN/installation/port-firewall/
服务 | 协议 | 操作 | 起始端口 | 结束端口 | 备注 |
---|---|---|---|---|---|
ssh | TCP | allow | 22 | ||
etcd | TCP | allow | 2379 | 2380 | |
apiserver | TCP | allow | 6443 | ||
calico | TCP | allow | 9099 | 9100 | |
bgp | TCP | allow | 179 | ||
nodeport | TCP | allow | 30000 | 32767 | |
master | TCP | allow | 10250 | 10258 | |
dns | TCP | allow | 53 | ||
dns | UDP | allow | 53 | ||
local-registry | TCP | allow | 5000 | 离线环境安装 | |
local-apt | TCP | allow | 5080 | 离线环境安装 | |
rpcbind | TCP | allow | 111 | 使用 NFS 作为持久化存储 | |
ipip | IPIP | allow | Calico 需要允许 IPIP 协议 |
0x03.Master节点初始化
1.下载Master节点所需镜像
- 运行该shell脚本,批量下载Master节点所需镜像。
#!/bin/bash
images=(
kube-apiserver:v1.17.3
kube-proxy:v1.17.3
kube-controller-manager:v1.17.3
kube-scheduler:v1.17.3
coredns:1.6.5
etcd:3.4.3-0
pause:3.1
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
done
2.Master节点初始化
- 使用kubeadm进行Master节点的初始化。
apiserver-advertise-address
修改为内网ip。
kubeadm init \
--apiserver-advertise-address=172.17.96.12 \
--kubernetes-version v1.17.3 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16
3.复制配置文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.部署网络插件
- 使用配置好的yml文件部署flannel插件。
kubectl apply -f kube-flannel.yml
- yml文件内容太多,需要请私聊我。
5.让Master也能当作Node使用的方法
kubectl taint node Master名 node-role.kubernetes.io/master-
0x04.node节点加入集群
- 复制Master节点初始化完成后的token信息,在子结点中粘贴。
kubeadm join 172.17.96.12:6443 --token n7ybwv.0q1d8f7w9k9lok7e \
--discovery-token-ca-cert-hash sha256:9c8db5e1f190d1b01bfc2084ded47d2c14ff4c143935839a57376f0e71b09cf6
0x05.验证集群是否搭建成功
- 在Master节点查看,子节点是否在集群中:
kubectl get nodes
- 查看所有pod的状态是不是Running。如果有pod一直处在某一个状态,那么这个pod就出现了问题,可以查看日志。
kubectl get pods --all-namespaces
# 查看具体pod的日志
kubectl describe pod pod名 --namespace=命名空间
0x06.kubeadm重新初始化
- Master节点:
# 输入 y 确认
kubeadm reset
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm /var/lib/cni/ -rf
rm /etc/kubernetes/ -rf
rm /var/lib/kubelet/ -rf
rm -rf $HOME/.kube
- 子节点:
rm -rf /etc/kubernetes/*
- 即可回到初始只安装好三个基本组件的状态。