calico简介:

flannel实现的是网络通信,calico的特性是在pod之间的隔离。
通过BGP路由,但大规模端点的拓扑计算和收敛往往需要一定的时间和计算资源。
纯三层的转发,中间没有任何的NAT和overlay,转发效率最好。
Calico 仅依赖三层路由可达。Calico 较少的依赖性使它能适配所有 VM、Container、白盒或者混合环境场景。
https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises
calico是三层策略,点对点

1 安装calico

(1)wget https://docs.projectcalico.org/manifests/calico.yaml

(2)将安装插件需要的镜像上传至harbor仓库
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 禁止PIP工作模式:适用于互相访问的pod不在同一个网段中,跨网段访问的场景
  • 默认使用BGP工作模式:适用于互相访问的pod在同一个网段,适用于大型网络
    在这里插入图片描述

在这里插入图片描述

(3)将安装calico的插件上传至网络仓库

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(4)应用文件:kubectl apply -f calico.yaml

  • 查看命名空间kube-system的pod:kubectl -n kube-system get pod

在这里插入图片描述
(5)应用文件:kubectl apply -f nginx-svc.yml

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx
  ports:
 - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx  ## 标签为app:nginx
  template:
    metadata:
      labels:
        app: nginx  
    spec:
      containers:
      - name: nginx
        image: myapp:v2
  • 过滤标签为app的pod:kubectl get pod -L app

在这里插入图片描述

  • 查看服务信息:kubectl get svc

在这里插入图片描述

  • 测试:curl 10.110.6.5/hostname.html,可以访问本地的服务

在这里插入图片描述

2 限制访问指定服务

NetworkPolicy策略模型:控制某个namespace下的pod的网络出入站规则

在这里插入图片描述

(1)应用文件:kubectl apply -f nginx-policy.yml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-nginx
spec:
  podSelector:
    matchLabels:
      app: nginx
  • 过滤标签为app的pod:kubectl get pod -L app

在这里插入图片描述
(2)测试:无法访问nginx标签的服务
在这里插入图片描述

(3)查看网关策略:kubectl get networkpolicies.

在这里插入图片描述
(4)将策略输出到yaml文件:kubectl get networkpolicies. -o yaml

在这里插入图片描述
(5)测试

  • 创建pod:kubectl run nginx --image=myapp:v1
  • 过滤app标签的pod:
kubectl get pod -o wide -L app
  • 无法访问nginx标签的服务,其他标签的服务可以网文

在这里插入图片描述

  • 进入容器的交互式环境:kubectl attach demo -it,进入demo容器中,没有标签的服务可以访问,标签为app:nginx的服务无法访问

在这里插入图片描述

3 允许指定pod访问服务

(1)应用文件:kubectl apply -f access-demo.yml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: access-nginx
spec:
  podSelector:
    matchLabels:
      app: nginx
  ingress:
 - from: ## 允许来源于app: demo标签的服务
      - podSelector:
          matchLabels:
            app: demo
  • 查看策略:kubectl get networkpolicies.

在这里插入图片描述
(2)测试

  • 查看pod的详细信息:kubectl get pod -o wide -L app,外部无法访问容器内的服务

在这里插入图片描述

  • 进入demo容器的交互式环境:kubectl attach demo -it

在这里插入图片描述

  • 创建命名空间:kubectl create namespace demo
  • 查看命名空间:kubectl get ns
  • 运行指定命名空间的容器:
kubectl run demo1 --image=busyboxplus -it -n demo
kubectl run demo2 --image=busyboxplus -it -n demo

查看指定命名空间pod的标签: kubectl -n demo get pod --show-labels

在这里插入图片描述

  • 查看标签为run命名空间为demo的pod的详细信息:kubectl -n demo get pod -L run -o wide
  • 进入demo容器的交互式环境:kubectl attach demo -it

在这里插入图片描述

  • 进入demo容器的交互式环境: kubectl attach demo1 -it -n demo

在这里插入图片描述

应用文件:

kubectl apply -f deny-pod.yml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
  namespace: demo
spec:
  podSelector: {}
  • 查看策略:kubectl get networkpolicies. -n demo

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4 禁止其他 namespace 访问服务

(1)应用文件: kubectl apply -f deny-ns.yml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-namespace
spec:
  podSelector:
    matchLabels:
  ingress:
 - from: ## 禁止所有从其他命名空间的pod的访问
    - podSelector: {}
  • 过滤标签为run的pod的详细信息:
kubectl -n demo get pod -L run -o wide

在这里插入图片描述

  • 查看pod的详细信息:kubectl get pod -o wide

在这里插入图片描述
(2)测试
在这里插入图片描述

5 只允许指定namespace访问服务

(1)应用文件: kubectl apply -f access-ns.yml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: access-namespace
spec:
  podSelector:
    matchLabels:
      run: nginx
  ingress:
 - from:
    - namespaceSelector: ## 允许从命名空间的标签为role: prod的pod访问服务
        matchLabels:
          role: prod
  • 创建命名空间test:kubectl create namespace test
  • 查看指定标签的服务:kubectl label ns test role=prod
  • 查看命名空间的标签:kubectl get ns --show-labels

在这里插入图片描述

  • 运行容器:kubectl run demo3 --image=busyboxplus -it -n test
  • 查看命名空间为test的pod的详细信息:kubectl get pod -n test --show-labels -o wide
  • 查看标签以及pod的详细信息:kubectl get pod --show-labels -o wide

(2)测试:只有命名空间为test的pod才能访问其他服务

在这里插入图片描述
在这里插入图片描述

6 允许外网访问服务

从外部访问 Service 的第二种方式,适用于公有云上的 Kubernetes 服务。这时候,你可以指定一个 LoadBalancer 类型的 Service。

(1)应用文件:kubectl apply -f nginx-svc.yml

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx
  ports:
 - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: myapp:v2
  • 在service提交后,Kubernetes就会调用 CloudProvider 在公有云上为你创建一个负载均衡服务,并且把被代理的Pod 的 IP地址配置给负载均衡服务做后端

  • 查看服务的信息:kubectl get svc

在这里插入图片描述

(2)应用配置文件:kubectl apply -f ingress.yaml

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-demo
spec:
  tls:
    - hosts:
      - www1.westos.org
      secretName: tls-secret
  rules:
  - host: www1.westos.org
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-svc
          servicePort: 80

在这里插入图片描述

  • 查看指定命名空间服务的信息:
kubectl -n ingress-nginx get svc

在这里插入图片描述

(3)测试

  • 编辑测试虚拟机的dns解析文件

在这里插入图片描述

  • 通过域名,无法访问:curl www1.westos.org

在这里插入图片描述

  • 不能访问的原因

在这里插入图片描述

  • 将策略导出为yaml文件:kubectl get networkpolicies. -o yaml

在这里插入图片描述

  • 应用文件:kubectl apply -f access-ex.yml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: web-allow-external
spec:
  podSelector:
    matchLabels:
      app: nginx
  ingress:
 - ports:
    - port: 80  ## 80端口的服务可以进入
    from: []
  • 可以通过域名访问

在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐