K8s------(八)网络插件Calico
https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremisescalico是三层策略,点对点1 安装calico(1)wget https://docs.projectcalico.org/manifests/calico.yaml(2)将安装插件需要的镜像上传至harbor仓库禁止P
K8s---网络插件Calico
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: []
- 可以通过域名访问
更多推荐
所有评论(0)