Calico网络策略实践

因为Kubernetes官方用的flannel无法实现多租户环境下的网络隔离,建立起来的pod之间实际可以相互访问,而Calico可以实现,因此周末找个时间试了一下大概的过程。

前面的kubernetes安装掠过

Calico安装

下载yaml文件

http://docs.projectcalico.org/v2.3/getting-started/kubernetes/installation/hosted/calico.yaml

http://docs.projectcalico.org/v2.3/getting-started/kubernetes/installation/rbac.yaml

下载镜像文件

quay.io/calico/node:v1.3.0
quay.io/calico/cni:v1.9.1
quay.io/calico/kube-policy-controller:v0.6.0

# 国内镜像
jicki/node:v1.3.0
jicki/cni:v1.9.1
jicki/kube-policy-controller:v0.6.0

修改calico.yaml的如下部分

etcd_endpoints: "https://192.168.44.108:2379"

    etcd_ca: "/calico-secrets/etcd-ca"
    etcd_cert: "/calico-secrets/etcd-cert"
    etcd_key: "/calico-secrets/etcd-key"  
# 这里面要写入 base64 的信息
# 分别执行括号内的命令,填写到 etcd-key , etcd-cert, etcd-ca 中,不用括号。

data:
  etcd-key: (cat /etc/kubernetes/ssl/etcd-key.pem | base64 | tr -d ‘\n‘)
  etcd-cert: (cat /etc/kubernetes/ssl/etcd.pem | base64 | tr -d ‘\n‘)
  etcd-ca: (cat /etc/kubernetes/ssl/ca.pem | base64 | tr -d ‘\n‘)

    - name: CALICO_IPV4POOL_CIDR
      value: "10.233.0.0/16"

建立pod

[[email protected]1 ~]# kubectl apply -f calico.yaml
configmap "calico-config" created
secret "calico-etcd-secrets" created
daemonset "calico-node" created
deployment "calico-policy-controller" created
serviceaccount "calico-policy-controller" created
serviceaccount "calico-node" created

[[email protected]-master-1 ~]# kubectl apply -f rbac.yaml

验证,如果你只有一个node节点,calico-node应该是1,然后下面的calico-node也会相应少一个

[[email protected]1 calico]# kubectl get ds -n kube-system
NAME          DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE   NODE-SELECTOR   AGE
calico-node   2         2         2         2            2           <none>          41s

[[email protected]-master-1 calico]# kubectl get pods -n kube-system
NAME                                        READY     STATUS    RESTARTS   AGE
calico-node-04kd8                           2/2       Running   0          1m
calico-node-pkbwq                           2/2       Running   0          1m
calico-policy-controller-4282960220-mcdm7   1/1       Running   0          1m

Kubelet和Kube-proxy

相应的node上的kubelet和kube-proxy的修改为

[roo[email protected] ~]# cat /etc/systemd/system/kubelet.service
[Unit]
Description=kubernetes Kubelet
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service

[Service]
WorkingDirectory=/var/lib/kubelet
ExecStart=/usr/local/bin/kubelet   --address=192.168.44.109   --hostname-override=calico-node1   --pod-infra-container-image=docker.io/jicki/pause-amd64:3.0   --experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig   --kubeconfig=/etc/kubernetes/kubelet.kubeconfig   --require-kubeconfig   --cert-dir=/etc/kubernetes/ssl   --cluster_dns=10.254.0.2   --cluster_domain=cluster.local.   --hairpin-mode promiscuous-bridge   --allow-privileged=true   --serialize-image-pulls=false   --logtostderr=true   --cgroup-driver=systemd   --network-plugin=cni   --v=2
ExecStopPost=/sbin/iptables -A INPUT -s 10.0.0.0/8 -p tcp --dport 4194 -j ACCEPT
ExecStopPost=/sbin/iptables -A INPUT -s 172.16.0.0/12 -p tcp --dport 4194 -j ACCEPT
ExecStopPost=/sbin/iptables -A INPUT -s 192.168.0.0/16 -p tcp --dport 4194 -j ACCEPT
ExecStopPost=/sbin/iptables -A INPUT -p tcp --dport 4194 -j DROP
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

kube-proxy

[[email protected] ~]# cat /etc/systemd/system/kube-proxy.service
[Unit]
Description=kubernetes Kube-Proxy Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target

[Service]
WorkingDirectory=/var/lib/kube-proxy
ExecStart=/usr/local/bin/kube-proxy   --bind-address=192.168.44.109   --hostname-override=calico-node1   --cluster-cidr=10.254.0.0/16   --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig   --logtostderr=true   --v=2
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

安装calicoctl

下载

https://github.com/projectcalico/calicoctl/releases/download/v1.3.0/calicoctl
[[email protected]1 ~]# mv calicoctl /usr/local/bin
[[email protected]-master-1 ~]# cd /usr/local/bin

[[email protected]-master-1 ~]# chmod +x calicoctl

[[email protected]-master-1 ~]# calicoctl version
Version:      v1.3.0
Build date:
Git commit:   d2babb6

## 创建 calicoctl 配置文件

# 配置文件, 在 安装了 calico 网络的 机器下

[[email protected]-master-1 ~]# mkdir /etc/calico

[[email protected]-master-1 ~]# vi /etc/calico/calicoctl.cfg

apiVersion: v1
kind: calicoApiConfig
metadata:
spec:
  datastoreType: "etcdv2"
  etcdEndpoints: "https://192.168.44.108:2379"
  etcdKeyFile: "/etc/kubernetes/ssl/etcd-key.pem"
  etcdCertFile: "/etc/kubernetes/ssl/etcd.pem"
  etcdCACertFile: "/etc/kubernetes/ssl/ca.pem"

# 查看 calico 状态

[[email protected]-master-2 ~]# calicoctl node status
Calico process is running.

IPv4 BGP status
+--------------+-------------------+-------+----------+-------------+
| PEER ADDRESS |     PEER TYPE     | STATE |  SINCE   |    INFO     |
+--------------+-------------------+-------+----------+-------------+
| 10.6.0.188   | node-to-node mesh | up    | 10:05:39 | Established |
+--------------+-------------------+-------+----------+-------------+

这里要注意下,查看节点状态需要在安装calico pod的机器上运行,如果只有一个node,会显示找不到ipv4 BGP,折腾了很久一直出不来这个表,后来又安装了一个节点后就出来了,双方指到各自的地址。

网络策略

我用一个节点验证

先建立namespace

apiVersion: v1
kind: Namespace
metadata:
  name: ns-calico1
  labels:
    user: calico1
---
apiVersion: v1
kind: Namespace
metadata:
  name: ns-calico2

然后创建一个nginx,使用了一个user:ericnie的label.

[[email protected]master calico]# cat nginx.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: ca1-nginx
  namespace: ns-calico2
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: nginx
        user: ericnie
    spec:
      containers:
        - name: nginx
          image: nginx:alpine
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80

---

apiVersion: v1
kind: Service
metadata:
  name: ca1-nginx-svc
  namespace: ns-calico2
  labels:
    user: ericnie
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    name: nginx

再建立一个tomcat的pod,用来访问nginx

[[email protected]master calico]# cat tomcat.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: tomcat
  namespace: ns-calico2
  labels:
    user: ericnie
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: tomcat
    spec:
      containers:
        - name: tomcat
          image: tomcat:9.0-jre8
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080

从tomcat中访问nginx,无论tomcat是否是ns-calico2的namespace都是联通的。

[[email protected] calico]# kubectl get pods -n ns-calico2 -o wide
NAME                         READY     STATUS    RESTARTS   AGE       IP              NODE
ca1-nginx-2981719527-9zxw6   1/1       Running   0          23m       10.233.63.139   calico-node1
tomcat-3717491931-b5tl5      1/1       Running   0          23m       10.233.63.140   calico-node1
[[email protected]-master calico]# kubectl exec -it tomcat-3717491931-b5tl5 -n ns-calico2 bash
[email protected]-3717491931-b5tl5:/usr/local/tomcat# curl http://10.233.63.139
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

现在修改一下ns-calico2的策略,也就是当前缺省会拒绝任何pod的访问。

[[email protected] calico]# cat ns-calico2.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: ns-calico2
  labels:
    user: ericnie
  annotations:
    net.beta.kubernetes.io/network-policy: |
      {
        "ingress": {
          "isolation": "DefaultDeny"
        }
      }

通过tomcat pod验证,确实访问不了

再建立一个策略,允许有label, user: ericnie的pod进行访问

[[email protected] calico]# cat net-policy.yaml
apiVersion: extensions/v1beta1
kind: NetworkPolicy
metadata:
 name: calico1-network-policy
 namespace: ns-calico2
spec:
 podSelector:
  matchLabels:
    user: ericnie
 ingress:
  - from:
     - namespaceSelector:
        matchLabels:
         user: ericnie
     - podSelector:
        matchLabels:
         user: ericnie

建立起来以后验证,tomcat pod又能访问nginx了.

谢谢下面文章的指导

https://jicki.me/2017/07/25/kubernetes-1.7.2/#calico-%E7%BD%91%E7%BB%9C

http://blog.csdn.net/qq_34463875/article/details/74288175

时间: 2024-10-04 23:34:29

Calico网络策略实践的相关文章

k83 calico 网络策略

常见的CNI网络插件包含以下几种: Flannel:为Kubernetes提供叠加网络的网络插件,基于TUN/TAP隧道技术,使用UDP封装IP报文进行创建叠 加网络,借助etcd维护网络的分配情况,缺点:无法支持网络策略访问控制.Calico:基于BGP的三层网络插件,也支持网络策略进而实现网络的访问控制:它在每台主机上都运行一个虚拟路由,利用Linux内核转发网络数据包,并借助iptables实现防火墙功能.实际上Calico最后的实现就是将每台主机都变成了一台路由器,将各个网络进行连接起来

Kubernetes网络组件之Calico策略实践初探(BGP、RR、IPIP)

Kubernetes网络方案之 Calico策略实践 案例:由于k8s集群部署之前的方案是flannel网络策略,所以这里将flannel策略切换成calico网络策略 Calico是一个纯三层的数据中心网络方案,Calico支持广泛的平台,包括Kubernetes.OpenStack等. Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的虚拟路由器( vRouter) 来负责数据转发,而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的

如何定制 Calico 网络 Policy - 每天5分钟玩转 Docker 容器技术(70)

Calico 默认的 policy 规则是:容器只能与同一个 calico 网络中的容器通信.本节讨论如何定制 policy. calico 能够让用户定义灵活的 policy 规则,精细化控制进出容器的流量,下面我们就来实践一个场景: 创建一个新的 calico 网络 cal_web 并部署一个 httpd 容器 web1. 定义 policy 允许 cal_net2 中的容器访问 web1 的 80 端口. 首先创建 cal_web. docker network create --driv

[k8s]docker calico网络

#!/usr/bin/env bash docker stats vim /usr/lib/systemd/system/docker.service # /etc/systemd/system/docker.service --cluster-store=etcd://192.168.14.132:2379 systemctl daemon-reload systemctl restart docker.service [[email protected] ~]# ps -ef|grep do

Kubernetes之部署calico网络

部署calico网络 Calico组件: Felix:Calico agent     运行在每台node上,为容器设置网络信息:IP,路由规则,iptable规则等 etcd:calico后端存储 BIRD:  BGP Client: 负责把Felix在各node上设置的路由信息广播到Calico网络 , 通过BGP协议来着 BGP Route Reflector: 大规则集群的分级路由分发. calico: calico命令行管理工具 为Node节点部署calico网络,参照官方文档:htt

Kubernetes之部署calico网络Update

部署calico网络 Calico组件介绍: Felix:Calico agent 运行在每台node上,为容器设置网络信息:IP,路由规则,iptable规则等 etcd:calico后端存储 BIRD: BGP Client: 负责把Felix在各node上设置的路由信息广播到Calico网络( 通过BGP协议). BGP Route Reflector: 大规模集群的分级路由分发. calico: calico命令行管理工具 calico的部署: 参照官方文档:https://docs.p

2017-2018-2 20179215《网络攻防实践》第六周作业

2017-2018-2 20179215<网络攻防实践> 第六周学习总结 课本学习笔记 一.TCP/IP网络协议攻击 1.网络安全的属性:机密性 .完整性 .可用性 .真实性 .不可抵赖性 . 2.网络攻击的基本模式分为:截获(嗅探 与 监听) .中断(拒绝服务) .篡改(数据包篡改) .伪造(欺骗) . 3.TCP/IP网络协议栈在设计时采用了分层模型,分为:网络接口层 .互联层 .传输层 .应用层.每一层当中都有针对破坏网络安全属性为目的的攻击技术.每一层所涉及的主要协议: 网络接口层:以

k8s基于canel的网络策略

Kubernetes能够把集群中不同Node节点上的Pod连接起来,并且默认情况下,每个Pod之间是可以相互访问的.但在某些场景中,不同的Pod不应该互通,这个时候就需要进行访问控制.亲测:在kubernetes集群中,默认可以设定NetworkPolicy资源,但是必须安装支持网络策略的插件,否则即使设置好网络策略也不会生效. calico提供了多种解决方案:        (1)使用flannel提供网络,使用calico插件提供网络策略:        (2)使用calico同时提供网络和

12.基于canel的网络策略

参考文档:https://docs.projectcalico.org/v3.8/getting-started/kubernetes/ 一.Calico作为网络插件提供网络功能 Calico:基于BGP网络协议来通过自动学习判定生成路由条目. 隧道方式:IPIP 路由方式:BGP 默认网段192.168.0.0/16. 二.Calico提供网络策略 1.安装部署 不同环境,使用目的不同,安装方式不同,参考官方文档. 也依赖etcd,可通过api-server去写k8s的etcd,或独立部署一个