Kubernetes-Cilium部署方案
- 1 Kubernetes-Cilium项目简介
- 2 Kubernetes-Cilium项目优势
- 3 Kubernetes-Cilium项目架构
- 4 Kubernetes-Cilium项目组件
- 5 节点配置
- 6 系统优化
- 7 升级内核
- 8 安装环境
- 9 安装Cilium
- 10 验证集群
- 11 参考资料
Kubernetes-Cilium部署方案
1 Kubernetes-Cilium项目简介
Kubernetes-Cilium是一个基于eBPF和XDP的高性能容器网络方案的开源项目,目标是为微服务环境提供网络、负载均衡、安全功能,主要定位是容器平台。
2 Kubernetes-Cilium项目优势
Kubernetes-Cilium主要是基于eBPF的特性来实现的,eBPF和Cilium适合应对新时代下的云发起挑战的原因主要有以下三个:
- 可编程性:eBPF的可编程性使得Cilium能够适应云的快速发展并轻松应对云规模的快速增长,并且eBPF的通用性对于任何特定于网络的可编程性解决方案(Iptables、OpenVswitch或Nftables)相比都是一个巨大的优势。
- 嵌入到Linux内核:eBPF的可编程的独特性已经嵌入到了Linux内核中。应用程序使用系统调用通过网络进行交互,Linux内核负责处理这些系统调用,而为了使用户空间网络框架对应用程序保持透明,仍然需要遍历Linux内核的套接字层。而eBPF通过完全保留在内核中来避免这种情况。
- 安全高效:直接加载Linux内核模块也可以提供非常高效率的可编程性,但主要的缺点也很明显:加载内核模块运行有缺陷的代码会直接让内核崩溃。而通过eBPF程序的验证程序验证,会比直接加载内核模块安全的多。同时通过JIT(Just-In-Time)的编译,可以确保eBPF字节码在物理机上的执行速度。
3 Kubernetes-Cilium项目架构
Cilium位于容器编排系统和Linux Kernel之间,向上可以通过容器编排系统为容器进行网络以及相应的安全策略进行配置,向下可以在Linux内核hook点挂载eBPF程序,来控制容器网络数据的转发以及安全策略的实施。
4 Kubernetes-Cilium项目组件
在Cilium的架构中,除了Key-Value数据存储之外,主要组件包括Cilium Agent和Cilium Operator,还有一个客户端的命令行工具Cilium CLI。
- Etcd:负责Key-Value数据存储,与Cilium和Kubernetes共用一个Etcd数据库。
- Cilium Agent:Cilium Agent作为整个架构中最核心的组件,通过DaemonSet的方式,运行在集群的每个主机上。Cilium Agent作为用户空间的守护程序,通过插件与容器运行时和容器编排系统进行交互,进而为本机上的容器进行网络以及安全的相关配置。同时提供了开放的API,供其他组件调用。
- Cilium Operator:Cilium Operator主要负责管理集群中的任务,尽可能的保证以集群为单位,而不是单独的以节点为单位进行任务处理。主要包括通过Etcd为节点之间同步资源信息、确保Pod的DNS可以被Cilium管理、集群NetworkPolicy的管理和更新等。
- Cilium Client:客户端的命令行工具,与运行在同一节点上的Cilium Agent的Rest API交互。Cilium Client允许检查本地的Agent状态,它还提供了直接访问eBPF Maps以验证其状态的工具。
5 节点配置
操作系统版本:CentOS Linux release 7.7.1908 (Core)
服务器具体配置要求如下:
主机名 | IP地址 | 处理器 | 内存 | 硬盘 | 节点角色 |
---|---|---|---|---|---|
Minkube-kubernetes | 192.168.4.232 | 4C | 8G | 50G 系统盘 | All in one |
- 内核版本大于4.15
- 至少8G内存
- 磁盘至少50G
6 系统优化
主机的优化不单纯只是软硬件的优化,基于操作系统的性能优化也是多方面的,可以从几个方面进行衡量,以更好的提高主机的性能。
6.1 关闭SELinux
SELinux不关闭的情况下无法实现,会限制ssh免密码登录。
[root@minikube ~]# setenforce 0
[root@minikube ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
6.2 关闭防火墙
防止安装时出现各个组件的端口不能访问的问题。
[root@minikube ~]#systemctl stop firewalld && systemctl disable firewalld
6.3 时间同步
同步时间可以有效解决因时间不同而造成的不同步。
[root@localshot ~]# yum -y install ntp
[root@minikube ~]# ntpdate ntp1.aliyun.com
[root@minikube ~]# timedatectl set-timezone Asia/Shanghai
6.4 修改系统打开文件最大数量
放开系统打开文件最大数量,防止因达到上限值而导致的进程终止。
[root@minikube ~]# vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
7 升级内核
操作系统CentOS Linux release 7.7.1908 (Core)默认的内核版本为3.10.0不满足本次部署的内核版本最低需求,需要将内核升级到4.15版本及以上。最新版的内核可以在https://www.kernel.org/上找到。
7.1 更新Yum仓库
替换阿里云Yum源,并升级。
[root@minikube ~]# rm /etc/yum.repos.d/*.repo
[root@minikube ~]# wget -O \
/etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@minikube ~]# wget -O \
/etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@minikube ~]# yum clean all && yum -y update
7.2 启用elrepo仓库
导入elrepo软件源的GPG公钥以及软件源,可以自动下载最新的软件列表,无需修改地址。
[root@minikube ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@minikube ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
7.3 安装最新版内核
[root@minikube ~]# yum -y --disablerepo=* --enablerepo=elrepo-kernel install kernel-ml
[root@minikube ~]# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (5.14.2-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1062.el7.x86_64) 7 (Core)
2 : CentOS Linux (0-rescue-a079ba97b7ea44e6b30e09b82f929e16) 7 (Core)
7.4 配置Grub配置文件
内核安装完成之后,需要将新内核设置为默认启动选项并重启后才会生效。
[root@minikube ~]# vi /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
[root@minikube ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.14.2-1.el7.elrepo.x86_64
Found initrd image: /boot/initramfs-5.14.2-1.el7.elrepo.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-1062.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1062.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-a079ba97b7ea44e6b30e09b82f929e16
Found initrd image: /boot/initramfs-0-rescue-a079ba97b7ea44e6b30e09b82f929e16.img
done
7.5 重启验证
[root@minikube ~]# reboot
[root@minikube ~]# uname -r
5.14.2-1.el7.elrepo.x86_64
8 安装环境
MiniKube是一个快速搭建单节点Kubernetes集群的工具,可以在里面创建Pods来创建对应的服务,专注于让Kubernetes易于学习和开发。
8.1 安装Docker
本次部署使用Docker作为驱动,Docker版本要大于18.09。
[root@minikube ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@minikube ~]# yum-config-manager\
--add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@minikube ~]# yum install docker-ce docker-ce-cli containerd.io
[root@minikube ~]# systemctl enable docker
[root@minikube ~]# systemctl start docker
[root@minikube ~]# docker -v
Docker version 20.10.8, build 3967b7d
8.2 下载MiniKube
本次部署使用二进制的方式在x86-64 Linux上安装最新MiniKube稳定版本。
[root@minikube ~]# curl -LO https://storage.googleapis.com//releases/latest/-linux-amd64
[root@minikube ~]# install -linux-amd64 /usr/local/bin/
[root@minikube ~]# minikube version
minikube version: v1.23.0
commit: 5931455374810b1bbeb222a9713ae2c756daee10
8.3 启动集群
使用Docker作为驱动程序,将Kubernetes安装到现有的Docker中,避免使用虚拟化。
[root@minikube ~]# minikube start --driver=docker
[root@minikube ~]# minikube config set driver docker
[root@minikube ~]# minikube kubectl -- get po -A
[root@minikube ~]# kubectl get po -A
9 安装Cilium
使用Cilium的CLI工具在MiniKube上安装Cilium。Cilium将自动检测集群配置并为成功部署的集群选择合适的组件。
9.1 下载Cilium
下载Cilium二进制安装包。
[root@minikube ~]# curl -LO \
https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz
[root@minikube ~]# tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin
[root@minikube ~]# rm cilium-linux-amd64.tar.gz
9.2 安装Cilium
部署完Cilium的集群会将Pods添加到kube-system命名空间。
[root@minikube ~]# cilium install
Auto-detected Kubernetes kind:
Running "minikube" validation checks
Detected minikube version "1.23.0"
Cilium version not set, using default version "v1.10.0"
Auto-detected cluster name:
Auto-detected IPAM mode: cluster-pool
Auto-detected datapath mode: tunnel
Generating CA...
2021/09/27 02:54:44 [INFO] generate received request
2021/09/27 02:54:44 [INFO] received CSR
2021/09/27 02:54:44 [INFO] generating key: ecdsa-256
2021/09/27 02:54:44 [INFO] encoded CSR
Generating certificates for Hubble...
2021/09/27 02:54:44 [INFO] generate received request
2021/09/27 02:54:44 [INFO] received CSR
2021/09/27 02:54:44 [INFO] generating key: ecdsa-256
2021/09/27 02:54:44 [INFO] encoded CSR
Creating Service accounts...
Creating Cluster roles...
Creating ConfigMap...
Creating Agent DaemonSet...
Creating Operator Deployment...
Waiting for Cilium to be installed...
9.3 验证Cilium组件
[root@minikube ~]# kubectl get pods --namespace=kube-system -l k8s-app=cilium
[root@minikube ~]# kubectl get po -A
10 验证集群
创建一个Nginx Deployment并且通过服务暴露其端口来验证Kubernetes-Cilium集群的可用性。
10.1 创建Deployment Nginx
[root@minikube ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
10.2 创建Service Nginx
将Deployment Nginx的Service暴露出来。名为Nginx的Pod的Deployment和Service都位于Default命名空间中。
[root@minikube ~]# kubectl expose deployment nginx --port 80
service/nginx exposed
[root@minikube ~]# kubectl get svc,pod --namespace=default
10.3 通过Pod访问Nginx
创建一个其他的Pod访问Nginx服务,在Default命名空间中启动一个最小容器访问Nginx。
[root@minikube ~]# kubectl run busybox --rm -ti --image=busybox /bin/sh
If you don't see a command prompt, try pressing enter.
/ # wget --spider --timeout=1 nginx
Connecting to nginx (10.106.113.251:80)
remote file exists
10.4 创建Service Nginx3
以Deployment方式创建Nginx3 Pod,并将Deployment Nginx3的Service以NodePort方式暴露出来使用浏览器访问。
[root@minikube ~]# kubectl create deployment nginx3 --image=nginx
[root@minikube ~]# kubectl expose deployment nginx3 --type=NodePort --port=80
service/nginx exposed
[root@minikube ~]# kubectl get svc
10.5 通过浏览器访问Nginx3
11 参考资料
如有其它问题,请填写右侧需求表单联系我们。www.asterfusion.com
更多产品信息:AsterNOS