Kubernetes without kube-proxy (文末抽奖)

简介: Kubernetes without kube-proxy (文末抽奖)

引言


最近听好多朋友说,cilium很强,势必将成为主流。因其使用了ebpf,性能好,而且支持网络策略。于是,决定花点时间学习一下。在通过官网文档学习过程中,发现使用cilium作为CNI,居然可以不用安装kube-proxy了。这让我想起来,之前在面试中被问到的一个问题,面试官问我:kube-proxy是否可以不用安装,是否有其他替代品。这下不就有答案了嘛。

       

顺便吐槽一下,看官方文档学习,是真的有点难(毕竟全英文);不过还是建议大家看官方文档学习,不要翻译成中文哦。那么接下来,就由我来实操一下。


环境说明


序号 事项 说明
1 kubernetes version v1.21.3
2 cilium version v1.10.3
3 kubernetes安装方式 kubeadm
4 cilium组网模式 vxlan
5 os ubuntu 18.04
6 kubernetes集群规模 1master、2node


正文


  1. 在master上初始化集群,并通过添加--skip-phases=addon/kube-proxy参数忽略kube-proxy的安装


kubeadm init   --apiserver-advertise-address=10.211.55.50   --image-repository registry.aliyuncs.com/google_containers   --kubernetes-version v1.21.3   --service-cidr=10.96.0.0/12   --pod-network-cidr=10.244.0.0/16   --ignore-preflight-errors=all --skip-phases=addon/kube-proxy


  1. 在两个node上执行kubeadm join,加入集群


kubeadm join 10.211.55.50:6443 --token ouez6j.02ms269v8i4psl7p --discovery-token-ca-cert-hash sha256:5fdafe0fe1adb3b60cd7bc33f033f028279a94a3944816424cc7f5bb498f6868


  1. 使用helm(v3)来安装cilium。先添加cilium库


helm repo add cilium https://helm.cilium.io/


  1. 使用如下命令安装cilium,添加kubeProxyReplacement=strict参数


helm install cilium cilium/cilium --version 1.10.3     --namespace kube-system     --set kubeProxyReplacement=strict     --set k8sServiceHost=10.211.55.50     --set k8sServicePort=6443


  1. 检查cilium安装结果


# 查看cilium agent,以daemonset方式部署在每个node节点上
root@cilium1:/# kubectl -n kube-system get pods -l k8s-app=cilium
NAME           READY   STATUS    RESTARTS   AGE
cilium-8gwg2   1/1     Running   0          8m4s
cilium-t9ffc   1/1     Running   0          8m39s
cilium-x42r6   1/1     Running   0          8m16s
# 查看cilum operator
root@cilium1:~# kubectl get po -A -o wide |grep cilium-operator
kube-system   cilium-operator-5df88875-867hd    1/1     Running   5          41h   172.16.88.47    cilium3   <none>           <none>
kube-system   cilium-operator-5df88875-9kx8c    1/1     Running   5          41h   172.16.88.253   cilium2   <none>           <none>


  1. 检查是否有kube-proxy组件。可以发现并没有该组件


root@cilium1:/# kubectl get po -n kube-system
NAME                              READY   STATUS    RESTARTS   AGE
cilium-8gwg2                      1/1     Running   0          10m
cilium-operator-5df88875-867hd    1/1     Running   5          27h
cilium-operator-5df88875-9kx8c    1/1     Running   5          27h
cilium-t9ffc                      1/1     Running   0          11m
cilium-x42r6                      1/1     Running   0          10m
coredns-59d64cd4d4-hbwg4          1/1     Running   1          27h
coredns-59d64cd4d4-l2pmt          1/1     Running   1          27h
etcd-cilium1                      1/1     Running   2          27h
kube-apiserver-cilium1            1/1     Running   2          27h
kube-controller-manager-cilium1   1/1     Running   2          27h
kube-scheduler-cilium1            1/1     Running   2          27h


  1. 检查cilium状态,确保安装正确


root@cilium1:/# kubectl exec -n kube-system  cilium-t9ffc  -- cilium status
Defaulted container "cilium-agent" out of: cilium-agent, mount-cgroup (init), clean-cilium-state (init)
KVStore:                Ok   Disabled
Kubernetes:             Ok   1.21 (v1.21.3) [linux/amd64]
Kubernetes APIs:        ["cilium/v2::CiliumClusterwideNetworkPolicy", "cilium/v2::CiliumEndpoint", "cilium/v2::CiliumNetworkPolicy", "cilium/v2::CiliumNode", "core/v1::Namespace", "core/v1::Node", "core/v1::Pods", "core/v1::Service", "discovery/v1::EndpointSlice", "networking.k8s.io/v1::NetworkPolicy"]
KubeProxyReplacement:   Strict   [eth0 10.211.55.50 (Direct Routing)]
Cilium:                 Ok   1.10.3 (v1.10.3-4145278)
NodeMonitor:            Listening for events on 8 CPUs with 64x4096 of shared memory
Cilium health daemon:   Ok   
IPAM:                   IPv4: 2/254 allocated from 10.0.0.0/24, 
BandwidthManager:       Disabled
Host Routing:           Legacy
Masquerading:           BPF   [eth0]   10.0.0.0/24 [IPv4: Enabled, IPv6: Disabled]
Controller Status:      20/20 healthy
Proxy Status:           OK, ip 10.0.0.41, 0 redirects active on ports 10000-20000
Hubble:                 Ok   Current/Max Flows: 817/4095 (19.95%), Flows/s: 0.95   Metrics: Disabled
Encryption:             Disabled
Cluster health:         3/3 reachable   (2021-08-07T15:29:05Z)


  1. 部署nginx来测试一下网络联通性


# nginx deployment yaml文件
cat deployment-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      run: nginx
  replicas: 4
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
# 创建nginx deployment
kubectl create -f deployment-nginx.yaml
# 查看部署结果
root@cilium1:/# kubectl get po -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
nginx-649c4b9857-8f2v5   1/1     Running   1          26h   10.0.2.212   cilium2   <none>           <none>
nginx-649c4b9857-mhsxs   1/1     Running   1          26h   10.0.1.23    cilium3   <none>           <none>
nginx-649c4b9857-qw2jj   1/1     Running   1          26h   10.0.2.69    cilium2   <none>           <none>
nginx-649c4b9857-vj9w2   1/1     Running   1          26h   10.0.1.126   cilium3   <none>           <none>


  1. 创建一个nodeport service来验证service的可访问


# 创建service
kubectl expose deployment nginx --type=NodePort --port=80
# 查看service
root@cilium1:/# kubectl get svc nginx
NAME    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx   NodePort   10.97.209.103   <none>        80:31126/TCP   26h


  1. 验证nodeport、cluster可访问


# 通过nodeport
root@cilium1:/# curl 127.0.0.1:31126
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
# 通过service:port
root@cilium1:/# curl 10.97.209.103
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
# 检查iptables 发现为空
root@cilium1:/# iptables-save | grep KUBE-SVC
root@cilium1:/# 
# 检查ciliun service
root@cilium1:/# kubectl exec -n kube-system  cilium-t9ffc  -- cilium service list
Defaulted container "cilium-agent" out of: cilium-agent, mount-cgroup (init), clean-cilium-state (init)
ID   Frontend             Service Type   Backend                  
1    10.96.0.1:443        ClusterIP      1 => 172.16.88.57:6443   
2    10.96.0.10:9153      ClusterIP      1 => 10.0.2.229:9153     
                                         2 => 10.0.2.80:9153      
3    10.96.0.10:53        ClusterIP      1 => 10.0.2.229:53       
                                         2 => 10.0.2.80:53        
4    10.97.209.103:80     ClusterIP      1 => 10.0.2.69:80        
                                         2 => 10.0.1.23:80        
                                         3 => 10.0.1.126:80       
                                         4 => 10.0.2.212:80       
5    172.16.88.57:31126   NodePort       1 => 10.0.2.69:80        
                                         2 => 10.0.1.23:80        
                                         3 => 10.0.1.126:80       
                                         4 => 10.0.2.212:80       
6    0.0.0.0:31126        NodePort       1 => 10.0.2.69:80        
                                         2 => 10.0.1.23:80        
                                         3 => 10.0.1.126:80       
                                         4 => 10.0.2.212:80


  1. 从上面的安装和测试结果来,虽然我们没有安装k8s的kube-proxy组件,但是集群依然正常。说明kube-proxy组件确实是可以被替代的。


总结


     

以上虽然完成了kubernetes without kube-proxy的搭建和测试工作,但还是有很多事情没说明。比如使用cilium的系统要求、cilium是什么、有几种组网模式、网络策略。不过请不要着急,期待我后续的文章。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
Kubernetes 负载均衡 算法
k8s学习--kube-proxy的三种工作模式详细解释
k8s学习--kube-proxy的三种工作模式详细解释
170 0
|
4月前
|
Kubernetes 负载均衡 API
在K8S中,Kube-proxy有什么功能?
在K8S中,Kube-proxy有什么功能?
|
4月前
|
存储 Kubernetes 负载均衡
在K8S中,Kube-Proxy为什么使用ipvs,而不使用iptables?
在K8S中,Kube-Proxy为什么使用ipvs,而不使用iptables?
|
4月前
|
Kubernetes 负载均衡 监控
在K8S中,kube-proxy的工作模式是什么?
在K8S中,kube-proxy的工作模式是什么?
|
4月前
|
存储 Kubernetes 负载均衡
在K8S中,kube-proxy ipvs 和 iptables 有何异同?
在K8S中,kube-proxy ipvs 和 iptables 有何异同?
|
4月前
|
Kubernetes 负载均衡 API
在K8S中,kube-proxy ipvs 原理是什么?
在K8S中,kube-proxy ipvs 原理是什么?
|
4月前
|
Kubernetes 负载均衡 API
在K8S中,kube-proxy iptables 原理是什么?
在K8S中,kube-proxy iptables 原理是什么?
|
4月前
|
Kubernetes 负载均衡 监控
在K8S中,kube-proxy 作用是什么?
在K8S中,kube-proxy 作用是什么?
|
7月前
|
Kubernetes 负载均衡 Cloud Native
云原生|kubernetes|解决kube-proxy报错:Not using `--random-fully` in the MASQUERADE rule for iptables
云原生|kubernetes|解决kube-proxy报错:Not using `--random-fully` in the MASQUERADE rule for iptables
67 0
|
Kubernetes 负载均衡 Cloud Native
云原生|kubernetes|解决kube-proxy报错:Not using `--random-fully` in the MASQUERADE rule for iptables
云原生|kubernetes|解决kube-proxy报错:Not using `--random-fully` in the MASQUERADE rule for iptables
623 0