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的更多相关文章

  1. k8s西游记 - 切换网络插件IP池

    前言 最近在另一个k8s集群中,搭建了kong网关,在配置OIDC插件时,希望使用Memcahe代替Cookie来存储会话信息,于是把部署在同一局域网Memcahe的内网IP,比如:192.168.1 ...

  2. Flannel和Calico网络插件工作流程对比

    Flannel和Calico网络插件对比   Calico简介 Calico是一个纯三层的网络插件,calico的bgp模式类似于flannel的host-gw Calico方便集成 OpenStac ...

  3. Flannel和Calico网络插件对比

    1.Kubernetes通信问题 1.容器间通信:即同一个Pod内多个容器间通信,通常使用loopback来实现. 2.Pod间通信:K8s要求,Pod和Pod之间通信必须使用Pod-IP 直接访问另 ...

  4. Calico网络插件

    以下大部分是本人参考各种资料{官方文档.书籍}对知识的汇总和整理,其中有理解错误的地方请大神留言和指正,嘿嘿~~ 1.概述 参考文档:https://projectcalico.docs.tigera ...

  5. K8S Calico网络插件

    0.前言 参考文档:https://github.com/containernetworking/cni Pod网络插件,为了实现Pod网络而需要的插件.组件.由于Kubernetes通过开放的CNI ...

  6. k8s更换网络插件:从flannel更换成calico

    卸载flannel 查看已安装的flannel的信息 # 查看CNI插件,可以得知使用的是flannel # cat /etc/cni/net.d/10-flannel.conflist { &quo ...

  7. Docker网络解决方案 - Calico部署记录

    简单来说,实现docker跨主机容器间通信,常用的第三方网络方案是Flannel,Weave,Calico:Flannel会为每个host分配一个subnet,容器从这个subnet中分配ip,这些i ...

  8. 使用kubeadm安装kubernetes/部署前准备/flannel网络插件/镜像下载/

    本文内容参考<kuberneters进阶实战>/马哥的新书/推荐 部署前的准备 主机名称解析 分布式系统环境中的多主机通信通常基于主机名称进行,这在IP地址存在变化的可能性时为主机提供了固 ...

  9. k8s的flannel网络插件配置

    flannel的网络插件配置 Kubernetes网络通信需要解决以下问题:            (1)容器间通信:同一个Pod内的多个容器间的通信,lo            (2)Pod通信:P ...

随机推荐

  1. EF方式增加数据

             单条记录添加 第一种方式: public void AddRegion() { using(Northwind db = new Northwind()) { Region regi ...

  2. socket 编程的一些应用例子

    1.#传输文件的例子 import socketfrom socket import *import osimport requests import time,socketserver,struct ...

  3. Android.mk走读与Cmake配置

    Android.mk认识: 在上一次[https://www.cnblogs.com/webor2006/p/9946061.html]中学会了用NDK提供的交叉编译工程编译成Android能运行的可 ...

  4. PHP获取不到url传递参数中#&等特殊字符解决方法

    有些符号在URL中是不能直接传递的,无法传入PHP处理,比如#&等符号,通过$_GET是获取不到的,比如一个域名https://localhost/url.php?url=yangyufei+ ...

  5. oracle 12c 安装补丁报错

    环境: centos 7.5 oracle 12.2.0.1 报错: 执行一下报错: 更新dba_registry_sqlpatch $ORACLE_HOME/OPatch/datapatch -ve ...

  6. 004_linuxC++之_函数的重载

    (一)源码下载 (一) 函数的重载:同一个命名函数,通过传入参数的不同,调用不一样的函数 上面程序的运行结果: (二)函数只能通过参数的不一样重载函数,不能通过返回参数的不一样重载函数 运行结果报错 ...

  7. React事件处理和原生JS事件处理

    1.原生JS 事件触发调用有三种方式: 1. on[event]事件属性,手动触发  ❗️on[event]事件是Window对象上的方法. 2. on[event]事件属性,通过htmlElemen ...

  8. sql server 知识整理 isnull函数()

    exec sp_helptext ProPrecode_matcode_uf exec sp_helptext 存储过程名字 isnull 函数() SQL Serve中的isnull()函数: is ...

  9. sql server 存储过程的详解

    SqlServer存储过程详解 1.创建存储过程的基本语法模板: if (exists (select * from sys.objects where name = 'pro_name')) dro ...

  10. 五十四.自定义镜像及仓库、持久化存储 、 Docker网络架构

    1. 制作自定义镜像(base基础镜像,搭建共性环境) 基于centos镜像使用commit创建新的镜像文件 基于centos镜像使用Dockerfile文件创建一个新的镜像文件   1.1 使用镜像 ...