开发者社区> csome> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

给容器服务的Kubernetes集群部署network policy支持

简介: 随着使用容器部署微服务的流行,容器平台上的服务间有复杂的调用关系。kubernetes为了满足服务间调用的访问控制,在1.3的版本中便引入了Network Policy,通过它可以实现通过标签方便的去定义访问的策略 。
+关注继续查看


目前容器服务已经通过Terway网络插件支持了Network Policy,只需要创建集群时选择Terway网络插件就行了: https://help.aliyun.com/document_detail/97467.html

下面是之前通过canal的方式:

随着使用容器部署微服务的流行,容器平台上的服务间有复杂的调用关系。kubernetes为了满足服务间调用的访问控制,在1.3的版本中便引入了Network Policy,通过它可以实现通过标签方便的去定义访问的策略 。

阿里云容器服务在Kubernetes的Flannel网络插件的基础上,配置自研的阿里云VPC驱动为容器提供了高性能的网络方案。

但目前版本的Flannel并未实现Kubernetes的Network Policy,为了让Flannel插件能够满足Network Policy的要求,Calico团队结合Calico中的Felix组件和Flannel驱动构建了Canal驱动,我们本文中就基于Canal在阿里云上部署Network Policy支持,同时也不会造成不必要的性能损失。

在阿里云上创建kubernetes集群

通过阿里云容器服务的控制台可以一键创建出一个云上的Kubernetes集群,如图:

创建好了Kubernetes集群后,我们通过容器服务控制台可以获取到kubectl的连接方式,具体方法可以参考“通过 kubectl 连接 Kubernetes 集群

后续我们的操作都将使用kubectl进行。

卸载默认的flannel网络组件

首先,因为集群中会有正在使用flannel网络的应用,所以我们首先需要把集群中使用flannel网络的应用停止掉,然后再卸载flannel网络组建,这些应用包括:

  • 用户自己部署的应用
  • kubernetes中再flannel网络中的系统应用,包括kubedns, default-http-backend, nginx-ingress-controller, kubernetes-dashboard, heapster, monitoring-influxdb, tiller-deploy

由于kubernetes没有停止应用的选项,只有删除和创建,我们为了保留应用的配置,可以采用把应用的replicas调整成0的方式使应用的实例都“停止”,我们以kubedns为例:

[root@iZbp126bomo449eksjknkeZ ~]# kubectl scale deploy kube-dns --replicas=0 -n kube-system
deployment "kube-dns" scaled
[root@iZbp126bomo449eksjknkeZ ~]# kubectl get deploy kube-dns -n kube-system
NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kube-dns   0         0         0            0           4h

这样就将kube-dns “停止”了,同样的方法可以用于别的系统服务和自己的应用,在部署完成后我们还可以再通过scale的方式将这些应用“启动”回来。

应用都停止完成后,我们将卸载flannel的网络组件,卸载命令如下:

kubectl delete DaemonSet kube-flannel-ds -n kube-system 
kubectl delete ConfigMap kube-flannel-cfg -n kube-system
kubectl delete ServiceAccount flannel -n kube-system
kubectl delete ClusterRoleBinding flannel
kubectl delete ClusterRole flannel

安装支持network policy的Canal网络组件

卸载完默认的flannel的网络组件后,我们来安装支持Network Policy的Canal网络组件,通过kubectl安装Canal的yaml文件:

[root@iZbp126bomo449eksjknkeZ ~]# curl -O http://acs-canal.oss-cn-hangzhou.aliyuncs.com/1.8-aliyun.yaml
[root@iZbp126bomo449eksjknkeZ ~]# vim 1.8-aliyun.yaml #修改其中的CALICO_IPV4POOL_CIDR的环境变量的网段为集群的网段,修改完保存
[root@iZbp126bomo449eksjknkeZ ~]# kubectl apply -f 1.8-aliyun.yaml #安装canal的网络组件

然后查看Canal的状态全都是READY后,说明Canal网络组件部署完成:

[root@iZbp126bomo449eksjknkeZ ~]# kubectl get pod -n kube-system -l k8s-app=canal
NAME          READY     STATUS    RESTARTS   AGE
canal-5tdht   3/3       Running   0          2h
canal-6kxkx   3/3       Running   0          2h
canal-h7gnp   3/3       Running   0          2h
canal-j9lgc   3/3       Running   0          2h
canal-xnwpb   3/3       Running   0          2h

在部署完成后别忘了将之前“停止”的应用再kubectl scale回来呀。

验证network policy的支持

我们使用Kubernetes官方文档中的Policy的实例来演示下:

首先部署并暴露一个nginx服务

我们通过kubectl run创建出一个nginx的deploy,然后用kubectl expose通过service暴露nginx服务。

[root@iZbp126bomo449eksjknkeZ ~]# kubectl run nginx --image=nginx --replicas=2
deployment "nginx" created
[root@iZbp126bomo449eksjknkeZ ~]# kubectl expose deployment nginx --port=80
service "nginx" exposed

等待他们部署完成:

[root@iZbp126bomo449eksjknkeZ ~]# kubectl get svc,pod -l run=nginx
NAME        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
svc/nginx   ClusterIP   172.21.0.225   <none>        80/TCP    59s

NAME                       READY     STATUS    RESTARTS   AGE
po/nginx-7c87f569d-dhvmw   1/1       Running   0          1m
po/nginx-7c87f569d-xtdxb   1/1       Running   0          1m

在别的容器中测试到nginx服务的访问:

我们通过kubectl run创建出另外一个pod来访问nginx的服务:

[root@iZbp126bomo449eksjknkeZ ~]# kubectl run busybox --rm -ti --image=busybox /bin/sh
If you don't see a command prompt, try pressing enter.
/ # wget --spider --timeout=1 nginx
Connecting to nginx (172.21.0.225:80)
/ #

发现默认情况下是可以访问通的。

通过Network Policy限制对nginx服务的访问

创建一个NetworkPolicy的配置规则,规则中我们通过podSelector描述只有服务access: "true"的label的Pod才能访问的到run:nginx的Pod。

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: access-nginx
spec:
  podSelector:
    matchLabels:
      run: nginx
  ingress:
  - from:
    - podSelector:
        matchLabels:
          access: "true"
 ```


通过`kubectl create`使NetworkPolicy配置生效:

[root@iZbp126bomo449eksjknkeZ ~]# kubectl create -f policy.yaml networkpolicy 

"access-nginx" created

测试当没定义access的label的Pod去访问nginx服务

[root@iZbp126bomo449eksjknkeZ ~]# kubectl run busybox --rm -ti --image=busybox /bin/sh
If you don't see a command prompt, try pressing enter.
/ # wget --spider --timeout=1 nginx
Connecting to nginx (172.21.0.225:80)
wget: download timed out
/ #

发现访问超时了

测试定义了access的label的Pod去访问nginx服务

[root@iZbp126bomo449eksjknkeZ ~]# kubectl run busybox --rm -ti --labels="access=true" --image=busybox /bin/sh
If you don't see a command prompt, try pressing enter.
/ # wget --spider --timeout=1 nginx
Connecting to nginx (172.21.0.225:80)
/ #

是可以访问的,满足了Kubernetes的NetworkPolicy的定义。

阿里云容器服务提供了托管的Kubernetes集群支持,了解更多阿里云容器服务内容, 请访问https://www.aliyun.com/product/containerservice

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
在阿里云容器服务Kubernetes上使用分批发布
前言 Kubernetes作为非常流行的容器编排引擎已经逐渐成为容器交付的标准,为了解决标准化交付的问题,Kubernetes抽象了多种概念来代表不同的交付内容。 例如,不同应用场景的服务载体可以通过Deployment、DaemonSet、StatefulSet、CronJob来抽象;网络接入层可以通过Service进行抽象;服务配置可以通过ConfigMap或者Secret进行抽象等等。
2144 0
使用 C# 开发 Kubernetes 组件,获取集群资源信息
使用 C# 开发 Kubernetes 组件,获取集群资源信息
65 0
KUBERNETES02_集群安装逻辑、前置环境、搭建一主两从、部署dashboard访问页面(三)
KUBERNETES02_集群安装逻辑、前置环境、搭建一主两从、部署dashboard访问页面(三)
43 0
KUBERNETES02_集群安装逻辑、前置环境、搭建一主两从、部署dashboard访问页面(一)
KUBERNETES02_集群安装逻辑、前置环境、搭建一主两从、部署dashboard访问页面(一)
60 0
KUBERNETES02_集群安装逻辑、前置环境、搭建一主两从、部署dashboard访问页面(二)
KUBERNETES02_集群安装逻辑、前置环境、搭建一主两从、部署dashboard访问页面(二)
42 0
Kubernetes集群升级指南:从理论到实践
摘要:集群升级是Kubernetes集群生命周期中最为重要的一环,也是也是众多使用者最为谨慎对待的操作之一。为了更好地理解集群升级这件事情的内涵外延,我们首先会对集群升级的必要性和难点进行阐述。随后我们会对集群升级前必须要做的前置检查进行逐一讲解。接下来我们会对两种常见的升级方式进行展开介绍。最后我们对集群升级的三个步骤进行讲解,帮助读者从理论走入实践。   升级的必要性&a
324 0
Kubernetes集群部署关键知识总结
  Kubernetes集群部署需要安装的组件东西很多,过程复杂,对服务器环境要求很苛刻,最好是能连外网的环境下安装,有些组件还需要连google服务器下载,这一点一般很难满足,因此最好是能提前下载好准备的就尽量下载好。
2632 0
Kubernetes 集群资源的那些事
大多数时候,我们在跟 K8S 玩耍的时候,主要目的就是:“把 XXX 打个镜像,在集群上跑起来 ——— 诶快看,真的跑起来了嘿!”。 Kubernetes 和 Docker 的缺省配置,就能够帮我们省却很多麻烦。
1375 0
Kubernetes集群中的高性能网络策略
自从7月份发布Kubernetes 1.3以来,用户已经能够在其集群中定义和实施网络策略。这些策略是防火墙规则,用于指定允许流入和流出的数据类型。如果需要,Kubernetes可以阻止所有未明确允许的流量。
1311 0
微服务学习笔记四 Spring Cloud RestTemplate
微服务学习笔记四 Spring Cloud RestTemplate
10 0
+关注
csome
阿里云容器服务的高级研发工程师,花名溪恒,专注于容器底层技术和网络
24
文章
34
问答
来源圈子
更多
容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级 Kubernetes 容器化应用的全生命周期管理。容器服务 Kubernetes 版简化集群的搭建和扩容等工作,整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳的 Kubernetes 容器化应用运行环境。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载