19.网络插件calico
19.网络插件calico
官网: https://docs.projectcalico.org/v3.8/introduction/
calico默认工作在192.168.0.0/16 的网络
calico还不支持ipvs
====
Egres 出站
Ingress 入站
networkpolicy 网络策略,简写 netpol
查看网络策略帮助:
kubectl explain networkpolicy
查看某名称空间的网络策略:
[root@k8s-master networkpoliy]# kubectl get netpol -n dev
NAME POD-SELECTOR AGE
deny-all-ingress 73s
====
calico有多种部署方法,我们这里介绍的是使用flannel和calico混用的方法。这里也比较推荐这种方法。
flannel负责网络部分的功能,而calico我们只使用它的网络策略的功能。
calico部署:
1. 另外单独部署一个etcd
官方文档:
https://docs.projectcalico.org/v3.8/getting-started/kubernetes/installation/flannel
2. 公用集群的etcd
wget https://docs.projectcalico.org/v3.8/manifests/canal.yaml
kubectl apply -f canal.yaml
[root@k8s-master networkpoliy]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
canal-j9mlh 2/2 Running 0 97m
canal-jgj2j 2/2 Running 0 97m
=====================
calico实例:
[root@k8s-master networkpoliy]# kubectl create namespace dev
namespace/dev created
[root@k8s-master networkpoliy]# kubectl create namespace prod
namespace/prod created
[root@k8s-master networkpoliy]# cat ingress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
namespace: dev
spec:
podSelector: {} #空表示选择该名称空间的所有pod
policyTypes: #当这里写了Ingress,则Ingress中定义的规则生效,如果规则为空则为全部拒绝。这里没有写Egres,则表示Egres规则不生效,默认全开。
- Ingress
[root@k8s-master networkpoliy]# cat pod-a.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
[root@k8s-master networkpoliy]# kubectl apply -f pod-a.yaml -n dev
pod/pod1 created
[root@k8s-master networkpoliy]# kubectl apply -f pod-a.yaml -n prod
pod/pod1 created
[root@k8s-master networkpoliy]# kubectl get pods -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod1 1/1 Running 0 31s 10.244.1.2 k8s-node1 <none> <none>
[root@k8s-master networkpoliy]# kubectl get pods -n prod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod1 1/1 Running 0 11s 10.244.1.3 k8s-node1 <none> <none>
[root@k8s-master networkpoliy]# curl 10.244.1.2
^C
[root@k8s-master networkpoliy]# curl 10.244.1.3
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
dev的ns我们应用了策略,所以通过curl请求不到数据,prod的ns中我们没有应用网络策略,所以我们可以通过curl正常请求到。
添加入站规则
ingress:
- {} #这个{}写法表示允许所有的入站,allow all
[root@k8s-master networkpoliy]# cat ingress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
namespace: dev
spec:
podSelector: {} #空表示选择该名称空间的所有pod
ingress:
- {} #这个{}写法表示允许所有的入站,allow all
policyTypes: #当这里写了Ingress,则Ingress中定义的规则生效,如果规则为空则为全部拒绝。这里没有写Egres,则表示Egres规则不生效,默认全开。
[root@k8s-master networkpoliy]# kubectl apply -f ingress.yaml -n dev
networkpolicy.networking.k8s.io/deny-all-ingress configured
[root@k8s-master networkpoliy]# curl 10.244.1.2
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
当我们修改策略允许dev上所有可以入站后可以正常请求到10.244.1.2了。
添加一个入站规则,允许10.244.0.0/16这个网段的除了10.244.1.3这个ip,都可以访问pod的80端口,使用podSelector来匹配pod
[root@k8s-master networkpoliy]# cat allow-netpol.demo.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-myapp-ingress
spec:
podSelector:
matchLabels:
app: myapp
ingress:
- from: #这里不写from则允许所有可以访问
- ipBlock:
cidr: 10.244.0.0/16 #指定网段
except:
- 10.244.1.3/32 #除开这个ip
ports:
- protocol: TCP
port: 80
[root@k8s-master networkpoliy]# kubectl apply -f allow-netpol.demo.yaml -n dev
[root@k8s-master networkpoliy]# telnet 10.244.1.2 80
Trying 10.244.1.2...
Connected to 10.244.1.2.
Escape character is '^]'.
在本地测试,可以正常连接
[root@k8s-master networkpoliy]# kubectl exec pod1 -it -n prod -- /bin/sh
/ # telnet 10.244.1.2 80
登录到10.244.1.3这个pod上,则测试telnet 80端口不通,说明策略生效。
添加一个出站策略:
拒绝所有出站策略:
[root@k8s-master networkpoliy]# cat egress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
namespace: prod
spec:
podSelector: {} #空表示选择该名称空间的所有pod
policyTypes: #当这里写了Ingress,则Ingress中定义的规则生效,如果规则为空则为全部拒绝。这里没有写Egres,则表示Egres规则不生效,默认全开。
- Egress
[root@k8s-master networkpoliy]# kubectl apply -f egress.yaml -n prod
[root@k8s-master networkpoliy]# kubectl exec pod1 -it -n prod -- /bin/sh
/ # ping 10.250.0.89
PING 10.250.0.89 (10.250.0.89): 56 data bytes
ping k8s-master上的kube-scheduler-k8s-master 的ip发现ping不通,策略生效。
允许所有出去的策略:
[root@k8s-master networkpoliy]# cat egress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
namespace: prod
spec:
podSelector: {} #空表示选择该名称空间的所有pod
egress:
- {}
policyTypes: #当这里写了Ingress,则Ingress中定义的规则生效,如果规则为空则为全部拒绝。这里没有写Egres,则表示Egres规则不生效,默认全开。
- Egress
[root@k8s-master networkpoliy]# kubectl apply -f egress.yaml -n prod
networkpolicy.networking.k8s.io/deny-all-egress configured
[root@k8s-master networkpoliy]# kubectl exec pod1 -it -n prod -- /bin/sh
/ # ping 10.250.0.89
PING 10.250.0.89 (10.250.0.89): 56 data bytes
64 bytes from 10.250.0.89: seq=119 ttl=63 time=0.384 ms
64 bytes from 10.250.0.89: seq=120 ttl=63 time=0.505 ms
64 bytes from 10.250.0.89: seq=121 ttl=63 time=0.373 ms
64 bytes from 10.250.0.89: seq=122 ttl=63 time=0.360 ms
64 bytes from 10.250.0.89: seq=123 ttl=63 time=0.504 ms
ping通了,策略生效。
一般对于网络策略设置的规范:
对于网络策略来讲:
名称空间:
拒绝所有出站,入站规则
方形所有出站目标名称空间内的所有Pod
19.网络插件calico的更多相关文章
- k8s西游记 - 切换网络插件IP池
前言 最近在另一个k8s集群中,搭建了kong网关,在配置OIDC插件时,希望使用Memcahe代替Cookie来存储会话信息,于是把部署在同一局域网Memcahe的内网IP,比如:192.168.1 ...
- Flannel和Calico网络插件工作流程对比
Flannel和Calico网络插件对比 Calico简介 Calico是一个纯三层的网络插件,calico的bgp模式类似于flannel的host-gw Calico方便集成 OpenStac ...
- Flannel和Calico网络插件对比
1.Kubernetes通信问题 1.容器间通信:即同一个Pod内多个容器间通信,通常使用loopback来实现. 2.Pod间通信:K8s要求,Pod和Pod之间通信必须使用Pod-IP 直接访问另 ...
- Calico网络插件
以下大部分是本人参考各种资料{官方文档.书籍}对知识的汇总和整理,其中有理解错误的地方请大神留言和指正,嘿嘿~~ 1.概述 参考文档:https://projectcalico.docs.tigera ...
- K8S Calico网络插件
0.前言 参考文档:https://github.com/containernetworking/cni Pod网络插件,为了实现Pod网络而需要的插件.组件.由于Kubernetes通过开放的CNI ...
- k8s更换网络插件:从flannel更换成calico
卸载flannel 查看已安装的flannel的信息 # 查看CNI插件,可以得知使用的是flannel # cat /etc/cni/net.d/10-flannel.conflist { &quo ...
- Docker网络解决方案 - Calico部署记录
简单来说,实现docker跨主机容器间通信,常用的第三方网络方案是Flannel,Weave,Calico:Flannel会为每个host分配一个subnet,容器从这个subnet中分配ip,这些i ...
- 使用kubeadm安装kubernetes/部署前准备/flannel网络插件/镜像下载/
本文内容参考<kuberneters进阶实战>/马哥的新书/推荐 部署前的准备 主机名称解析 分布式系统环境中的多主机通信通常基于主机名称进行,这在IP地址存在变化的可能性时为主机提供了固 ...
- k8s的flannel网络插件配置
flannel的网络插件配置 Kubernetes网络通信需要解决以下问题: (1)容器间通信:同一个Pod内的多个容器间的通信,lo (2)Pod通信:P ...
随机推荐
- EF方式增加数据
单条记录添加 第一种方式: public void AddRegion() { using(Northwind db = new Northwind()) { Region regi ...
- socket 编程的一些应用例子
1.#传输文件的例子 import socketfrom socket import *import osimport requests import time,socketserver,struct ...
- Android.mk走读与Cmake配置
Android.mk认识: 在上一次[https://www.cnblogs.com/webor2006/p/9946061.html]中学会了用NDK提供的交叉编译工程编译成Android能运行的可 ...
- PHP获取不到url传递参数中#&等特殊字符解决方法
有些符号在URL中是不能直接传递的,无法传入PHP处理,比如#&等符号,通过$_GET是获取不到的,比如一个域名https://localhost/url.php?url=yangyufei+ ...
- oracle 12c 安装补丁报错
环境: centos 7.5 oracle 12.2.0.1 报错: 执行一下报错: 更新dba_registry_sqlpatch $ORACLE_HOME/OPatch/datapatch -ve ...
- 004_linuxC++之_函数的重载
(一)源码下载 (一) 函数的重载:同一个命名函数,通过传入参数的不同,调用不一样的函数 上面程序的运行结果: (二)函数只能通过参数的不一样重载函数,不能通过返回参数的不一样重载函数 运行结果报错 ...
- React事件处理和原生JS事件处理
1.原生JS 事件触发调用有三种方式: 1. on[event]事件属性,手动触发 ❗️on[event]事件是Window对象上的方法. 2. on[event]事件属性,通过htmlElemen ...
- sql server 知识整理 isnull函数()
exec sp_helptext ProPrecode_matcode_uf exec sp_helptext 存储过程名字 isnull 函数() SQL Serve中的isnull()函数: is ...
- sql server 存储过程的详解
SqlServer存储过程详解 1.创建存储过程的基本语法模板: if (exists (select * from sys.objects where name = 'pro_name')) dro ...
- 五十四.自定义镜像及仓库、持久化存储 、 Docker网络架构
1. 制作自定义镜像(base基础镜像,搭建共性环境) 基于centos镜像使用commit创建新的镜像文件 基于centos镜像使用Dockerfile文件创建一个新的镜像文件 1.1 使用镜像 ...