因为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. MyBatis 模糊查询 防止Sql注入

    #{xxx},使用的是PreparedStatement,会有类型转换,所以比较安全: ${xxx},使用字符串拼接,可以SQL注入: like查询不小心会有漏洞,正确写法如下:   Mysql:   ...

  2. 自动化运维之saltstack的使用安装

    SaltStack 简介 SaltStack是一个服务器基础架构集中化管理平台,具备配置管理.远程执行.监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块 ...

  3. 让你完全理解Base-64是怎么回事

    HTTP将BASE64-编码用于基本认证和摘要认证,在几种HTTP扩展中也使用了该编码. Base-64编码保证了二进制数据的安全 Base-64编码可以将任意一组字节转换为较长的常见文本字符序列,从 ...

  4. shell脚本学习(六)

    shell函数 注:现在是unix编程 实例: #!/bin/shdemon(){ echo "这是一个shell脚本"}demon 注: 调用是只写函数名没有() 函数的返回值 ...

  5. ZSTU OJ 4273 玩具

    枚举,二分,$RMQ$. 肯定是将连续一段中最大值免去花费,枚举起点之后,二分终点即可.可以证明单调性. #include<map> #include<set> #includ ...

  6. 最正确的React事件绑定方式

    参考这篇文章:Choosing the Best Approach for React Event Handlers 1.function.bind()方式 2.inline arrow functi ...

  7. 2. 创建一个简单的Maven项目

    ☞ 创建项目 选定一个目录,如E:\workspace\maven,新建的项目将放在这个目录. 运行CMD,切换到该目录. 执行mvn archetype:generate直到输出"Choo ...

  8. Spring MVC源码——Root WebApplicationContext

    目录 Spring MVC源码--Root WebApplicationContext 上下文层次结构 Root WebApplicationContext 初始化和销毁 ContextLoaderL ...

  9. 《深入浅出Nodejs》笔记——模块机制(2)

    前言 书上还有很大一部分讲了C/C++模块的编译过程.核心模块编写和C/C++扩展模块的内容,不过我对C++一窍不通因此没有仔细看,如果以后需要再自习看吧. 包与NPM 第三方模块中,模块和模块之间是 ...

  10. 2017腾讯OMG实习生面试总结

    2017腾讯OMG实习生面试总结 一面 一面有两个面试官,轮着来的,一共是一个半小时,中间等了10分钟左右.结合简历问了问项目,也考察了基础,手写了两道简单的算法题.问题包括: 第一个面试官 1.自我 ...