前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes-保障集群内节点和网络安全

Kubernetes-保障集群内节点和网络安全

作者头像
yaohong
发布2019-08-21 14:53:34
5550
发布2019-08-21 14:53:34
举报
文章被收录于专栏:姚红专栏

13.1.在pod中使用宿主节点的Linux命名空间

13.1.1.在pod中使用宿主节点的网络命名空间

  在pod的yaml文件中就设置spec.hostNetwork: true

   这个时候pod使用宿主机的网络,如果设置了端口,则使用宿主机的端口。

代码语言:javascript
复制
apiVersion: v1
kind: pod
metadata:
    name: pod-host-yaohong
spec:
    hostNetwork: true  //使用宿主节点的网络命名空间
    containers: 
    - image: luksa/kubia
      command: ["/bin/sleep", "9999"]

13.1.2.绑定宿主节点上的端口而不使用宿主节点的网络命名空间

  在pod的yaml文件中就设置spec.containers.ports字段来设置

   在ports字段中可以使用

  containerPorts设置通过pod 的ip访问的端口

  container.hostPort设置通过所在节点的端口访问

代码语言:javascript
复制
apiVersion: v1
kind: pod
metadata:
    name: kubia-hostport-yaohong
spec:
    containers: 
    - image: luksa/kubia
    - name: kubia
      ports:
      - containerport: 8080 //该容器通过pod IP访问该端口
        hostport: 9000  //该容器可以通过它所在节点9000端口访问
        protocol: Tcp

13.1.3.使用宿主节点的PID与IPC

   PID是进程ID,PPID是父进程ID

  在linux下的多个进程间的通信机制叫做IPC(Inter-Process Communication),它是多个进程之间相互沟通的一种方法。

代码语言:javascript
复制
apiVersion: v1
kind: pod
metadata:
    name: pod-with-host-pid-and-ipc-yaohong
spec:
    hostPID: true //你希望这个pod使用宿主节点的PID命名空间
    hostIPC: true //你希望pod使用宿主节点的IPC命名空间
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]

13.2.配置节点的安全上下文

13.2.1.使用指定用户运行容器

  查看某个pod运行的用户

代码语言:javascript
复制
$ kubectl -n kube-system exec coredns-7b8dbb87dd-6ll7z id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)

  容器的运行用户再DockerFile中指定,如果没有指定则为root

  指定pod的运行的用户方法如下

代码语言:javascript
复制
apiVersion: v1
kind: pod
metadata:
    name: pod-as-user
spec:
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]
      securityContext:
        runAsUser: 405   //你需要指定的用户ID,而不是用户名

13.2.2.阻止容器以root用户运行

  runAsNonRoot来设置

代码语言:javascript
复制
apiVersion: v1
kind: pod
metadata:
    name: pod-as-user
spec:
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]
      securityContext:
        runAsNonRoot: true   //这个容器只允许以非root用户运行

13.2.3.使用特权模式运行pod

  为了获得宿主机内核完整的权限,该pod需要在特权模式下运行。需要添加privileged参数为true。

代码语言:javascript
复制
apiVersion: v1
kind: pod
metadata:
    name: pod-as-privileged
spec:
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]
      securityContext:
        privileged: true   //这个容器将在特权模式下运行

13.2.4.为容器单独添加内核功能

代码语言:javascript
复制
apiVersion: v1
kind: pod
metadata:
    name: pod-as-capability
spec:
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]
      securityContext:
        capabilities:    //该参数用于pod添加或者禁用某项内核功能
          add:
          - SYS_TIME      //添加修改系统时间参数

13.2.5.在容器中禁止使用内核功能

代码语言:javascript
复制
apiVersion: v1
kind: pod
metadata:
    name: pod-as-capability
spec:
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]
      securityContext:
        capabilities:    //该参数用于pod添加或者禁用某项内核功能
          drop:
          - CHOWN      //禁用容器修改文件的所有者

13.2.6.阻止对容器根文件系统的写入

  securityContext.readyOnlyFilesystem设置为true来实现阻止对容器根文件系统的写入。

代码语言:javascript
复制
apiVersion: v1
kind: pod
metadata:
    name: pod-with-readonly-filesystem
spec:
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]
      securityContext:
         readyOnlyFilesystem: true  //这个容器的根文件系统不允许写入
      volumeMounts:
      - name: my-volume
        mountPath: /volume    //volume写入是允许的,因为这个目录挂载一个存储卷
        readOnly: false 

13.3.限制pod使用安全相关的特性

13.3.1.PodSecurityPolicy资源介绍

  PodSecurityPolicy是一种集群级别(无命名空间)的资源,它定义了用户能否在pod中使用各种安全相关的特性。

13.3.2.了解runAsUser、fsGroups和supplementalGroup策略

代码语言:javascript
复制
runAsUser:
  runle: MustRunAs
  ranges:
  - min: 2             //添加一个max=min的range,来指定一个ID为2的user
    max: 2
  fsGroup:
    rule: MustRunAs
    ranges:
    - min: 2
      max: 10         //添加多个区间id的限制,为2-10 或者20-30
    - min: 20
      max: 30 
  supplementalGroups:
    rule: MustRunAs
    ranges:
    - min: 2
      max: 10
    - min: 20
      max: 30

13.3.3.配置允许、默认添加、禁止使用的内核功能

  三个字段会影响容器的使用

  allowedCapabilities:指定容器可以添加的内核功能

  defaultAddCapabilities:为所有容器添加的内核功能

  requiredDropCapabilities:禁止容器中的内核功能

代码语言:javascript
复制
apiVersion: v1
kind: PodSecurityPolicy
spec:
  allowedCapabilities:
  - SYS_TIME                 //允许容器添加SYS_time功能
  defaultAddCapabilities:
  - CHOWN                    //为每个容器自动添加CHOWN功能
  requiredDropCapabilities:
  - SYS_ADMIN                //要求容器禁用SYS_ADMIN和SYS_MODULE功能

13.4.隔离pod网络

13.4.1.在一个命名空间中使用网络隔离

podSelector进行对一个命名空间下的pod进行隔离

代码语言:javascript
复制
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: postgres-netpolicy
spec:
  podSelector:         //这个策略确保了对具有app=databases标签的pod的访问安全性
    matchLabels:
      app: database
  ingress:
  - from:
    - podSelector:    //它只允许来自具有app=webserver标签的pod的访问
      matchLabels:
        app: webserver
    ports:
    - port: 5432      //允许对这个端口的访问

13.4.2.在 不同的kubernetes命名空间之间进行网络隔离

namespaceSelector进行对不同命名空间间进行网络隔离

代码语言:javascript
复制
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: postgres-netpolicy
spec:
  podSelector:         //这个策略确保了对具有app=databases标签的pod的访问安全性
    matchLabels:
      app: database
  ingress:
  - from:
    - namespaceSelector:    //只允许tenant: manning标签的命名空间中运行的pod进行互相访问
      matchLabels:
        tenant: manning   
    ports:
    - port: 5432      //允许对这个端口的访问

13.4.3.使用CIDR网络隔离

代码语言:javascript
复制
  ingress:
  - from:
    - ipBlock:
        cidr: 192.168.1.0/24    //指明允许访问的ip段

13.4.4.限制pod对外访问流量

  使用egress进行限制

代码语言:javascript
复制
spec:
  podSelector:         //这个策略确保了对具有app=databases标签的pod的访问安全性
    matchLabels:
      app: database
  egress:              //限制pod的出网流量
  - to:
    - podSelector:
        matchLables:   //database的pod只能与有app: webserver的pod进行通信
          app: webserver
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-08-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 13.1.在pod中使用宿主节点的Linux命名空间
    • 13.1.1.在pod中使用宿主节点的网络命名空间
      • 13.1.2.绑定宿主节点上的端口而不使用宿主节点的网络命名空间
        • 13.1.3.使用宿主节点的PID与IPC
        • 13.2.配置节点的安全上下文
          • 13.2.1.使用指定用户运行容器
            • 13.2.2.阻止容器以root用户运行
              • 13.2.3.使用特权模式运行pod
                • 13.2.4.为容器单独添加内核功能
                  • 13.2.5.在容器中禁止使用内核功能
                    • 13.2.6.阻止对容器根文件系统的写入
                    • 13.3.限制pod使用安全相关的特性
                      • 13.3.1.PodSecurityPolicy资源介绍
                        • 13.3.2.了解runAsUser、fsGroups和supplementalGroup策略
                          • 13.3.3.配置允许、默认添加、禁止使用的内核功能
                          • 13.4.隔离pod网络
                            • 13.4.1.在一个命名空间中使用网络隔离
                              • 13.4.2.在 不同的kubernetes命名空间之间进行网络隔离
                                • 13.4.3.使用CIDR网络隔离
                                  • 13.4.4.限制pod对外访问流量
                                  相关产品与服务
                                  容器服务
                                  腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                                  领券
                                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档