当前位置: 代码迷 >> 综合 >> K8S 配置管理 Kubernetes集群安全机制
  详细解决方案

K8S 配置管理 Kubernetes集群安全机制

热度:20   发布时间:2023-12-15 10:26:40.0

文章目录

  • 1.Secret
    • 1.1变量形式挂载到Pod
    • 1.2数据卷形式挂载
  • 2.ConfigMap
    • 2.1 创建配置文件
    • 2.2 创建ConfigMap
    • 2.3 Volume数据卷形式挂载
    • 2.4 以变量的形式挂载Pod
  • 3.Kubernetes集群安全机制
    • RBAC介绍
    • RBAC实现鉴权

1.Secret

Secret的主要作用就是加密数据,然后存在etcd里面,让Pod容器以挂载Volume方式进行访问

场景:如用户名 和 密码进行加密,凭证

一般场景的是对某个字符串进行base64编码 进行加密

echo -n 'admin' | base64

1.1变量形式挂载到Pod

创建secret加密数据的yaml文件 secret.yaml在这里插入图片描述
然后使用下面命令创建一个pod

kubectl create -f secret.yaml

通过get命令查看

kubectl get pods

在这里插入图片描述
然后我们通过下面的命令,进入到我们的容器内部

kubectl exec -it mypod bash
然后我们就可以输出我们的值,这就是以变量的形式挂载到我们的容器中

输出用户

echo $SECRET_USERNAME

输出密码

echo $SECRET_PASSWORD

在这里插入图片描述
最后如果我们要删除这个Pod,就可以使用这个命令

kubectl delete -f secret-val.yaml
kubectl delete secret -all

删除所有pod

kubectl delete	Pod -all

1.2数据卷形式挂载

首先我们创建一个 secret-val.yaml 文件在这里插入图片描述
然后创建我们的 Pod

# 根据配置创建容器
kubectl apply -f secret-val.yaml
# 进入容器
kubectl exec -it mypod bash
# 查看
ls /etc/foo

在这里插入图片描述

2.ConfigMap

ConfigMap作用是存储不加密的数据到etcd中,让Pod以变量或数据卷Volume挂载到容器中

应用场景:配置文件

2.1 创建配置文件

首先我们需要创建一个配置文件 redis.properties

redis.port=127.0.0.1
redis.port=6379
redis.password=123456

2.2 创建ConfigMap

我们使用命令创建configmap

kubectl create configmap redis-config --from-file=redis.properties

查看ConfigMap信息

kubectl get cm

然后查看详细信息

kubectl describe cm redis-config

在这里插入图片描述

2.3 Volume数据卷形式挂载

首先我们需要创建一个 cm.yaml
在这里插入图片描述
然后使用该yaml创建我们的pod

# 创建
kubectl apply -f cm.yaml
# 查看
kubectl get pods

在这里插入图片描述
最后我们通过命令就可以查看结果输出了

kubectl logs mypod

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

2.4 以变量的形式挂载Pod

首先我们也有一个 myconfig.yaml文件,声明变量信息,然后以configmap创建在这里插入图片描述

然后我们就可以创建我们的配置文件

# 创建pod
kubectl apply -f myconfig.yaml
# 获取
kubectl get cm

在这里插入图片描述
然后我们创建完该pod后,我们就需要在创建一个 config-var.yaml 来使用我们的配置信息在这里插入图片描述
最后我们查看输出

kubectl logs mypod

在这里插入图片描述

3.Kubernetes集群安全机制

当我们访问K8S集群时,需要经过三个步骤完成具体操作

  • 认证
  • 鉴权【授权】
  • 准入控制

进行访问的时候,都需要经过 apiserver, apiserver做统一协调,比如门卫

  • 访问过程中,需要证书、token、或者用户名和密码
  • 如果访问pod需要serviceAccount

在这里插入图片描述

认证
对外不暴露8080端口,只能内部访问,对外使用的端口6443

客户端身份认证常用方式

  • https证书认证,基于ca证书
  • http token认证,通过token来识别用户
  • http基本认证,用户名 + 密码认证

鉴权

  • 基于RBAC进行鉴权操作

  • 基于角色访问控制

准入控制
就是准入控制器的列表,如果列表有请求内容就通过,没有的话 就拒绝

RBAC介绍

基于角色的访问控制,为某个角色设置访问内容,然后用户分配该角色后,就拥有该角色的访问权限在这里插入图片描述
k8s中有默认的几个角色

  • role:特定命名空间访问权限
  • ClusterRole:所有命名空间的访问权限

角色绑定

  • roleBinding:角色绑定到主体
  • ClusterRoleBinding:集群角色绑定到主体

主体

  • user:用户
  • group:用户组
  • serviceAccount:服务账号

RBAC实现鉴权

创建命名空间
我们可以首先查看已经存在的命名空间

kubectl get namespace

在这里插入图片描述
然后我们创建一个自己的命名空间 roledemo

kubectl create ns roledemo

命名空间创建Pod
为什么要创建命名空间?因为如果不创建命名空间的话,默认是在default下

kubectl run nginx --image=nginx -n roledemo

创建角色
我们通过 rbac-role.yaml进行创建
在这里插入图片描述
tip:这个角色只对pod 有 get、list权限

然后通过 yaml创建我们的role

# 创建
kubectl apply -f rbac-role.yaml
# 查看
kubectl get role -n roledemo

在这里插入图片描述
创建角色绑定
我们还是通过 role-rolebinding.yaml 的方式,来创建我们的角色绑定
在这里插入图片描述
然后创建我们的角色绑定

# 创建角色绑定
kubectl apply -f rbac-rolebinding.yaml
# 查看角色绑定
kubectl get role, rolebinding -n roledemo

在这里插入图片描述
使用证书识别身份
我们首先得有一个 rbac-user.sh 证书脚本
在这里插入图片描述
在这里插入图片描述
这里包含了很多证书文件,在TSL目录下,需要复制过来

通过下面命令执行我们的脚本

./rbac-user.sh
最后我们进行测试

# 用get命令查看 pod 【有权限】
kubectl get pods -n roledemo
# 用get命令查看svc 【没权限】
kubectl get svc -n roledmeo

在这里插入图片描述