因为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

[root@k8s-master- ~]# 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 [root@k8s-master- ~]# kubectl apply -f rbac.yaml

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

[root@k8s-master- calico]# kubectl get ds -n kube-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE-SELECTOR AGE
calico-node <none> 41s [root@k8s-master- calico]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-node-04kd8 / Running 1m
calico-node-pkbwq / Running 1m
calico-policy-controller--mcdm7 / Running 1m

Kubelet和Kube-proxy

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

[root@calico-node1 ~]# 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=
ExecStopPost=/sbin/iptables -A INPUT -s 10.0.0.0/ -p tcp --dport -j ACCEPT
ExecStopPost=/sbin/iptables -A INPUT -s 172.16.0.0/ -p tcp --dport -j ACCEPT
ExecStopPost=/sbin/iptables -A INPUT -s 192.168.0.0/ -p tcp --dport -j ACCEPT
ExecStopPost=/sbin/iptables -A INPUT -p tcp --dport -j DROP
Restart=on-failure
RestartSec= [Install]
WantedBy=multi-user.target

kube-proxy

[root@calico-node1 ~]# 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/ \
--kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \
--logtostderr=true \
--v=
Restart=on-failure
RestartSec=
LimitNOFILE= [Install]
WantedBy=multi-user.target

安装calicoctl

下载

https://github.com/projectcalico/calicoctl/releases/download/v1.3.0/calicoctl
[root@k8s-master- ~]# mv calicoctl /usr/local/bin
[root@k8s-master- ~]# cd /usr/local/bin [root@k8s-master- ~]# chmod +x calicoctl [root@k8s-master- ~]# calicoctl version
Version: v1.3.0
Build date:
Git commit: d2babb6 ## 创建 calicoctl 配置文件 # 配置文件, 在 安装了 calico 网络的 机器下 [root@k8s-master- ~]# mkdir /etc/calico [root@k8s-master- ~]# 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 状态 [root@k8s-master- ~]# 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 | :: | 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.

[root@calico-master calico]# cat nginx.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: ca1-nginx
namespace: ns-calico2
spec:
replicas:
template:
metadata:
labels:
name: nginx
user: ericnie
spec:
containers:
- name: nginx
image: nginx:alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: --- apiVersion: v1
kind: Service
metadata:
name: ca1-nginx-svc
namespace: ns-calico2
labels:
user: ericnie
spec:
ports:
- port:
targetPort:
protocol: TCP
selector:
name: nginx

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

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

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

[root@calico-master calico]# kubectl get pods -n ns-calico2 -o wide
NAME READY STATUS RESTARTS AGE IP NODE
ca1-nginx--9zxw6 / Running 23m 10.233.63.139 calico-node1
tomcat--b5tl5 / Running 23m 10.233.63.140 calico-node1
[root@calico-master calico]# kubectl exec -it tomcat--b5tl5 -n ns-calico2 bash
root@tomcat--b5tl5:/usr/local/tomcat# curl http://10.233.63.139
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 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的访问。

[root@calico-master 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进行访问

[root@calico-master 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

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

  1. Calico网络插件

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

  2. K8S Calico网络插件

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

  3. kubernetes学习笔记之十三:基于calico的网络策略入门

    一..安装calico [root@k8s-master01 ~]# kubectl apply -f https://docs.projectcalico.org/v3.3/getting-star ...

  4. k8s之网络插件flannel及基于Calico的网络策略

    1.k8s网络通信 a.容器间通信:同一个pod内的多个容器间的通信,通过lo即可实现; b.pod之间的通信:pod ip <---> pod ip,pod和pod之间不经过任何转换即可 ...

  5. [k8s]docker calico网络&docker cluster-store

    docker cluster-store选项 etcd-calico(bgp)实现docker夸主机通信 配置calico网络 - 启动etcd etcd --listen-client-urls h ...

  6. Kubernetes学习之路(二十一)之网络模型和网络策略

    目录 Kubernetes的网络模型和网络策略 1.Kubernetes网络模型和CNI插件 1.1.Docker网络模型 1.2.Kubernetes网络模型 1.3.Flannel网络插件 1.4 ...

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

    Calico 默认的 policy 规则是:容器只能与同一个 calico 网络中的容器通信.本节讨论如何定制 policy. calico 能够让用户定义灵活的 policy 规则,精细化控制进出容 ...

  8. k8s网络之Calico网络

    k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 简介 Calico 是一种容器之间互通的网络方案.在虚拟化平台中,比如 Open ...

  9. 第 8 章 容器网络 - 070 - 如何定制 Calico 网络 Policy?

    定制 Calico 网络 Policy Calico 默认的 policy 规则是:容器只能与同一个 calico 网络中的容器通信. Calico 能够让用户定义灵活的 policy 规则,精细化控 ...

随机推荐

  1. Memcached内存缓存技术

    Memcached是什么,有什么作用? Memcached是一个开源的.高性能的内存缓存软件,从名称上看Mem就是内存的意思,而Cache就是缓存的意思. Memcached通过在事先规划好的内存空间 ...

  2. tornado 模版继承 函数和类的调用

    模版继承.函数和类的调用 目录结构 lesson5.py # -*- coding:utf-8 -*- import tornado.web import tornado.httpserver imp ...

  3. Restful Framework (四)

    目录 一.分页 二.视图 三.路由 四.渲染器 一.分页 回到顶部 试问如果当数据量特别大的时候,你是怎么解决分页的? 方式a.记录当前访问页数的数据id 方式b.最多显示120页等 方式c.只显示上 ...

  4. Java Control Statements

    Java Control Statements Java For Loop public class ForExample1 { public static void main(String[] ar ...

  5. bootstrap插件学习-bootstrap.tab.js(读码)

    先看bootstrap-tab.js的结构 var Tab = function ( element ) {} //构造器 Tab.prototype ={} //构造器的原型 $.fn.tab = ...

  6. linux 下 php 扩展

    首先查看,php 原来安装的配置 /www/server/php/72/bin/php -i | grep configure (php 位置) 加上你的扩展 '--with-mcrypt' make ...

  7. HDU 4607.Park Visit-树的直径(BFS版)+结论公式(乱推公式)-备忘(加油!)

    Park Visit Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. Java工具类-格式化日期

    package common; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; p ...

  9. 制作启动U盘

    概述 将普通的u盘制作成启动u盘,用于引导安装操作系统. 材料: 普通U盘 需要有足够的存储空间,里面的内容请提前备份. 操作系统iso文件 PowerISO 商业软件,有试用期:用来制作启动u盘 正 ...

  10. Linux命令之ftp

    ftp [-pinegvd] [host] pftp [-inegvd] [host] 用户通过ftp这个程序来使用Internet上的标准文件传输协议(FTP).本程序允许用户向远端网站发送文件,或 ...