腾讯云部署K8s集群

0. 导读(重要!!!一定要读)

该篇文章记录了使用腾讯云轻量级应用服务器创建k8s集群,因使用云服务器创建时和通过vmware创建在网卡配置上有很大的不同,我在配置过程中遇到了很多坑,文章中都进行了详细的记录。

个人建议先通读全文,不要着急下手,其中Master节点操作时只需要走前两步骤即可,其它步骤不要走(那是我踩过的坑),子节点操作整个步骤都不要走,也是我踩过的坑。Master节点操作前两步执行后,直接走虚拟网卡创建这一步骤即可,文章里面有详细的解释。

1. 环境准备

版本

集群版本:

  1. k8s=v1.21.0

  2. kube-apiserver:v1.21.0

  3. kube-proxy:v1.21.0

  4. kube-controller-manager:v1.21.0

  5. kube-scheduler:v1.21.0

  6. coredns:v1.8.0

  7. etcd:3.4.13-0

  8. pause:3.4.1

服务器配置

云产商Ip地址系统环境配置角色
腾讯云轻量级应用服务器XX.XX.236.133CentOS 7.6CPU: 4核 内存: 2GBmaster
腾讯云轻量级应用服务器XX.XX.91.15CentOS 8.0CPU: 4核 内存: 4GBnode1

端口配置

主节点:

image-20220624154913978

NodePort Services是pod服务的默认端口范围。这里如果希望Master的IP也可以访问Pod服务,那么也可以给Master主机开放这些端口(建议)

子节点:

image-20220624155820105

所有节点:

Flannel网络组件构建Pod之间的通信时需要的配置(本文使用的不是Flannel网络,可不配置此项)

协议方向端口范围作用使用者
UDP入站8472vxlan Overlay 网络通信Overlay 网络

2. 安装步骤

所有主机操作

1. 提前准备
  1. 配置各主机的名称和hosts

    1. 配置主机名称:vi /etc/hostname

      命令: 
      master服务器:
      k8s-master
      node1号服务器:
      k8s-node01
      
    2. 修改hosts:

      添加:  IP地址  hostname
      XX.XX.236.113 k8s-master
      XX.XX.91.15 k8s-node01 
      
  2. 在K8s中为了高效运行,整个集群的机器需要关闭防火墙、SWAP分区以及Selinux,使用如下命令:

#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 暂时关闭SWAP分区
swapoff -a
# 永久禁用SWAP分区
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 禁用Selinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config


image-20220623110434765

  1. 将系统中桥接的IPv4以及IPv6的流量串通:
cat >/etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

image-20220623110543220

  1. 时间同步

    # 时间同步
    yum install ntpdate -y
    ntpdate time.windows.com
    
2. 安装docker

详细看这一篇:mystudy/服务器部署/Docker基础篇.md · Zhang-HaoQi/Knowledge - 码云 - 开源中国 (gitee.com)

3. 安装Kubernetes的安装组件
  1. 查看最新版的k8s

    curl -sSL https://dl.k8s.io/release/stable.txt
    

    image-20220623110809785

    目前最新版本是1.24.2,k8s1.24版本之后不再使用docker作为容器,因此我们暂不使用该版本,使用1.21.0版本进行安装

  2. 安装k8s的yum源

    vi /etc/yum.repos.d/kubernetes.repo
    
    # 在这个文件中输入
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enable=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
    https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    
  3. 移除旧版本

     yum remove -y kubelet kubeadm kubectl
    
  4. 查看可安装的版本

     yum list kubelet --showduplicates | sort -r
    

    image-20220623111912246

  5. 安装kubelet、kubeadm、kubectl 指定版本

     yum install -y kubelet-1.21.0 kubeadm-1.21.0 kubectl-1.21.0
    

    image-20220623112218491

  6. 设置开机启动

    systemctl enable kubelet.service
    

    image-20220623112258298

Master节点操作(只进行第一步和第二步操作,之后直接走虚拟网卡创建步骤)

  1. 安装初始化master节点镜像

     #!/bin/bash
     images=(
       kube-apiserver:v1.21.0
       kube-proxy:v1.21.0
       kube-controller-manager:v1.21.0
       kube-scheduler:v1.21.0
       coredns:v1.8.0
       etcd:3.4.13-0
       pause:3.4.1
     )
     for imageName in ${images[@]} ; do
         docker pull registry.cn-hangzhou.aliyuncs.com/xue_k8s_images/$imageName
     done
    

    开启执行权限并运行脚本

    chmod +x images.sh && ./images.sh

    image-20220623164541163

  2. 注意1.21.0版本的k8s coredns镜像比较特殊,结合阿里云需要特殊处理,重新打标签

    docker tag registry.cn-hangzhou.aliyuncs.com/xue_k8s_images/coredns:v1.8.0 registry.cn-hangzhou.aliyuncs.com/xue_k8s_images/coredns/coredns:v1.8.0

    image-20220623164655075

  3. 初始化主节点**(该操作废弃,直接查看虚拟网卡创建这一步)**

 kubeadm init \
 --apiserver-advertise-address=10.0.24.17 \
 --image-repository registry.cn-hangzhou.aliyuncs.com/xue_k8s_images \
 --kubernetes-version v1.21.0 \
 --service-cidr=10.96.0.0/16 \
 --pod-network-cidr=10.244.0.0/16

注意:–apiserver-advertise-address是内网ip,即云服务器的ip地址(如果配置成内网ip,则会)

image-20220623165228581

出现报错:

image-20220623170551031

[警告IsDockerSystemdCheck]:检测到“cgroupfs”作为Docker cgroup驱动程序。 推荐的驱动程序是“systemd”。

解决措施:

  1. 修改/etc/docker/daemon.json文件,添加推荐的驱动

    "exec-opts":["native.cgroupdriver=systemd"]

    image-20220623170755968

  2. 重启docker并查看状态

    systemctl restart docker
    systemctl status docker
    

    image-20220623170910411

执行完成后再次执行初始化主节点语句

 kubeadm init \
 --apiserver-advertise-address=10.0.24.17 \
 --image-repository registry.cn-hangzhou.aliyuncs.com/xue_k8s_images \
 --kubernetes-version v1.21.0 \
 --service-cidr=10.96.0.0/16 \
 --pod-network-cidr=10.244.0.0/16

成功:

image-20220623172939991

  1. 按照上方图片提示,继续下一步。(该操作废弃,直接查看虚拟网卡创建这一步)

    1. 复制相关文件

      image-20220623171500572

      To start using your cluster, you need to run the following as a regular user:
      要开始使用集群,您需要以常规用户的身份运行以下命令:
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
      
    2. 部署一个pod网络

      image-20220623171644191

      提示部署一个docker网络

       kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
      

      image-20220623172542335

      命令检查

      查看集群中所有部署好的pod:kubectl get pod -A

    image-20220623172648371

    ​ 查看集群所有机器的状态kubectl get nodes

    image-20220623172740034

  2. 将子节点加入到master节点**(该操作废弃,直接查看虚拟网卡创建这一步)**

    token过期

     kubeadm token create --print-join-command
     kubeadm token create --ttl 0 --print-join-command # 生成永久token
     kubeadm token list  查看token的列表
    

    子节点执行命令

    kubeadm join 10.0.24.17:6443 --token ixhnzj.f2yevqsxq4clfhwx \
            --discovery-token-ca-cert-hash sha256:e4aeb1795bbcb00c4a5bd60c8953841789765e69ebb63836fbbb1b62ece1cecb
    

子节点操作(该操作废弃,直接查看虚拟网卡创建这一步)

  1. 不确定者两步骤是否必要(出现了问题配置了这两步,但是配置好后还是不行)
# node节点执行
iptables -t nat -A OUTPUT -d 10.0.24.17 -j DNAT --to-destination 82.157.236.133
# master节点执行
iptables -t nat -A OUTPUT -d 10.0.12.14 -j DNAT --to-destination 159.75.91.15
  1. 加入主节点

    kubeadm join 10.0.24.17:6443 --token ixhnzj.f2yevqsxq4clfhwx \
            --discovery-token-ca-cert-hash sha256:e4aeb1795bbcb00c4a5bd60c8953841789765e69ebb63836fbbb1b62ece1cecb
    
  2. 此时卡死,无法进行下一步

    在命令后方添加–v=2,查看详细的日志

    kubeadm join 10.0.24.17:6443 --token ixhnzj.f2yevqsxq4clfhwx \
            --discovery-token-ca-cert-hash sha256:e4aeb1795bbcb00c4a5bd60c8953841789765e69ebb63836fbbb1b62ece1cecb --v-2
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lIeIWEXa-1656059397278)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220624085653130.png)]

​ 发现,请求超时。回想了一下,原因可能在于不同的云服务之间,内网可能是无法直接互通的,因此我决定在master节点初始化(init)的时候,使用外网ip (真实的服务器地址)。

因为之前配置好了,因此需要重置一下k8s。

kubeadm reset    # 重置
 rm -rf $HOME/.kube # 移除相关配置
 
 # 使用外网ip初始化master节点
 kubeadm init \
 --apiserver-advertise-address=XX.XX.236.113 \ # 服务器ip
 --image-repository registry.cn-hangzhou.aliyuncs.com/xue_k8s_images \
 --kubernetes-version v1.21.0 \
 --service-cidr=10.96.0.0/16 \
 --pod-network-cidr=10.244.0.0/16

结果出现了这个报错(可能跟应用服务器的本身有关,看网上资料大概是购买的服务器真实的IP并不在网卡上,需要另外配置)

找到了一篇阿里云配置k8s的文章,但是没有成功,还是一直卡在这里:(149条消息) 基于阿里云ECS服务器搭建k8s集群_落日后的余晖的博客-CSDN博客_阿里云搭建kubernetes

image-20220624090146274

解决:

后经过查找资料,我们直接使用服务器公网IP启动K8S集群,但是直接是不行的,服务器上没有这个IP的网卡,所以我们需要在对应网卡上创建一个对应公网IP的虚拟网卡:

注意:这里是创建一个新的虚拟网卡,我当时没开仔细,直接在eth0:里面添加了真实服务器的ip地址作为网卡,结果服务器直接链接不上了,在腾讯云官网使用vnc登陆后,将eth0改成默认的才得以正常链接

虚拟网卡创建

由于云主机网卡绑定的都是内网 IP, 而且几台云服务器位于不同的内网中(VPC网络不互通), 直接搭建会将内网 IP 注册进集群导致搭建不成功。

image-20220624143212422

解决方式:使用虚拟网卡绑定公网 IP, 使用该公网 IP 来注册集群。

  1. 创建虚拟网卡,并绑定公网ip(每台机器都需要执行)

    # 所有主机都要创建虚拟网卡,并绑定对应的公网 ip
    # 临时生效,重启会失效
    ifconfig eth0:1 <你的公网IP>
     
    # 永久生效
    cat > /etc/sysconfig/network-scripts/ifcfg-eth0:1 <<EOF
    BOOTPROTO=static
    DEVICE=eth0:1
    IPADDR=<你的公网IP>
    PREFIX=32
    TYPE=Ethernet
    USERCTL=no
    ONBOOT=yes
    EOF
    

    查看配置的虚拟网卡:ifconfig

image-20220624143558584

  1. 修改kubelet启动参数文件(每台机器都需要执行)

    # 此文件安装kubeadm后就存在了
    vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
     
    # 注意,这步很重要,如果不做,节点仍然会使用内网IP注册进集群
    # 在末尾添加参数 --node-ip=公网IP
    ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --node-ip=<公网IP>
    
  2. 初始化master节点

    执行初始化操作(master节点操作)

      kubeadm init \
     --apiserver-advertise-address=XX.XX.236.113 \  # 真实ip地址
     --image-repository registry.cn-hangzhou.aliyuncs.com/xue_k8s_images \
     --kubernetes-version v1.21.0 \
     --service-cidr=10.96.0.0/16 \
     --pod-network-cidr=10.244.0.0/16
    

​ 终于:执行成功了,在不配置虚拟网卡之前,使用公网ip进行init的时候,总是异常。

image-20220624150119438

# 创建相应文件夹
要开始使用集群,您需要以常规用户的身份运行以下命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 配置网络
 kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
  1. 根据提示,创建文件夹和布置好网络后,进入子节点服务器,使用join命令

    如果之前join过,最好先重置子节点(kubeadm reset),再加入主节点

kubeadm reset    # 重置
rm -rf $HOME/.kube # 移除相关配置
 # 加入主节点
kubeadm join xx.xx.236.113:6443 --token cy8q3s.esmh256v2kk5vayp \
        --discovery-token-ca-cert-hash sha256:7caec2dcfedb6906319df9685bd5f300e29d1dfadadd131ec3bbc91a8cc8127a 

成功

image-20220624150239795

在主节点执行查看命令:kubectl get nodes,发现node01已经成功添加到集群中。配置完成

image-20220624150316889

3. 问题汇总

1. cgroupfs作为doker驱动,推荐systemd

image-20220624161928888

1. 腾讯云不同帐号不同服务器的内网不互通问题

腾讯云的轻量级服务器默认同一帐号,同一区域的服务器内网是互通的,我这里是两个帐号,两台区域不同的服务器,因此内网不互通,只能配置外网,但是云服务器提供的ip地址不能直接当作网卡使用,需要创建虚拟网卡。

云服务器 修改内网 IP 地址-操作指南-文档中心-腾讯云 (tencent.com)

2. 腾讯云轻量级应用服务器修改网卡后,链接不上

注意:在上方blog中,人家提到的是创建虚拟网卡,而我直接修改了网卡,导致链接不上。

vnc登陆后,把配置还原到修改前,重新启动就可以了。

进入:

image-20220624105032434

4. 参考blog

(149条消息) 基于阿里云ECS服务器搭建k8s集群_落日后的余晖的博客-CSDN博客_阿里云搭建kubernetes

(152条消息) 三、公网环境搭建Kubernetes (k8s) 集群的详细图解_胖太乙的博客-CSDN博客_k8s公网搭建

(152条消息) 在Linux公网、云服务器搭建K8s集群_水妖3的博客-CSDN博客

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐