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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 随着使用容器部署微服务的流行,容器平台上的服务间有复杂的调用关系。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

相关实践学习
巧用云服务器ECS制作节日贺卡
本场景带您体验如何在一台CentOS 7操作系统的ECS实例上,通过搭建web服务器,上传源码到web容器,制作节日贺卡网页。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
4天前
|
Kubernetes Docker 容器
容器运行时Containerd k8s
容器运行时Containerd k8s
17 2
|
9天前
|
Kubernetes Cloud Native 持续交付
云原生之旅:Docker容器化与Kubernetes集群管理
【9月更文挑战第33天】在数字化转型的浪潮中,云原生技术如同一艘航船,带领企业乘风破浪。本篇文章将作为你的航海指南,从Docker容器化的基础讲起,直至Kubernetes集群的高级管理,我们将一起探索云原生的奥秘。你将学习到如何封装应用、实现环境隔离,以及如何在Kubernetes集群中部署、监控和扩展你的服务。让我们启航,驶向灵活、可伸缩的云原生未来。
|
12天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker与Kubernetes入门
【9月更文挑战第30天】在云计算的浪潮中,云原生技术正以前所未有的速度重塑着软件开发和运维领域。本文将通过深入浅出的方式,带你了解云原生的核心组件——Docker容器和Kubernetes集群,并探索它们如何助力现代应用的构建、部署和管理。从Docker的基本命令到Kubernetes的资源调度,我们将一起开启云原生技术的奇妙之旅。
|
16天前
|
Kubernetes API Docker
跟着iLogtail学习容器运行时与K8s下日志采集方案
iLogtail 作为开源可观测数据采集器,对 Kubernetes 环境下日志采集有着非常好的支持,本文跟随 iLogtail 的脚步,了解容器运行时与 K8s 下日志数据采集原理。
|
13天前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
阿里云ACK容器服务生产级可观测体系建设实践
|
1天前
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
13 0
|
2天前
|
Kubernetes 应用服务中间件 Linux
多Master节点的k8s集群部署
多Master节点的k8s集群部署
|
6天前
|
Kubernetes 应用服务中间件 nginx
k8s学习--k8s集群使用容器镜像仓库Harbor
本文介绍了在CentOS 7.9环境下部署Harbor容器镜像仓库,并将其集成到Kubernetes集群的过程。环境中包含一台Master节点和两台Node节点,均已部署好K8s集群。首先详细讲述了在Harbor节点上安装Docker和docker-compose,接着通过下载Harbor离线安装包并配置相关参数完成Harbor的部署。随后介绍了如何通过secret和serviceaccount两种方式让Kubernetes集群使用Harbor作为镜像仓库,包括创建secret、配置节点、上传镜像以及创建Pod等步骤。最后验证了Pod能否成功从Harbor拉取镜像运行。
|
13天前
|
Kubernetes Cloud Native Docker
云原生之旅:深入理解容器化与Kubernetes
【9月更文挑战第29天】在云计算的海洋中,云原生技术如同一艘航船带领着企业乘风破浪。本文将作为你的航海图,带你探索云原生的核心——容器化和Kubernetes。我们将从容器的基本概念出发,逐步深入到如何在Kubernetes集群中部署应用,最后探讨这些技术如何助力现代软件开发。文章旨在为读者提供清晰的云原生入门知识,并展示实际操作的步骤,让你能够自信地启航。
|
15天前
|
存储 Kubernetes Docker
深入探索容器化技术:Docker 实战与 Kubernetes 管理
深入探索容器化技术:Docker 实战与 Kubernetes 管理
33 0

相关产品

  • 容器计算服务
  • 容器服务Kubernetes版