公网部署 k8s

公网部署 K8s

环境

一台腾讯云轻量应用服务器 2 核 4G

一台阿里云共享型服务器 1 核 2G

ubuntu 18.04 ( CKA 认证环境的系统 )

趁着双十二活动,花了 74 入手腾讯云轻量应用服务器,用于搭建 k8s 集群环境

环境准备

1
2
3
4
5
6
7
8
# 永久关闭交换区
sudo sed -i 's/.*swap.*/#&/' /etc/fstab

# 修改主机名
# master 节点执行
hostnamectl set-hostname master1 
# node 节点执行
hostnamectl set-hostname node1

允许 iptables 检查桥接流量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sudo sysctl --system

如下图所示,开放相应端口,如果使用 flannel 网络插件,需要开放 upd/8472 端口

image-20211222010656008

安装工具

安装 docker,国内建议自行使用镜像安装,以下为docker官网提供的安装方式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
    
    
 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg


echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  
 sudo apt-get update
 sudo apt-get install -f docker-ce docker-ce-cli containerd.io

配置 docker 的 cgroup,要跟 kubelet 使用的保持一致,否则 kubelet 进程会失败。

systemd 是 k8s 默认驱动。

1
2
3
4
5
6
7
cat > /etc/docker/daemon.json <<EOF
{
	"exec-opts": ["native.cgroupdriver=systemd"],
}
EOF

systemctl restart docker

安装 kubeadm

国内安装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb http://mirrors.tuna.tsinghua.edu.cn/kubernetes/apt/ kubernetes-xenial main
EOF

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys FEEA9169307EA071

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8B57C5C2836F4BEB

sudo apt-get update
# 若遇到秘钥问题,参考 https://www.cnblogs.com/reatual/p/14304675.html
sudo apt-get install -y kubelet kubeadm kubectl
systemctl enable --now kubelet

为 ip 配置别名

1
2
3
#echo "${ip} ${主机名}" >> /etc/hosts
echo "${master1_ip} master1" >> /etc/hosts
echo "${node1_ip} master2" >> /etc/hosts

提前拉取镜像,避免在初始化时过久等待

1
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers

创建虚拟网卡

1
sudo apt install ifupdown

临时生效

1
2
# sudo ifconfig eth0:1 ${公网 IP}
sudo ifconfig eth0:1 44.44.44.44

永久生效

1
2
3
4
5
6
7
8
9
cat <<EOF | sudo tee /etc/network/interfaces
auto eth0:1
iface eth0:1 inet static
# address ${公网 IP}
address 44.44.44.44
netmask 255.255.255.0
EOF

150.158.141.120
1
sudo /etc/init.d/networking restart

修改 kubelet 启动参数

添加 kubelet 的启动参数--node-ip=公网IP, 每个主机都要添加并指定对应的公网 ip

1
sudo vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

image-20211222012639793

master 初始化,如果初始化失败,可以重置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
kubeadm init \
--kubernetes-version v1.27.3 \
--apiserver-advertise-address=192.168.0.58 \
--image-repository=registry.aliyuncs.com/google_containers \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16 


# 重置
kubeadm reset -f
rm -rf /etc/cni/net.d
rm -rf $HOME/.kube
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#  当你看到如下信息时,初始化成功
Your Kubernetes control-plane has initialized successfully!
...
# 按提示,执行以下三行
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
...
# 用于 worker 节点加入集群
kubeadm join master1:6443 --token zqmjvh.5wij6n8j.........

修改 kube-apiserver 参数

- --bind-address=0.0.0.0

1
sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml

image-20211222013224975

安装 flannel 网络

下载 flannel 的 的 yaml 配置文件

1
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

修改配置文件

1
vim kube-flannel.yml

在 200 行左右

1
2
3
4
5
6
7
8
9
args:
 - --public-ip=$(PUBLIC_IP)
 - --iface=eth0

env:
 - name: PUBLIC_IP
   valueFrom:
     fieldRef:
       fieldPath: status.podIP

image-20211222013457005

开始安装网络插件

1
kubectl apply -f kube-flannel.yml

K8s 启用 ipvs

安装工具,方便检查配置

1
sudo apt-get install ipvsadm

ubuntu 永久启用 ipvs 模块

1
ls /lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*" >> /etc/modules

修改配置文件,找到 mode,后面参数修改为 ipvs

1
kubectl edit configmap kube-proxy -n kube-system

image-20211222013906175

删除所有的 kube-proxy 的 pod,并等待自愈恢复

1
$ kubectl delete pods `kubectl get pods -n kube-system | grep kube-proxy  | awk '{print $1}'` -n kube-system 

通过 kubectl logs 来查看启用 ipvs 的日志,检查是否正常启用

worker 节点加入集群

如果 token 过期,可以使用以下命令创建新的加入命令

1
kubeadm token create --print-join-command

在 worker 节点执行,等待执行结束

1
kubeadm join........

在 master 节点检查

1
kubectl get nodes

部署 nginx 测试

1
vim nginx.yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21.4
        ports:
        - containerPort: 80
1
kubectl apply -f nginx.yaml

开启服务

1
vim nginx-svc.yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30080
  type: NodePort
1
kubectl apply -f nginx-svc.yaml

image-20211222015209540

访问任意节点公网 IP:30080,查看是否能够请求到 nginx 主页

image-20211222015313801

部署 dashboard

国内可能无法访问此链接

1
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
1
kubectl apply -f recommended.yaml

设置访问端口

1
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

image-20211223124038088

查看端口

1
kubectl get svc -A |grep kubernetes-dashboard

参考

k8s 官方安装文档

公网环境搭建 k8s 集群

flannel

本文阅读量 次, 总访问量 ,总访客数
Built with Hugo .   Theme Stack designed by Jimmy