公网搭建K8S+Flannel+Dashboard

故事背景:我有阿里云一台服务器,腾讯云两台服务器,同时域名在阿里云,映射到腾讯云会被拦截,前期本来打算说搞个反向代理就完了的,最近闲了下来,想着要干就干票大的,加上公司现在最新的架构体系也是K8S这套,于是就抱着学习的心态,准备自己也搞一搞,熟悉一下。

废话不多说,直接上干货

系统版本均为:CentOS 7.9.2009

节点名称 公网ip 内网ip(指云服务器内网ip)
master 139.196.6.170 172.19.231.119
node1 110.40.21.160 10.0.16.3
node2 162.14.5.30 10.0.0.12
1.设置主机名
# 先设置每台服务器的名称,设置完成后,关闭ssh客户端重连
# 例:hostnamectl set-hostname master
hostnamectl set-hostname 节点名称

2.设置主机host
# 修改 /etc/hosts 文件,将自己的ip和主机名进行映射

cat <<EOF >>/etc/hosts

139.196.6.170 master
110.40.21.160 node1
162.14.5.30 node2

EOF

3.开放端口/关闭防火墙
# 一般来说关闭防火墙都是没有办法的办法,实在万不得已还是别关,以下2种方式2选1即可
# 1.简单粗暴的关闭防火墙服务
systemctl stop firewalld
systemctl disable firewalld

# 2.开放对应端口
# 自行开放以下端口
# master主机需要开放
6443             Kubernetes API server
2379-2380        etcd server client API
10250            Kubelet API
10259            kube-scheduler
10257            kube-controller-manager

# node主机需要开放
10250            Kubelet API
30000-32767      NodePort Services

4.将公网ip挂载到虚拟网卡
# 1.临时办法(重启失效)
sudo ifconfig eth0:1 公网ip

# 2.创建虚拟网卡
vi /etc/sysconfig/network-scripts/ifcfg-eth0:1

DEVICE=eth0:1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=公网ip
NETMASK=255.255.255.0

# 保存退出后需要重启网络服务
service network restart

5.关闭linux安全模式

setenforce 0
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab

6.创建k8s.conf,实现nat转发

cat > /etc/sysctl.d/k8s.conf <<EOF

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
 
EOF

sysctl --system

7.安装wget工具
yum install -y wget

8.创建repo源
mkdir /etc/yum.repos.d/bak && mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo
yum clean all && yum makecache

9.创建kubernetes.repo源
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

10.配置docker源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

11.安装启动docker
yum install -y docker-ce-18.06.1.ce-3.el7
systemctl enable docker && systemctl start docker
docker --version

12.安装kubelet、kubeadm 、kubectl
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet

13.配置docker
echo '{"exec-opts": ["native.cgroupdriver=systemd"]}' | sudo tee /etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet

以上1-13节均需要在master以及node主机上执行

14.初始化集群
# kubernetes-version 通过命令 kubelet --version 查询得到
# pod-network-cidr不要更改,本文使用flannel网络组件默认是10.244.0.0/16,如果此处更改,那么后面附加flannel组件时,也需要修改kube-flannel.yml文件

kubeadm init --kubernetes-version=1.23.1 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --apiserver-cert-extra-sans master的公网ip --apiserver-advertise-address master的公网ip

# 初始化成功后记录join命令,并根据提示执行
# 此时先不要join,先安装网络组件以及dashboard

15.获取并修改kube-flannel.yml文件
# 如果之前修改过pod-network-cidr,需要修改文件里边对应这部分
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 附加flannel网络组件
kubectl apply -f kube-flannel.yml

# 此时可以同步join其他节点了


16.修改flannel对外ip
# 通过kubectl edit node master 可以查看到都是使用flannel分配的内网ip进行通信的
# 修改为使用公网ip
kubectl annotate node master flannel.alpha.coreos.com/public-ip-overwrite=139.196.6.170 --overwrite
kubectl annotate node node1 flannel.alpha.coreos.com/public-ip-overwrite=110.40.21.160 --overwrite
kubectl annotate node node2 flannel.alpha.coreos.com/public-ip-overwrite=162.14.5.30 --overwrite

# 还需要配置内网ip转发到外网ip(内网IP是指服务器硬件本身的内网ip,不是flannel分配的)
# 因为flannel重启后会重新构建iptables规则,有可能把这几条就移除掉了,重启应用后如果不能访问,需要重新执行
iptables -t nat -A OUTPUT -d 172.19.231.119  -j DNAT --to-destination 139.196.6.170
iptables -t nat -A OUTPUT -d 10.0.16.3  -j DNAT --to-destination 110.40.21.160
iptables -t nat -A OUTPUT -d 10.0.0.12  -j DNAT --to-destination 162.14.5.30

# 重启应用
systemctl stop kubelet
systemctl stop docker
iptables --flush
iptables -tnat --flush
systemctl start kubelet
systemctl start docker


17.部署dashboard
# 拉取配置文件,修改type=nodePort,修改nodePort=想要的ip(30000-32767),我修改的是30080
wget 
 https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

kubectl apply -f recommended.yaml

# 创建ui登录用户
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
# 查询token
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep dashboard-admin | awk '{print $1}')

# 此时可以访问https://139.196.6.170:30080,输入刚刚查询出来的token进行登录



18.疑难杂症处理
# 找不到服务的时候
sudo cp /etc/kubernetes/admin.conf ~/.kube/config

# 重新注册命令
kubeadm token create --print-join-command

# 查看pods信息
kubectl get pods --all-namespaces -o wide
kubectl get pods --all-namespaces
kubectl get pods -n kubernetes-dashboard

# 查看pods详细信息
kubectl describe pods -n kube-system coredns-5bfd685c78-mmjxc

# busybox调试
kubectl run busybox --rm=true --image=busybox --restart=Never -it

# 进入容器
kubectl exec -it 容器id -- /bin/bash

# 停止kubelet
systemctl stop kebulet

# 清理docker容器
docker system prune

# 正确移除一个pod
# 查询pod
kubectl get pod -n default
# 删除pod
kubectl delete pod lynkco-helper-platform-api-8775b865-wrcmd -n default
# 查询deployment
kubectl get deployment -n default
# 删除deployment
kubectl delete deployment lynkco-helper-platform-api -n default

# No route to host
systemctl stop kubelet
systemctl stop docker
iptables --flush
iptables -tnat --flush
systemctl start kubelet
systemctl start docker

总结:公网部署k8s和内网基本一致,需要注意的就是apiserver-advertise-address为公网ip

其次就是注意flannel的内网与外网转发还有就是iptables规则

收藏 (0)
评论列表
正在载入评论列表...
我是有底线的