努力挣扎的生活 努力挣扎的生活
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 运维基础
  • 监控
  • 日志系统
  • gitlab安装
  • jenkins安装和管理
  • Jenkins工具集成
  • pipeline流水线
  • Dcoker
  • Kubernetes
  • Nexus
  • Rancher
  • Prometheus
  • ELK(EFK)
  • 虚拟化
  • Mysql
  • PostgreSQL
  • Redis
  • MongoDB
  • clickhouse
关于
  • 分类
  • 标签
  • 归档
  • 收藏
  • 更多
GitHub (opens new window)

yangfk

瑟瑟发抖的小运维
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 运维基础
  • 监控
  • 日志系统
  • gitlab安装
  • jenkins安装和管理
  • Jenkins工具集成
  • pipeline流水线
  • Dcoker
  • Kubernetes
  • Nexus
  • Rancher
  • Prometheus
  • ELK(EFK)
  • 虚拟化
  • Mysql
  • PostgreSQL
  • Redis
  • MongoDB
  • clickhouse
关于
  • 分类
  • 标签
  • 归档
  • 收藏
  • 更多
GitHub (opens new window)
  • Docker

  • Kubernetes

    • K8S常见组件记录
    • 安装DNS服务(bind-9)
    • 私有仓库harbor部署
    • 证书签发环境CFSSL
    • 一步步部署k8s组件(上)
    • 一步步部署k8s组件(中)
    • 一步步部署k8s组件(下)
    • kubelet常用命令
    • K8s的GUI资源管理之仪表板
    • k8s部署jenkins
    • k8s持久存储StorageClass
    • k8s之Volume类型emptyDir和hostPath
    • 深入了解Deployment
    • k8s之meric-server(HPA环境)
    • k8s-deployment常见参数说明
    • rke部署k8s高可用集群
    • K8S之安全机制
    • k8s网络策略
      • 网络策略
        • 创建网络策略NetworkPolicy
        • pod的流量出与入(namespace:default)
        • 允许某些labels的pod网络
        • 允许某个namespace访问
        • NetworkPolicy限制端口与协议
        • 默认dns 策略 ClusterFirst
    • kubeadm安装k8s(版本1.26.0)
    • kubeadm证书替换
    • Pod探针
  • Nexus

  • Rancher

  • Prometheus

  • ELK

  • 虚拟化

//
  • 云计算虚拟化
  • Kubernetes
yangfk
2022-09-12

k8s网络策略

//

# 网络策略

K8S版本:v1.19.8,kubectl版本:v1.22.9

在默认情况下,K8s集群的网络没做任何限制,集群中的所有pod都是互通的,在某些情况下,是不允许所有项目的环境网络都是互通的

K8s的网络插件 (opens new window)有很多,如flannel,Calico,Canal,但不是所有的都支持Network Policy,如flannel就不支持( 只有选择支持网络策略的网络解决方案,否则创建也没有任何效果)

Kubernetes网络策略官网说明 (opens new window)

# 创建网络策略NetworkPolicy

# pod的流量出与入(namespace:default)

默认所有pod是互通的,创建NetworkPolicy 只会影响当前命名空间

  • A)不能进,出
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: default-deny
  namespace: default #不写默认default
spec:
  podSelector: {}
  policyTypes:
  - Ingress #拒绝入
  - Egress #拒绝出
1
2
3
4
5
6
7
8
9
10
  • B)能进,不能出

内部无法访问外部网络,其他命名空间能访问default 空间的pod网络,

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: default-deny
  namespace: default
spec:
  podSelector:
    matchLabels: {}
  ingress: #允许进
  - {}
  policyTypes:
  - Ingress
  - Egress
1
2
3
4
5
6
7
8
9
10
11
12
13

# 允许某些labels的pod网络

  • C)同一命名空间里,允许"app: nginx-test" 标签的可以访问,(默认A规则存在)
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-pod-nginx-test
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: nginx-test
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: nginx-test
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: nginx-test
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
podSelector egress/podSelector ingress/podSelector 说明
app: pod1 app: pod2 app: pod2 pod1 的网络可以去pod2,同时允许pod2网络进来
app: pod2 app: pod1 app: pod1 pod2 的网络可以去pod1,同时允许pod1网络进来

可能你会想这个表格是什么意思,当只存在一条规则的时候,网络只是单向的(默认创建A规则所有都拒绝,比如只存在第一条,pod1能连接pod2,但pod2默认规则无法出),而不是pod之间互通,或者创建一条类似C一样的规则,pod标签一样

# 允许某个namespace访问

default默认拒绝所有(A规则),devtest无任何规则,目的:让devtest里面的pod标签为"nginx-test2"可以访问

  • 创建一个带labels 的命名空间devtest
apiVersion: v1
kind: Namespace
metadata:
  labels:
    ns: devtest
  name: devtest
1
2
3
4
5
6
  • D)注意这里的from 是一个元素,default命名空间里面携带"nginx-test2"标签的pod ,能够访问命名空间 devtest 里,携带标签 nginx-test2 的pod,同时允许访问进来
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-ns-devtest-nginx-test2
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: nginx-test2
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          ns: devtest
      podSelector:
        matchLabels:
          app: nginx-test2
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          ns: devtest
      podSelector:
        matchLabels:
          app: nginx-test2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  • E)注意这里的from 是两个元素,允许来自本地命名空间(这里是default)中标有 "nginx-test2" 的 Pod 的连接,或 来自任何命名空间中标有 "ns: devtest"的任何 Pod 的连接
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-ns-devtest-nginx-test2
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: nginx-test2
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          ns: devtest
    - podSelector:
        matchLabels:
          app: nginx-test2
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          ns: devtest
    - podSelector:
        matchLabels:
          app: nginx-test2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# NetworkPolicy限制端口与协议

  • F)端口与IP限制

egress: 允许pod标签为 "nginx-test2" 访问192.168.5.0/24 网段的IP,且只有3306的端口协议为TCP放开

ingress: 允许命名空间携带标签为"ns: devtest",且pod标签为 "nginx-test" 访问命名空间为default POD标签为 "nginx-test2"的pod 的端口80 且协议为TCP

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-ns-devtest-nginx-test2
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: nginx-test2
  egress:
  - to:
    - ipBlock:
        cidr: 192.168.5.0/24
    ports:
    - protocol: TCP
      port: 3306

  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          ns: devtest
      podSelector:
        matchLabels:
          app: nginx-test
    ports:
    - protocol: TCP
      port: 80
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

特性状态: Kubernetes v1.25 版本 还支持 NetworkPolicy.spec.ingress.ports.endPort (1:endPort 字段必须等于或者大于 port 字段的值。2:只有在定义了 port 时才能定义 endPort。3:都是数字)

相信你看完所有的上面所有例子,对NetworkPolicy网络策略基本都熟悉了

# 默认dns 策略 ClusterFirst

kind: Pod
spec:
  dnsPolicy: ClusterFirst
1
2
3

新创建pod 查看 /etc/resolv.conf

root@nginx-dp-75754b4785-867sx:/# cat /etc/resolv.conf
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.96.0.10
  • 容器service内部dns
apiVersion: v1
kind: Service
metadata:
  name: nginx-web
  labels:
    app: web
spec:
  selector:
    app: web
  ports:
  - name: web
    port: 88
    targetPort: 80
---

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-dp
  name: nginx-dp
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: h5
      dnsPolicy: ClusterFirst
      nodeSelector:
        env: test
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

Service_Name(svc名).Namespces_Name(空间名).svc.cluster.local:Service_Port(svc端口)

curl nginx-web.default.svc.cluster.local:88

dp_dns

//
点击 -->> 给博主买咖啡 (opens new window)
上次更新: 2022/12/19, 17:57:33
K8S之安全机制
kubeadm安装k8s(版本1.26.0)

← K8S之安全机制 kubeadm安装k8s(版本1.26.0)→

最近更新
01
Pod探针
12-20
02
kubeadm证书替换
12-20
03
kubeadm安装k8s(版本1.26.0)
12-16
更多文章>
Theme by Vdoing | Copyright © 2019-2023 yangfk | 湘ICP备2021014415号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×
//