007.Kubernetes二进制部署Flannel

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
公网NAT网关,每月750个小时 15CU
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 007.Kubernetes二进制部署Flannel

一 部署flannel

1.1 安装flannel

kubernetes 要求集群内各节点(包括 master 节点)能通过 Pod 网段互联互通。flannel 使用 vxlan 技术为各节点创建一个可以互通的 Pod 网络,使用的端口为 UDP 8472。


flanneld 第一次启动时,从 etcd 获取配置的 Pod 网段信息,为本节点分配一个未使用的地址段,然后创建 flannedl.1 网络接口(也可能是其它名称,如 flannel1 等)。


flannel 将分配给自己的 Pod 网段信息写入 /run/flannel/docker 文件,docker 后续使用这个文件中的环境变量设置 docker0 网桥,从而从这个地址段为本节点的所有 Pod 容器分配 IP。

更多flannel参考:《008.Docker Flannel+Etcd分布式网络部署》。

[root@k8smaster01 ~]# cd /opt/k8s/work/
  [root@k8smaster01 work]# mkdir flannel
   [root@k8smaster01 work]# wget https://github.com/coreos/flannel/releases/download/v0.11.0/flannel-v0.11.0-linux-amd64.tar.gz
   [root@k8smaster01 work]# tar -xzvf flannel-v0.11.0-linux-amd64.tar.gz -C flannel

1.2 分发flannel

 [root@k8smaster01 ~]# cd /opt/k8s/work
   [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
   [root@k8smaster01 work]# for master_ip in ${MASTER_IPS[@]}
     do
       echo ">>> ${master_ip}"
       scp flannel/{flanneld,mk-docker-opts.sh} root@${master_ip}:/opt/k8s/bin/
       ssh root@${master_ip} "chmod +x /opt/k8s/bin/*"
     done

1.3 创建flannel证书和密钥

 [root@k8smaster01 ~]# cd /opt/k8s/work
   [root@k8smaster01 work]# cat > flanneld-csr.json <
   {
       "CN": "flanneld",
       "hosts": [],
       "key": {
           "algo": "rsa",
           "size": 2048
       },
      "names": [
          {
              "C": "CN",
              "ST": "Shanghai",
              "L": "Shanghai",
              "O": "k8s",
              "OU": "System"
          }
      ]
  }
  EOF
  #创建flanneld的CA证书请求文件

解释:

该证书只会被 kubectl 当做 client 证书使用,所以 hosts 字段为空。

 [root@k8smaster01 ~]# cd /opt/k8s/work
   [root@k8smaster01 work]# cfssl gencert -ca=/opt/k8s/work/ca.pem \
   -ca-key=/opt/k8s/work/ca-key.pem -config=/opt/k8s/work/ca-config.json \
   -profile=kubernetes flanneld-csr.json | cfssljson -bare flanneld #生成CA密钥(ca-key.pem)和证书(ca.pem)

1.4 分发证书和私钥

 [root@k8smaster01 ~]# cd /opt/k8s/work
   [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
   [root@k8smaster01 work]# for master_ip in ${MASTER_IPS[@]}
     do
       echo ">>> ${master_ip}"
       ssh root@${master_ip} "mkdir -p /etc/flanneld/cert"
     scp flanneld*.pem root@${master_ip}:/etc/flanneld/cert
     done

1.5 写入集群 Pod 网段信息

 [root@k8smaster01 ~]# cd /opt/k8s/work
   [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
   [root@k8smaster01 work]# etcdctl \
     --endpoints=${ETCD_ENDPOINTS} \
     --ca-file=/opt/k8s/work/ca.pem \
     --cert-file=/opt/k8s/work/flanneld.pem \
     --key-file=/opt/k8s/work/flanneld-key.pem \
     mk ${FLANNEL_ETCD_PREFIX}/config '{"Network":"'${CLUSTER_CIDR}'", "SubnetLen": 21, "Backend": {"Type": "vxlan"}}'

注意:注意:本步骤只需执行一次。


提示:flanneld 当前版本 (v0.11.0) 不支持 etcd v3,故使用 etcd v2 API 写入配置 key 和网段数据;


写入的 Pod 网段 ${CLUSTER_CIDR} 地址段(如 /16)必须小于 SubnetLen,必须与 kube-controller-manager 的 --cluster-cidr 参数值一致。

1.6 创建flanneld的systemd

 [root@k8smaster01 ~]# cd /opt/k8s/work
   [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
   [root@k8smaster01 work]# cat > flanneld.service << EOF
   [Unit]
   Description=Flanneld overlay address etcd agent
   After=network.target
   After=network-online.target
   Wants=network-online.target
   After=etcd.service
  Before=docker.service
 
  [Service]
  Type=notify
  ExecStart=/opt/k8s/bin/flanneld \\
    -etcd-cafile=/etc/kubernetes/cert/ca.pem \\
    -etcd-certfile=/etc/flanneld/cert/flanneld.pem \\
    -etcd-keyfile=/etc/flanneld/cert/flanneld-key.pem \\
    -etcd-endpoints=${ETCD_ENDPOINTS} \\
    -etcd-prefix=${FLANNEL_ETCD_PREFIX} \\
    -iface=${IFACE} \\
    -ip-masq
  ExecStartPost=/opt/k8s/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
  Restart=always
  RestartSec=5
  StartLimitInterval=0
 
  [Install]
  WantedBy=multi-user.target
  RequiredBy=docker.service
  EOF

解释:

mk-docker-opts.sh:该脚本将分配给 flanneld 的 Pod 子网段信息写入 /run/flannel/docker 文件,后续 docker 启动时使用这个文件中的环境变量配置 docker0 网桥;

flanneld:使用系统缺省路由所在的接口与其它节点通信,对于有多个网络接口(如内网和公网)的节点,可以用 -iface 参数指定通信接口;

flanneld:运行时需要 root 权限;

-ip-masq: flanneld 为访问 Pod 网络外的流量设置 SNAT 规则,同时将传递给 Docker 的变量 --ip-masq(/run/flannel/docker 文件中)设置为 false,这样 Docker 将不再创建 SNAT 规则; Docker 的 --ip-masq 为 true 时,创建的 SNAT 规则比较“暴力”:将所有本节点 Pod 发起的、访问非 docker0 接口的请求做 SNAT,这样访问其他节点 Pod 的请求来源 IP 会被设置为 flannel.1 接口的 IP,导致目的 Pod 看不到真实的来源 Pod IP。 flanneld 创建的 SNAT 规则比较温和,只对访问非 Pod 网段的请求做 SNAT。

1.7 分发flannel systemd

 [root@k8smaster01 ~]# cd /opt/k8s/work
   [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
   [root@k8smaster01 work]# for master_ip in ${MASTER_IPS[@]}
     do
       echo ">>> ${master_ip}"
       scp flanneld.service root@${master_ip}:/etc/systemd/system/
     done

二 启动并验证

2.1 启动flannel

 [root@k8smaster01 ~]# source /opt/k8s/bin/environment.sh
   [root@k8smaster01 ~]# for master_ip in ${MASTER_IPS[@]}
     do
       echo ">>> ${master_ip}"
       ssh root@${master_ip} "systemctl daemon-reload && systemctl enable flanneld && systemctl restart flanneld"
     done

2.2 检查flannel启动

 [root@k8smaster01 ~]# source /opt/k8s/bin/environment.sh
   [root@k8smaster01 ~]# for master_ip in ${MASTER_IPS[@]}
     do
       echo ">>> ${master_ip}"
       ssh root@${master_ip} "systemctl status flanneld|grep Active"
     done

2.3 检查pod网段信息

 [root@k8smaster01 ~]# source /opt/k8s/bin/environment.sh
   [root@k8smaster01 ~]# etcdctl \
     --endpoints=${ETCD_ENDPOINTS} \
     --ca-file=/etc/kubernetes/cert/ca.pem \
     --cert-file=/etc/flanneld/cert/flanneld.pem \
     --key-file=/etc/flanneld/cert/flanneld-key.pem \
     get ${FLANNEL_ETCD_PREFIX}/config    #查看集群 Pod 网段(/16)

 

 [root@k8smaster01 ~]# source /opt/k8s/bin/environment.sh
   [root@k8smaster01 ~]# etcdctl \
     --endpoints=${ETCD_ENDPOINTS} \
     --ca-file=/etc/kubernetes/cert/ca.pem \
     --cert-file=/etc/flanneld/cert/flanneld.pem \
     --key-file=/etc/flanneld/cert/flanneld-key.pem \
     ls ${FLANNEL_ETCD_PREFIX}/subnets    #查看已分配的 Pod 子网段列表(/24)
   [root@k8smaster01 ~]# source /opt/k8s/bin/environment.sh
   [root@k8smaster01 ~]# etcdctl \
    --endpoints=${ETCD_ENDPOINTS} \
    --ca-file=/etc/kubernetes/cert/ca.pem \
    --cert-file=/etc/flanneld/cert/flanneld.pem \
    --key-file=/etc/flanneld/cert/flanneld-key.pem \
    get ${FLANNEL_ETCD_PREFIX}/subnets/172.30.32.0-21 #查看某一 Pod 网段对应的节点 IP 和 flannel 接口地址

解释:


172.30.32.0/21 被分配给节点 k8smaster01 (172.24.8.71);


VtepMAC 为 k8smaster01 节点的 flannel.1 网卡 MAC 地址。

2.4 检查flannel网络信息

 [root@k8smaster01 ~]# ip addr show

解释:flannel.1 网卡的地址为分配的 Pod 子网段的第一个 IP(.0),且是 /32 的地址。


 [root@k8smaster01 ~]# ip route show |grep flannel.1
   172.30.128.0/21 via 172.30.128.0 dev flannel.1 onlink
   172.30.208.0/21 via 172.30.208.0 dev flannel.1 onlink


解释:


到其它节点 Pod 网段请求都被转发到 flannel.1 网卡;


flanneld 根据 etcd 中子网段的信息,如 ${FLANNEL_ETCD_PREFIX}/subnets/172.30.32.0-21 ,来决定进请求发送给哪个节点的互联 IP。

2.5 验证各节点flannel

在各节点上部署 flannel 后,检查是否创建了 flannel 接口(名称可能为 flannel0、flannel.0、flannel.1 等):

 [root@k8smaster01 ~]# source /opt/k8s/bin/environment.sh
   [root@k8smaster01 ~]# for master_ip in ${MASTER_IPS[@]}
     do
       echo ">>> ${master_ip}"
       ssh ${master_ip} "/usr/sbin/ip addr show flannel.1|grep -w inet"
     done
输出:
   >>> 172.24.8.71
       inet 172.30.32.0/32 scope global flannel.1
   >>> 172.24.8.72
       inet 172.30.128.0/32 scope global flannel.1
   >>> 172.24.8.73
       inet 172.30.208.0/32 scope global flannel.1
在各节点上 ping 所有 flannel 接口 IP,确保能通:
   [root@k8smaster01 ~]# source /opt/k8s/bin/environment.sh
   [root@k8smaster01 ~]# for master_ip in ${MASTER_IPS[@]}
     do
       echo ">>> ${master_ip}"
       ssh ${master_ip} "ping -c 1 172.30.32.0"
       ssh ${master_ip} "ping -c 1 172.30.128.0"
       ssh ${master_ip} "ping -c 1 172.30.208.0"
     done




相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3天前
|
Kubernetes Java Docker
使用Kubernetes和Docker部署Java微服务
使用Kubernetes和Docker部署Java微服务
|
2天前
|
Kubernetes 应用服务中间件 nginx
K8s高可用集群二进制部署-V1.20
2.4 部署Etcd集群 以下在节点1上操作,为简化操作,待会将节点1生成的所有文件拷贝到节点2和节点3. 1. 创建工作目录并解压二进制包 mkdir /opt/etcd/{bin,cfg,ssl} -p tar zxvf etcd-v3.4.9-linux-amd64.tar.gz mv etcd-v3.4.9-linux-amd64/{etcd,etcdctl} /opt/etcd/bin/
|
6天前
|
Kubernetes Ubuntu Linux
k8s部署grafana beyla实现app应用服务依赖图可观测
k8s部署grafana beyla实现app应用服务依赖图可观测
16 4
|
19天前
|
Kubernetes 数据处理 调度
天呐!部署 Kubernetes 模式的 Havenask 集群太震撼了!
【6月更文挑战第11天】Kubernetes 与 Havenask 集群结合,打造高效智能的数据处理解决方案。Kubernetes 如指挥家精准调度资源,Havenask 快速响应查询,简化复杂任务,优化资源管理。通过搭建 Kubernetes 环境并配置 Havenask,实现高可扩展性和容错性,保障服务连续性。开发者因此能专注业务逻辑,享受自动化基础设施管理带来的便利。这项创新技术组合引领未来,开启数据处理新篇章。拥抱技术新时代!
|
2天前
|
前端开发 Devops 测试技术
阿里云云效产品使用问题之更换所部署的环境关联的ACK集群该如何实现
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
3天前
|
Prometheus 监控 Kubernetes
一篇文章讲明白Kubernetes(k8s)部署Promehteus监控
一篇文章讲明白Kubernetes(k8s)部署Promehteus监控
|
3天前
|
Prometheus 监控 Kubernetes
一篇文章讲明白Kubernetes(k8s)部署Promehteus监控
一篇文章讲明白Kubernetes(k8s)部署Promehteus监控
|
27天前
|
Kubernetes 容器 Perl
k8s部署seata 报错 没有提供足够的身份验证信息 [ http-nio-7091-exec-2] [ty.JwtAuthenticationEntryPoint] [ commence] [] : Responding with unauthorized error. Message - Full authentication is required to access this resource
Kubernetes pod 在16:12时出现两次错误,错误信息显示需要完整认证才能访问资源。尽管有此错误,但页面可正常访问。附有yaml配置文件的图片。
51 2
|
30天前
|
Kubernetes 负载均衡 应用服务中间件
k8s 二进制安装 优化架构之 部署负载均衡,加入master02
k8s 二进制安装 优化架构之 部署负载均衡,加入master02
|
10天前
|
Kubernetes 前端开发 微服务
实操教程丨如何在K8S集群中部署Traefik Ingress Controller
实操教程丨如何在K8S集群中部署Traefik Ingress Controller