38-44-k8s-配置管理-安全机制-ingress-helm

7 篇文章 0 订阅

38-k8s-配置管理-安全机制-ingress-helm:

Kubernetes配置管理

1、Secret

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

场景:用户名和密码进行加密

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

echo -n ‘admin’ | base64

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IaFerD0x-1670132802272)(png/image-20220327161624109.png)]

1、创建secret加密数据
  • 创建secret加密数据的yaml文件 secret.yaml

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    data:
      username: YWRtaW4=
      password: MWYyZDFlMmU2N2Rm
    

然后使用下面命令创建一个pod

kubectl create -f secret.yaml

通过get命令查看

kubectl get pods

kubectl get secret

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1IKbW7sa-1670132802273)(png/image-20220327162645301.png)]

2、变量形式挂载到Pod

创建secret-val.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password

kubectl apply -f secret-val.yaml

kubectl get pods

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xHiIS0PZ-1670132802274)(png/image-20220327163106378.png)]

然后我们通过下面的命令,进入到我们的容器内部

kubectl exec -it mypod bash

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gmhc4rft-1670132802275)(png/image-20220327163301500.png)]

最后如果我们要删除这个Pod,就可以使用这个命令

kubectl delete -f secret-val.yaml

3、以数据卷形式挂载

创建secret-vol.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret

根据配置创建容器 kubectl apply -f secret-val.yaml

进入容器 kubectl exec -it mypod bash

查看 ls /etc/foo

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JLU1gQqY-1670132802276)(png/image-20220327164444283.png)]

如果需要删除

kubectl delete secret --all

kubectl delete -f secret-vol.yaml

2、ConfigMap

ConfigMap作用是存储不加密的数据到etcd中,让Pod以变量或数据卷Volume挂载到容器中,应用场景:配置文件

1、创建配置文件

首先创建一个配置文件 redis.properties

redis.host=127.0.0.1
redis.port=6379
redis.password=123456
2、创建ConfigMap

我们使用命令创建configmap

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

然后查看详细信息

kubectl get cm
kubectl describe cm redis-config
3、Volume数据卷形式挂载

创建一个 cm.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh","-c","cat /etc/config/redis.properties" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: redis-config
  restartPolicy: Never

然后使用该yaml创建我们的pod

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pAUraU1f-1670132802276)(png/image-20220327165903987.png)]

4、以变量的形式挂载Pod

首先我们也有一个 myconfig.yaml文件,声明变量信息,然后以configmap创建

apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfig
  namespace: default
data:
  special.level: info
  special.type: hello

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

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

创建config-var.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: busybox
      image: busybox
      command: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ]
      env:
        - name: LEVEL
          valueFrom:
            configMapKeyRef:
              name: myconfig
              key: special.level
        - name: TYPE
          valueFrom:
            configMapKeyRef:
              name: myconfig
              key: special.type
  restartPolicy: Never

kubectl apply -f config-var.yaml

kubectl logs mypod

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fTc6XqcO-1670132802277)(png/image-20220327171319986.png)]

Kubernetes集群安全机制

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

认证 ——》 鉴权【授权】——》 准入控制

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-La8LKXy9-1670132802278)(png/image-20220328193950154.png)]

1、认证

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

客户端身份认证常用方式

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

2、鉴权

基于RBAC进行鉴权操作

基于角色访问控制

3、准入控制

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

RBAC介绍

基于角色的访问控制,为某个角色设置访问内容,然后用户分配该角色后,就拥有该角色的访问权限

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dQ0nBBRe-1670132802279)(png/image-20220328194224653.png)]

k8s中有默认的几个角色

1、role:特定命名空间访问权限

2、ClusterRole:所有命名空间的访问权限

角色绑定

1、roleBinding:角色绑定到主体

2、ClusterRoleBinding:集群角色绑定到主体

主体

1、user:用户

2、group:用户组

3、serviceAccount:服务账号

1、RBAC实现鉴权
  • 创建命名空间

    kubectl create ns role-demo

2、创建命名空间

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

kubectl get namespace

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bTaB3hqT-1670132802279)(png/image-20220328195302984.png)]

3、命名空间创建Pod

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

kubectl run nginx --image=nginx -n roledemo

[root@hadoop102 ~]# kubectl get pods -n role-demo

4、创建角色

我们通过 rbac-role.yaml进行创建

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: role-demo
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

tip:这个角色只对pod 有 get、list权限

然后通过 yaml创建我们的role

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dzhlrWhY-1670132802280)(png/image-20220328195524003.png)]

5、创建角色绑定

通过 rbac-rolebinding.yaml的方式,来创建我们的角色绑定

[root@hadoop102 k8s-yaml]# cat rbac-rolebinding.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-pods
  namespace: role-demo
subjects:
- kind: User
  name: mary #Name is case sensitive
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role #this must be Role or ClusterRole
  name: pod-reader #this must match the name of the Role or ClusterRole you wish to bind to
  apiGroup: rbac.authorization.k8s.io
# 创建角色绑定
kubectl apply -f rbac-rolebinding.yaml
# 查看角色绑定
kubectl get role,rolebinding -n role-demo

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EA80bXui-1670132802281)(png/image-20220328195950688.png)]

6、使用证书识别身份

rbac-user.sh 证书脚本


cat > mary-csr.json <<EOF
{
  "CN": "mary",
  "hosts": [],
  "key":{
    "algo": "rsa",
    "size": 2048:q!
  },
  "names":[
    {
      "C": "CN",
      "L": "BeiJing",
      "ST": "BeiJing"
    }

  ]
}
EOF

cfssl gencert -ca=ca.pem -ca-key.pem -config.json -profile=kubernetes mary-csr.json | cfssljson -bare mary

kubectl config set-cluster kubernetes \
  --certificate-authority=ca.pem \
  --embed-certs=true \
  --server=https://192.168.10.102:6443 \
  --kubeconfig=mary-kubeconfig

kubectl config set-credentials mary \
  --client-key=mary-key.pem \
  --client-certificate=mary.pem \
  --embed-certs=true \
  --kubeconfig=mary-kubeconfig

包含了很多证书文件,在TSL目录下,需要复制过来(根据尚硅谷学习,最开始二进制位搭建成功。后续补上。后面一点为实际操作)

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

./rbac-user.sh

最后我们进行测试

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

以下图片来源尚硅谷

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PvsdWf8e-1670132802282)(png/image-20220328200158812.png)]

Ingress对外暴露端口

原来我们需要将端口号对外暴露,通过 ip + 端口号就可以进行访问

原来是使用Service中的NodePort来实现

  • 在每个节点上都会启动端口
  • 在访问的时候通过任何节点,通过ip + 端口号就能实现访问

但是NodePort还存在一些缺陷

  • 因为端口不能重复,所以每个端口只能使用一次,一个端口对应一个应用
  • 实际访问中都是用域名,根据不同域名跳转到不同端口服务中
1、Ingress和Pod关系

pod 和 ingress 是通过service进行关联的,而ingress作为统一入口,由service关联一组pod中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uncTKpRU-1670132802283)(png/image-20220328200920598.png)]

  • 首先service就是关联我们的pod
  • 然后ingress作为入口,首先需要到service,然后发现一组pod
  • 发现pod后,就可以做负载均衡等操作
2、Ingress工作流程

在实际的访问中,都是需要维护很多域名, a.com 和 b.com。然后不同的域名对应的不同的Service,然后service管理不同的pod

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i95zDVVA-1670132802284)(png/image-20220328201019141.png)]

需要注意,ingress不是内置的组件,需要我们单独的安装

使用Ingress

步骤如下所示

  • 部署ingress Controller【需要下载官方的】
  • 创建ingress规则【对哪个Pod、名称空间配置规则】
3、创建Nginx Pod

创建一个nginx应用,然后对外暴露端口

# 创建pod
kubectl create deployment local-nginx --image=nginx
# 查看
kubectl get pods
kubectl get deploy

对外暴露端口

kubectl expose deployment local-nginx  --port=80 --target-port=80 --type=NodePort
kubectl get svc
4、部署 ingress controller

这个文件里面,需要注意的是 hostNetwork: true,改成ture是为了让后面访问到

通过这种方式,其实我们在外面就能访问,这里还需要在外面添加一层(https://gitee.com/HaoZhouRS/study-notes)

kubectl apply -f ingress-controller.yaml

最后通过下面命令,查看是否成功部署 ingress

kubectl get pods -n ingress-nginx

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zdP9E99y-1670132802284)(png/image-20220328202803504.png)]

5、创建ingress规则文件

创建ingress规则文件,ingress-rule.yaml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: example.ingredemo.com
    http:
      paths:
      - path: /
        backend:
          serviceName: local-nginx
          servicePort: 80

kubectl apply -f ingress-rule.yaml

kubectl get pods -n ingress-nginx -o wide

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8HHOuRAS-1670132802284)(png/image-20220323213736381.png)]

到节点103上发现可以监听到对应的80端口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lfzCS6zy-1670132802285)(png/image-20220323213922858.png)]

添加域名访问规则

在windows 的 hosts文件,添加域名访问规则【因为我们没有域名解析,所以只能这样做】

最后通过域名就能访问

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ErjZdGvK-1670132802285)(png/image-20220323214205507.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IGhed5TI-1670132802286)(png/image-20220323214146326.png)]

学习路径:https://space.bilibili.com/302417610/,如有侵权,请联系q进行删除:3623472230

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值