在Kubernetes上部署Cilium网络组件

目录

一、环境准备

1.1、开启ssh服务,允许root远程登录

1.2、设置时间同步

1.3、主机名解析

1.4、禁用swap

1.5、禁用ufw

二、安装程序包

2.1、安装并启动Containerd.io

2.2、配置Containerd.io

2.2.1、修改containerd使用SystemdCgroup

2.2.2、配置Containerd使用国内Mirror站点上的pause镜像及指定的版本

2.2.3、配置Containerd使用国内的Image加速服务,以加速Image获取

2.2.4、配置Containerd使用私有镜像仓库,不存在要使用的私有Image Registry时,本步骤可省略

2.2.5、配置私有镜像仓库跳过tls验证,若私有Image Registry能正常进行tls认证,则本步骤可省略

2.3、安装nerdctl工具

2.4、安装kubelet、kubeadm和kubectl

三、初始化集群

3.1、正常初始化master节点(在master01上完成如下操作)

3.2、Cilium替换kube-proxy到初始化集群

3.3、安装cilium

3.3.1、下载cilium cli工具

3.3.2、部署cilium

3.3.3、查看Cilium状态

3.3.4、Cilium的高级特性

3.3.5、启用Hubble及UI


上一篇介绍了Cilium的基本概念和优势,本篇文章介绍在Kubernetes上部署Cilium

一、环境准备

  • OS:Ubuntu 24.04
  • Kubernetes:v1.30.2
  • Container Runtime:Containerd 1.7.18

本次共使用4台虚拟机,一台做master,3台做work_node,如下准备工作在4台虚拟机上同时设置

IP地址主机名配置说明
192.168.1.65k8s-master01 kubeapi.jnlikai.cc

1、启用ssh服务

2、设置时间同步

3、禁用swap

4、禁用ufw

192.168.1.66k8s-node01
192.168.1.67k8s-node02
192.168.1.68k8s-node03

1.1、开启ssh服务,允许root远程登录

1.2、设置时间同步

~# apt install chrony

~# systemctl start chrony.service  

修改节点的/etc/chrony/chrony.conf配置文件,并将时间服务器指向相应的主机即可,配置格式如下:

server CHRONY-SERVER-NAME-OR-IP iburst

1.3、主机名解析

1.4、禁用swap

~# swapoff -a

1.5、禁用ufw

~# ufw disable

~# ufw status

二、安装程序包

2.1、安装并启动Containerd.io

首先,生成containerd.io相关程序包的仓库,这里以阿里云的镜像服务器为例进行说明:

 ~# apt -y install apt-transport-https ca-certificates curl software-properties-common

  ~# curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -

  ~# add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

  ~# apt update

接下来,安装相关的程序包,Ubuntu 24.04上要使用的程序包名称为containerd.io

  ~# apt-get  install  containerd.io

2.2、配置Containerd.io

首先,运行如下命令打印默认并保存默认配置

~# mkdir /etc/containerd

~# containerd config default > /etc/containerd/config.toml

接下来,编辑生成的配置文件,完成如下几项相关的配置:

2.2.1、修改containerd使用SystemdCgroup
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  SystemdCgroup = true
2.2.2、配置Containerd使用国内Mirror站点上的pause镜像及指定的版本
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
2.2.3、配置Containerd使用国内的Image加速服务,以加速Image获取
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
    endpoint = ["https://docker.mirrors.ustc.edu.cn", "https://registry.docker-cn.com"]

   [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
      endpoint = ["https://registry.aliyuncs.com/google_containers"]
2.2.4、配置Containerd使用私有镜像仓库,不存在要使用的私有Image Registry时,本步骤可省略
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.jnlikai.cc"]
    endpoint = ["https://harbor.jnlikai.cc"]
2.2.5、配置私有镜像仓库跳过tls验证,若私有Image Registry能正常进行tls认证,则本步骤可省略
[plugins."io.containerd.grpc.v1.cri".registry.configs]
  [plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.jnlikai.cc".tls]
    insecure_skip_verify = true

最后,重新启动containerd服务即可

~# systemctl daemon-reload
~# systemctl restart containerd 

2.3、安装nerdctl工具

从github上下载,并解压,将nerdctl的二进制文件放到系统的/usr/local/bin/目录下即可,添加可执行权限

2.4、安装kubelet、kubeadm和kubectl

自 v1.28版本开始,Kubernetes官方变更了仓库的存储路径及使用方式(不同的版本将会使用不同的仓库)

~# apt-get update && apt-get install -y apt-transport-https

~#  curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key |    gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

~# echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/ /" |    tee /etc/apt/sources.list.d/kubernetes.list

~# apt-get update

接下来,运行如下命令安装kubelet、kubeadm和kubectl等程序包

~# apt-get install -y kubelet kubeadm kubectl

安装完成后,要确保kubeadm等程序文件的版本,这将也是后面初始化Kubernetes集群时需要明确指定的版本号

三、初始化集群

该步骤开始尝试构建Kubernetes集群的master节点,配置完成后,各worker节点直接加入到集群中的即可。需要特别说明的是,由kubeadm部署的Kubernetes集群上,集群核心组件kube-apiserver、kube-controller-manager、kube-scheduler和etcd等均会以静态Pod的形式运行,它们所依赖的镜像文件默认来自于registry.k8s.io这一Registry服务之上。但我们无法直接访问该服务,常用的解决办法有如下两种,本示例将选择使用更易于使用的前一种方式。

  • 使用能够到达该服务的代理服务;

  • 使用国内的镜像服务器上的服务,例如registry.aliyuncs.com/google_containers等

3.1、正常初始化master节点(在master01上完成如下操作)

在运行初始化命令之前先运行如下命令单独获取相关的镜像文件,而后再运行后面的kubeadm init命令,以便于观察到镜像文件的下载过程

上面的命令会列出类似如下的Image信息,由如下的命令结果可以看出,相关的Image都来自于registry.k8s.io,该服务上的Image通常需要借助于代理服务才能访问到,若需要从国内的Mirror站点下载Image,还需要在命令上使用“--image-repository”选项来指定Mirror站点的相关URL。例如,下面的命令中使用了该选项将Image Registry指向国内可用的Aliyun的镜像服务,其命令结果显示的各Image也附带了相关的URL

运行下面的命令即可下载需要用到的各Image。需要注意的是,如果需要从国内的Mirror站点下载Image,同样需要在命令上使用“--image-repository”选项来指定Mirror站点的相关URL

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

而后即可进行master节点初始化。kubeadm init命令支持两种初始化方式

  • 一是通过命令行选项传递关键的部署设定
  • 另一个是基于yaml格式的专用配置文件

后一种允许用户自定义各个部署参数,在配置上更为灵活和便捷,先用如下命令将默认配置项导出到kubeadm-config.yaml文件,然后修改内部一些选项

~#kubeadm config print init-defaults > kubeadm-config.yaml

修改后到kubeadm-config.yaml文件如下: 

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: magedu.comc4mu9kzd5q7ur
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
# 这里的地址即为初始化的控制平面第一个节点的IP地址;
advertiseAddress: 192.168.1.65
bindPort: 6443
nodeRegistration:
# 注意,使用docker-ce和cri-dockerd时,要启用如下配置的cri socket文件的路径;
#criSocket: unix:///run/cri-dockerd.sock
imagePullPolicy: IfNotPresent
# 第一个控制平面节点的主机名称;
name: k8s-master01
taints:
- effect: NoSchedule
  key: node-role.kubernetes.io/master
- effect: NoSchedule
  key: node-role.kubernetes.io/control-plane
---
apiServer:
timeoutForControlPlane: 4m0s
# 将下面配置中的certSANS列表中的值,修改为客户端接入API Server时可能会使用的各类目标地址;
certSANs:
- kubeapi.jnlikai.cc
- 192.168.1.65
- 192.168.1.66
- 192.168.1.67
- 192.168.1.68
apiVersion: kubeadm.k8s.io/v1beta3
# 控制平面的接入端点,我们这里选择适配到kubeapi.magedu.com这一域名上;
controlPlaneEndpoint: "kubeapi.jnlikai.cc:6443"
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
  dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.30.2
networking:
# 集群要使用的域名,默认为cluster.local
dnsDomain: cluster.local
# service网络的地址
serviceSubnet: 10.96.0.0/12
# pod网络的地址,flannel网络插件默认使用10.244.0.0/16
podSubnet: 10.244.0.0/16
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
# 用于配置kube-proxy上为Service指定的代理模式,默认为iptables;
mode: "ipvs"

之后通过如下命令可以读取该文件完成初始化

  ~# kubeadm init --config kubeadm-config.yaml --upload-certs

3.2、Cilium替换kube-proxy到初始化集群

在kubeadm init命令上使用“--skip-phases=addon/kube-proxy”选项,以跳过kube-proxy的安装

kubeadm init --control-plane-endpoint="kubeapi.jnlikai.cc" \
--kubernetes-version=v1.30.2 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--image-repository=registry.aliyuncs.com/google_containers \
--upload-certs \
--skip-phases=addon/kube-proxy

初始完成后提示后面到步骤

根据提示cp认证文件

添加work节点

work节点都添加入集群后,都能看到,coredns的Pod一直等待网络组件就绪才能正常running

3.3、安装cilium

安装cilium有两种方式,

3.3.1、下载cilium cli工具

解压,将cilium cli工具放到/usr/local/bin/目录下

3.3.2、部署cilium

列出可用的Cilium版本,默认为目前最新的稳定版

~#cilium install --list-versions 

打印在部署时要使用的默认配置

示例1:使用默认的VXLAN模式,并自定义要使用的子网

  cilium install \
    --set kubeProxyReplacement=strict \
    --set ipam.mode=kubernetes \
    --set routingMode=tunnel \
    --set tunnelProtocol=vxlan \
    --set ipam.operator.clusterPoolIPv4PodCIDRList=10.244.0.0/16 \
    --set ipam.Operator.ClusterPoolIPv4MaskSize=24  

示例2:使用原生路由模式

  cilium install \
    --set kubeProxyReplacement=strict \
    --set ipam.mode=kubernetes \
    --set routingMode=native \
    --set ipam.operator.clusterPoolIPv4PodCIDRList=10.244.0.0/16 \
    --set ipam.Operator.ClusterPoolIPv4MaskSize=24 \
    --set ipv4NativeRoutingCIDR=10.244.0.0/16 \
    --set autoDirectNodeRoutes=true

说明:开启native routing模式后,通常应该明确指定支持原生路由的网段

实例3:native routing模式,启用ingress       

 cilium install \
        --set kubeProxyReplacement=strict \
        --set ipam.mode=kubernetes \
        --set routingMode=native \
        --set ipam.operator.clusterPoolIPv4PodCIDRList=10.244.0.0/16 \
        --set ipam.Operator.ClusterPoolIPv4MaskSize=24 \
        --set ipv4NativeRoutingCIDR=10.244.0.0/16 \
        --set autoDirectNodeRoutes=true \
        --set ingressController.enabled=true \
        --set ingressController.loadbalancerMode=shared

3.3.3、查看Cilium状态

 

3.3.4、Cilium的高级特性

开启bpf masquerade:

--set bpf.masquerade=true

设置负载均衡模式: --set loadBalancer.mode=dsr 或者 --set loadBalancer.mode=hybrid 混合模式,即dsr和snat两种

开启DSR模式:--set autoDirectNodeRoutes=true

是否启用bpf LegacyRouting: --set bpf.hostLegacyRouting=true

3.3.5、启用Hubble及UI

通过cilium命令启用

cilium hubble enable --ui

部署cilium时直接启用,在cilium命令上使用如下选项即可

    --set hubble.enabled="true" \
    --set hubble.listenAddress=":4244" \
    --set hubble.relay.enabled="true" \
    --set hubble.ui.enabled="true"   

 通过cilium的ingress将hubble-ui暴露到集群外,可以通过浏览器查看cilium的状态

 


欢迎关注作者的公众号,公众号每天分享运维干货文章

 

  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值