WSの小屋

遇到的问题包括但不限

  • master 节点初始化卡死 [wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s

  • node 节点 join 卡死 [preflight] Running pre-flight checks

  • 启动一个 pod 时,一直 ContainerCreating

  • master 节点 ping 不通 pod 的 ip(如果能把这个ping通,网络问题应该就算是解决了)

2024 年 2 月 25 日 23:51 终于通了!!!

对比内网环境,公网部署 k8s 需要额外进行一些操作

  • 需要为每台机器配置一个虚拟网卡
  • 需要为每台机器配置 kubelet 启动参数(--node-ip <公网 ip>)
  • flannel 网络插件启动前,需要修改特定配置

配置虚拟网卡

云服务器上的网卡用到的 ip 通常不是公网 ip,导致部署 k8s 遇到很多问题

解决方案是配置一个虚拟网卡,绑定至云服务的默认网卡,将虚拟网卡的 ip 设置为公网 ip

bash 复制代码
# 临时开启一个虚拟网卡
sudo ifconfig eth0:1 111.229.192.102 up

配置后大概长这样:

若要永久开启,可以将该命令写入至 /etc/profile

bash 复制代码
sudo vim /etc/profile

sudo ifconfig eth0:1 111.229.192.102 up添加至末尾

这样每次启动时会自动执行这段命令

注意 eth0:1 这一段,eth0 是你的真实网卡名称;后续的 ip 是你的公网 ip

也是后续配置 flannel 插件,需要用的到的网卡名

不同服务器的网卡名不一样怎么办?

在ubuntu22系统(其它系统暂不清楚)下,可以用set-name属性指定网卡名
文件在/etc/netplan/xxx.yaml

yaml 复制代码
network:
    version: 2
    ethernets:
        ens3: # 不要改这里,否则网络会挂掉
            dhcp4: true
            match:
                macaddress: fa:16:3e:4d:56:4c
            mtu: 1450
            set-name: ens3 # 设置网卡名

这里的网卡名设置很关键,后续fannel插件启动时就要指定一个网卡名,如果服务器间的网卡名不同,则fannel网络就会出现问题

为 kubelet 配置启动参数,(指定 node-ip,每台服务器都要设置)

编辑配置文件

bash 复制代码
sudo vim /lib/systemd/system/kubelet.service.d/10-kubeadm.conf

ExecStart后面添加--node-ip=公网ip

conf 复制代码
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --node-ip=111.229.192.102

重启服务

bash 复制代码
sudo systemctl daemon-reload

Flannel 网络插件启动配置

编辑 kube-flannel.yml 配置文件

yaml 复制代码
...
    containers:
      - name: kube-flannel
        image: docker.io/flannel/flannel:v0.24.2
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        - --public-ip=$(PUBLIC_IP) # 在此添加,PUBLIC_IP定义在下方env:
        - --iface=eth0 # 在此添加,指定你的网卡名
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
            add: ["NET_ADMIN", "NET_RAW"]
        env:
        - name: PUBLIC_IP # 在此添加
          valueFrom: # 在此添加
            fieldRef: # 在此添加
              fieldPath: status.podIP # 在此添加
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: EVENT_QUEUE_DEPTH
          value: "5000"
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
        - name: xtables-lock
          mountPath: /run/xtables.lock
...

感谢

公网环境搭建 Kubernetes (k8s) 集群的详细图解
多个公网服务器搭建 k8s 集群
在 Linux 公网、云服务器搭建 K8s 集群

Comments | 1条评论

  • 头像回复发布于 2024/04/28 07:05:07Chrome 124.0.0.0 Mac OS 10.15.7 来自:上海 上海 联通

    ipconfig up 服务器直接炸了


    • 头像
      wsvaio站长
      回复发布于 2024/04/28 07:35:15Safari 17.4.1 Mac OS 10.15.7 来自:XX 内网IP 内网IP

      😂是这条sudo ifconfig eth0:1 111.229.192.102 up吗?

      这个eth0:1,冒号前面是你的网卡名,冒号后面的数字可以随便写(一般是0~9),这是为了不跟真实的网卡名重叠。

      后面的ip(111.229.192.102)要写你自己的公网ip。这条命令的作用是给网卡多设置一条ip,因为云服务器通常默认ip都不是他自己的公网ip,这是公网部署k8s跟局域网很大的一个区别,也是对应的解决办法。

      你说执行完这条命令服务器直接炸了,可能你输入的网卡名把真实网卡名覆盖了?