官网: https://docs.projectcalico.org/v3.8/introduction/
calico默认工做在192.168.0.0/16 的网络
calico还不支持ipvshtml
====node
Egres 出站
Ingress 入站
networkpolicy 网络策略,简写 netpolapi
查看网络策略帮助:
kubectl explain networkpolicy网络
查看某名称空间的网络策略:
[root@k8s-master networkpoliy]# kubectl get netpol -n dev
NAME POD-SELECTOR AGE
deny-all-ingress
====
calico有多种部署方法,咱们这里介绍的是使用flannel和calico混用的方法。这里也比较推荐这种方法。
flannel负责网络部分的功能,而calico咱们只使用它的网络策略的功能。curl
calico部署:
1. 另外单独部署一个etcd
官方文档:
https://docs.projectcalico.org/v3.8/getting-started/kubernetes/installation/flannelide
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实例:url
[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了。
[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通了,策略生效。
通常对于网络策略设置的规范:spa
对于网络策略来说: 名称空间: 拒绝全部出站,入站规则 方形全部出站目标名称空间内的全部Pod