侧边栏壁纸

公网搭建K8S集群

2023年06月23日 1.7k阅读 1评论 3点赞

bg1_1.jpg

公网搭建K8S集群

一、背景:

1、实验背景🧪

在学习k8s搭建中,网上大部分教程都是用虚拟机做单机集群,只有极少数是使用服务器搭建教程;但是用云服务器搭建的教程中教程版本都比较老(随着时间的推移),因为没有详细说明之后更新的版本需要怎么搭建?搭建完后可能会有小白问,为什么k8s搭建需要指定版本的kubelet kebeadm docker 等等环境?如果以后有更新的k8s那又需要怎么找到合适的版本进行搭建,这个是很多网上都没有介绍的。

2、准备工作

这里准备了三台服务器进行测试
124.221.152.207 master 腾讯云 4H8G CentOS7.6
36.133.77.173 node1 移动云 2H4G CentOS7.6
123.123.123.123 node2  俄罗斯 1H2G CentOS7.6

----------------------------------------------------------------------
1、搭建时建议是最干净的系统(可以是刚开通的机器或者重装系统后的机器)

2、不同版本的k8s对服务器的系统环境也是不一样的,如果搭建有问题建议更换系统版本~~

主机端口设置

默认阿里云ECS所有入网方向端口都需要自己手动开启,腾讯云EVM入网方向所有端口都放开了。

  • master端口开放

    协议方向端口说明
    TCP入站6443Kubernetes API server
    TCP入站2379-2380etcd server client API
    TCP入站10250Kubelet API
    TCP入站10251kube-scheduler
    TCP入站10252kube-controller-manager
    UDP入站8472k8s fannel vxlan
    UDP入站8472k8s fannel vxlan

    默认master是不允许进行非系统的pod部署的,后续k8smaster节点部署起来之后如果执行将master允许pod 部署的话(也就是执行了下面的命令):

    # kubectl taint node k8s-master node-role.kubernetes.io/master-

    那么master节点也需要开放30000-32767的入站方向的tcp端口

  • node节点端口开放

    协议方向端口说明
    TCP入站10250Kubelet API
    TCP入站30000-32767k8s NodePort ServicesI

二、部署流程🚗

1、更新yum源

yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp

2、安装Docker

在每一台机器上都安装好Docker,版本为 19.03.14

2.1 安装必要的依赖

sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

2.2 设置docker仓库

sudo yum-config-manager --add-repo https://mirror.azure.cn/docker-ce/linux/centos/docker-ce.repo

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
然后设置一下阿里云镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://dysf0kvk.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload

2.3 安装docker

yum install -y docker-ce-19.03.14 docker-ce-cli-19.03.14

2.4 启动docker

sudo systemctl start docker && sudo systemctl enable docker

2.5 检查docker是否安装成功

ps -ef|grep docker

3、修改hosts文件

3.1 设置主机名称

## master节点用master node节点用node1或者自定义
sudo hostnamectl set-hostname master 
bash ## 刷新一下看看名称有没有改成功

3.2 增加hosts配置

cat >> /etc/hosts << EOF
124.221.152.207 master
36.133.77.173 node1
123.123.123.123 node2
EOF

4、系统基础配置(每个机器都要配置)

4.1 系统配置

# (1)关闭防火墙
systemctl stop firewalld && systemctl disable firewalld

# (2)关闭selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# (3)关闭swap
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab

# (4)配置iptables的ACCEPT规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT

# (5)设置系统参数
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system

4.2 安装 kubectl,kubelet ,kubeadm

每个机器都要安装!!!

4.2.1 配置源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
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

4.2.2 kubectl,kubelet ,kubeadm安装

这三个东西一定要保证版本统一,一定要安装这个安装顺序来完成
yum install -y kubectl-1.23.1-0
yum install -y kubelet-1.23.1-0
yum install -y kubeadm-1.23.1-0
查看安装后的版本。
kubectl version
kubelet --version
kubeadm version

4.2.3 设置服务开机启动

systemctl enable kubelet

4.3 docker和k8s设置同一个cgroup

# 编辑docker的daemon.json文件,每个节点都要执行
vi /etc/docker/daemon.json
# 增加这行
"exec-opts": ["native.cgroupdriver=systemd"]
    
systemctl restart docker

4.4 在master节点初始化kubeadm

4.4.1 初始化

给所有节点创建一个与外网IP一样的虚拟IP
# 看一下你的公网IP是否在机器中存在
ip a | grep 124.221.152.207

# 如果没有就执行下面这段代码新增一个和公网IP一样的虚拟网卡IP
cat > /etc/sysconfig/network-scripts/ifcfg-eth0:1 <<EOF
BOOTPROTO=static
DEVICE=eth0:1
IPADDR=124.221.152.207
PREFIX=32
TYPE=Ethernet
USERCTL=no
ONBOOT=yes
EOF


cat > /etc/sysconfig/network-scripts/ifcfg-eth0:1 <<EOF
BOOTPROTO=static
DEVICE=eth0:1
IPADDR=36.133.77.173 
PREFIX=32
TYPE=Ethernet
USERCTL=no
ONBOOT=yes
EOF

# 初始化kubeadm
systemctl restart network

# 初始化
kubeadm init --image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=1.23.1 \
--pod-network-cidr=192.168.0.0/16 \
--control-plane-endpoint=124.221.152.207 \
--apiserver-advertise-address=124.221.152.207 --v=5

# 如果出现报错就执行这个
echo 1 > /proc/sys/net/ipv4/ip_forward
安装成功后会得到node节点接入时需要的token,把它复制下来!

4.4.1.png

kubeadm join 124.221.152.207:6443 --token l3uozx.78h0yyw7mkzx24cl \
        --discovery-token-ca-cert-hash sha256:1b61cd58b4a3a09bac38ae05a2601a5f2681660bae85e5792359385fd6ea31fd
继续按照提示操作
mkdir -p $HOME/.kube
cd .kube/
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
vim /etc/profile
# 添加以下内容永久生效
export KUBECONFIG="/etc/kubernetes/admin.conf"
# 执行一下
source /etc/profile

4.4.2 部署calico网络插件

# 在k8s中安装calico(这条命令很快的)
kubectl create -f https://docs.projectcalico.org/v3.23/manifests/calico.yaml

# 确认一下calico是否安装成功  -w可以实时变化(看到calico都好了表示网络插件好了)
kubectl get pods --all-namespaces -w
安装和验证。

4.4.2.1.png

验证pod和健康检查(这两句也是只在master节点上执行)
# 验证pod
kubectl get pods -n kube-system
# 健康检查(不要怀疑,就是healthz)
curl -k https://localhost:6443/healthz

4.4.2.2.png

4.4.3 需要使用 ipvs 替换iptables,操作是在所有节点上

## 开启内核支持
cat >> /etc/sysctl.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

## 执行生效
sysctl -p

## 开启ipvs支持
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

## 配置kube-proxy,在master节点上操作
kubectl edit cm kube-proxy -n kube-system

## 文件示例
ipvs:
      excludeCIDRs: null
      minSyncPeriod: 0s
      scheduler: ""
      syncPeriod: 30s
    kind: KubeProxyConfiguration
    metricsBindAddress: "":
    mode: "ipvs"                  #修改

在master重启kube-proxy
kubectl  get pod -n kube-system | grep kube-proxy | awk '{print $1}' | xargs kubectl delete pod -n kube-system

4.5 node节点加入集群

4.5.1 到node节点的服务器上执行以下命令

kubeadm join 124.221.152.207:6443 --token l3uozx.78h0yyw7mkzx24cl \
        --discovery-token-ca-cert-hash sha256:1b61cd58b4a3a09bac38ae05a2601a5f2681660bae85e5792359385fd6ea31fd --v=5

4.5.2 切换到master服务器执行一下命令查看节点加入情况

kubectl get nodes 

## 当每个节点都是Ready,表示完成。

4.5.2.png

5、定义一个nginx pod进行集群测试

cat > pod_nginx_rs.yaml <<EOF
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
  labels:
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      name: nginx
      labels:
        tier: frontend
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
EOF
执行命令创建pod
kubectl apply -f pod_nginx_rs.yaml
查看pod状态
kubectl get pods
kubectl get pods -o wide
kubectl describe pod nginx
感受通过rs将pod扩容
kubectl scale rs nginx --replicas=5
kubectl get pods -o wide
删除pod
kubectl delete -f pod_nginx_rs.yaml

6、安装 Dashboard 插件

## 下载文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

# 搜索Service 将 type改成 NodePort
vi recommended.yaml

# 执行
kubectl create -f recommended.yaml

6.0.png

添加用户获取登陆token
vi dashboard-admin.yml
复制以下内容到bashboard-admin.yml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
  

# 执行生成
kubectl apply -f dashboard-admin.yml

# 查看token
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

6.0.1.png

## 查看对外访问端口
kubectl -n kubernetes-dashboard get service kubernetes-dashboard

## 内部端口:外网端口
## 如果内部是443 则对外访问是 https://你的ip:31318

6.0.2.png

7、疑惑解答

7.1 安装k8s时为什么需要限定docker版本、k8s版本版本❓

答:首先是为什么需要指定docker版本,因为k8s对应的版本对有些docker版本不支持(k8s各版本对环境的参考地址:https://github.com/kubernetes/kubernetes/releases)以下是教程如何找到合适的docker版本。

7.1.png

答:从以上可以看出docker v20.10.12+到v20.10.17+的都不支持,此时可以搜索一下docker的各个版本列表,只要不是在上述限定的版本范围内的都可以,建议向下版本如本次搭建的docker版本。

7.2 kubelet节点加入的token忘记了或者失效了怎么办 ❓

## 默认有效期24小时,若想久一些可以结合--ttl参数,设为0则用不过期
kubeadm token create --print-join-command 

7.3 为什么要给master节点创建一个和master节点公网IP一样的虚拟网卡❓

答:首先所有节点后需要ping通master节点上的IP,但是在目前的云服务器上公网IP不是实实在在绑定在机器上的(当然有的服务器内公网用的确实是一个IP),这个时候需要进行虚拟网卡的创建否则在kubeadm init的时候会卡死。

7.4 calico是个啥❓

答:calico是k8s中CNI网络组件

7.5 calico插件版本怎么知道和k8s的版本对应❓

  1. 首先需要查看你当前的k8s版本是哪个。
kubelet --version

7.5.1.png

  1. 前往calico官网
    传送门👈

7.5.2.png

  1. 选择一个版本

7.5.3.png

  1. 查看k8s支持的版本

7.5.4.png

8、最终的master节点效果图

watch kubectl get pods -A -o wide 

8.0.png

本文参考:

  1. Kubernetes第二篇:从零开始搭建k8s集群(亲测可用)
  2. 基于阿里云公网IP安装部署k8s集群
3

—— 评论区 ——

博主关闭了所有页面的评论
博主栏壁纸
7 文章数
8 标签数
5 评论量
人生倒计时
舔狗日记