Kubernetes集群Secret配置存储资源(三十八)

Kubernetes集群Secret配置存储资源(三十八),第1张

Kubernetes集群Secret配置存储资源(三十八) Kubernetes集群Secret配置存储资源

文章目录

Kubernetes集群Secret配置存储资源

1.secret资源概述及清单文件2.secret资源证书存储案例配置-(综合案例)

2.1.生成ssl证书2.2.创建secret资源2.3.创建pv资源存储网站代码2.4.创建configmap保存nginx证书配置2.5.创建nginx deployment资源2.6.创建nginx svc资源2.7.查看所有资源的状态2.8.使用https访问程序 3.扩展:针对https配置地址重写4.secret资源密码存储案例配置

1.secret资源概述及清单文件

secret和configmap资源类似,都是用来存储配置文件的,只不过secret用来存储敏感信息,比如证书、密码、秘钥等文件

secret以键值对方式存储数据,键就是文件名,值就是具体的加密内容,最后在pod中挂载secret资源

在企业实际应用中常用secret存储一些证书文件

Secret类型:

Service Account:用来访问k8s的api,由k8s自动创建,并将会挂载到pod的/run/secrets/kubernetes.io/serviceaccount目录中

Opaque:base64编码格式的Secret,用来存储密码,密钥等。

kubernetes.io/dockerconfigjson: 用来存储私有docker registry的认证信息。

kubernetes.io/tls:用来存储证书

secret资源清单文件

apiVersion: v1
kind: Secret					//资源类型为Secret
metadata:
  name: admin-secret
  namespace: dev
type: Opaque					//类型为Opaque,Opaque主要存储base64加密后的密码文件
data:							//定义数据
  username: YWRtaW4=			//username为文件名称,YWRtaW4=为文件内容
  password: MTIzNDU2
2.secret资源证书存储案例配置-(综合案例)

使用secret资源存储证书文件,然后挂载到nginx pod中,为用户提供https加密访问

综合案例:结合之前的deployment控制器、ingress暴露、PV、PVC数据持久化

实现思路:

​ 1.首先生成ssl加密证书文件

​ 2.创建secret资源,将ssl证书文件导入secret资源中

​ 3.创建pv、pvc存储网站代码

​ 4.创建configmap存储程序的nginx配置

​ 5.创建无状态的deployment资源类型的nginx pod,挂载pvc、configmap、secret

​ 6.创建svc资源,暴露程序的443端口

​ 7.使用https访问程序,验证是否通过证书访问应用成功

2.1.生成ssl证书
1.创建证书目录
[root@k8s-master ~/k8s_1.19_yaml/secret]# mkdir cert
[root@k8s-master ~/k8s_1.19_yaml/secret]# cd cert

2.生成一个*.jiangxl.com的证书
[root@k8s-master ~/k8s_1.19_yaml/secret/cert]# openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout jiangxl.com.key -out jiangxl.com.crt -subj "/C=CN/ST=BJ/L=BJ/O=nginx/CN=*.jiangxl.com"
Generating a 2048 bit RSA private key
...+++
...................+++
writing new private key to 'jiangxl.com.key'
-----

3.查看证书文件
[root@k8s-master ~/k8s_1.19_yaml/secret/cert]# ll
总用量 8
-rw-r--r-- 1 root root 1253 4月  13 15:20 jiangxl.com.crt
-rw-r--r-- 1 root root 1704 4月  13 15:20 jiangxl.com.key
2.2.创建secret资源

由于证书是单独的文件,因此不能通过yaml的方式将证书内容写入secret,只能通过命令的方式将证书导入secret资源中

命令格式:kubectl create secret 类型 证书名称 --key=私钥文件 --cert=证书文件

类型有三种: docker-registry、generic、tls

如果是将证书导入secret则使用tls类型

[root@k8s-master ~/k8s_1.19_yaml/secret]# kubectl create secret tls jiangxl-com --key=cert/jiangxl.com.key --cert=cert/jiangxl.com.crt  -n know-system
secret/jiangxl-com created

[root@k8s-master ~/k8s_1.19_yaml/secret]# kubectl describe secrets -n know-system jiangxl-com 
Name:         jiangxl-com
Namespace:    know-system
Labels:       
Annotations:  

Type:  kubernetes.io/tls

Data
====
tls.crt:  1253 bytes				#由于采用了tls类型,secret创建后会将原来的证书文件名修改成tls.crt、tls.key
tls.key:  1704 bytes

注意:secret导入证书文件后,会将一开始的证书文件名称进行修改,私钥文件为tls.key,证书文件为tls.crt

查看secret资源的yaml时看到的证书内容是加密以后的,挂载到容器的某个路径后,在查看证书的内容则是一开始的解密内容

扩展:rancher方式导入证书到secret

点击资源—密文—证书列表—添加证书

添加证书信息,如果勾选此项目所有命令空间的话,当rancher删除后,证书也会消失,竟可能选择单个命名空间

2.3.创建pv资源存储网站代码

建一个pv和pvc存储网站的代码

1.创建命名空间
[root@k8s-master ~/k8s_1.19_yaml/secret]# kubectl create ns know-system
namespace/know-system created

2.编写pv、pvc yaml文件
[root@k8s-master ~/k8s_1.19_yaml/secret]# vim nginx-pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-1
  labels:
    pv: pv-1
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:                   
    path: /data/pv_1/
    server: 192.168.81.210

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-1
  namespace: know-system
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      pv: pv-1 

3.创建pv和pvc
[root@k8s-master ~/k8s_1.19_yaml/secret]# kubectl create -f nginx-pv.yaml 
persistentvolume/pv-1 created
persistentvolumeclaim/pvc-1 created
2.4.创建configmap保存nginx证书配置

创建configmap资源保存项目的配置文件内容,由于是证书认证,只配置https即可

1.编写yaml文件
[root@k8s-master ~/k8s_1.19_yaml/secret]# vim nginx-configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-configmap
  namespace: know-system
data:
  know.jiangxl.com.conf: |
    server {
      listen 443 ssl;
      server_name know.jiangxl.com;
      ssl_certificate      /data/know.jiangxl.com/tls.crt;				
      ssl_certificate_key  /data/know.jiangxl.com/tls.key;		#这里一定要写tls.crt,因为secret已经将默认的证书文件名称进行修改,可以看secret的详细信息获取文件的名称		
      location / {
        root /data/code/know_system;
        index index.html;
      }
    }

2.创建资源
[root@k8s-master ~/k8s_1.19_yaml/secret]# kubectl create -f nginx-configmap.yaml 
configmap/nginx-configmap created

3.查看资源的详细信息
[root@k8s-master ~/k8s_1.19_yaml/secret]# kubectl describe cm -n know-system 

2.5.创建nginx deployment资源

创建一个deployment资源类型的nginx pod,挂载pvc存储代码、挂载configmap存储配置文件、挂载secret存储证书文件

1.编写yaml文件
[root@k8s-master ~/k8s_1.19_yaml/secret]# vim nginx-deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx
  namespace: know-system
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        ports:
        - containerPort: 443
        volumeMounts:
        - name: nginx-data
          mountPath: /data/code/
        - name: nginx-config
          mountPath: /etc/nginx/conf.d/
        - name: nginx-cret							#定义的secret volume名称
          mountPath: /data/know.jiangxl.com/          #指定挂载到容器的某个路径
      volumes:
        - name: nginx-data
          persistentVolumeClaim:
            claimName: pvc-1
            readOnly: false
        - name: nginx-config
          configMap:
            name: nginx-configmap
        - name: nginx-cret					#定义卷名称
          secret:							#secret类型
            secretName: jiangxl-com				#secret资源名称,要与deployment资源在同一个命名空间,否则找不到

2.创建deployment资源
[root@k8s-master ~/k8s_1.19_yaml/secret]# kubectl create -f nginx-deploy.yaml
deployment.apps/deploy-nginx created
2.6.创建nginx svc资源

对外暴露nginx https的端口,只暴露443端口即可

1.编写yaml文件
[root@k8s-master ~/k8s_1.19_yaml/secret]# vim nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: know-system
spec:
  selector:
    app: nginx-pod
  type: NodePort
  ports:
  - port: 443				#由于是证书,因此需要暴露443端口
    targetPort: 443

2.创建svc资源
[root@k8s-master ~/k8s_1.19_yaml/secret]# kubectl create -f nginx-svc.yaml
service/nginx-service created
2.7.查看所有资源的状态
[root@k8s-master ~/k8s_1.19_yaml/secret]# kubectl get deploy,pod,svc,cm,secret -n know-system 
NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deploy-nginx   3/3     3            3           4m58s

NAME                               READY   STATUS    RESTARTS   AGE
pod/deploy-nginx-fbcc8c874-f6d5s   1/1     Running   0          4m58s
pod/deploy-nginx-fbcc8c874-rnwnl   1/1     Running   0          4m58s
pod/deploy-nginx-fbcc8c874-wzh5n   1/1     Running   0          4m58s

NAME                    TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE
service/nginx-service   NodePort   10.103.46.54           443:30504/TCP   91s

NAME                        DATA   AGE
configmap/nginx-configmap   1      6m58s

NAME                         TYPE                                  DATA   AGE
secret/default-token-fqsbl   kubernetes.io/service-account-token   3      60m
secret/jiangxl-com           kubernetes.io/tls                     2      44m

2.8.使用https访问程序

访问https://任意节点ip:30504端口即可访问到程序

到此采用secret存储证书文件,为nginx提供https加密访问实现完成

3.扩展:针对https配置地址重写

虽然7.2中已经实现通过https证书访问到网站,但是有两个缺陷:

1.用户可能会继续使用http访问网站

2.一个网站需要通过域名去访问

针对这两个问题,我们可以通过nginx的rewrite实现

实现思路:

​ 1.修改configmap资源,增加http rewrite地址重新,当访问http时自动跳转至https

​ 2.由于是地址跳转,nginx无法携带k8s节点随机暴露的nodeport,因此需要调整svc资源,将nodeport修改为80/443,和容器里nginx端口保持一致

​ 3.将nginx pod重启

1)修改configmap资源配置rewrite

1.修改yaml文件
[root@k8s-master ~/k8s_1.19_yaml/secret]# vim nginx-configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-configmap
  namespace: know-system 	
data:
  know.jiangxl.com.conf: |
    server {											#增加80端口的配置
      listen 80;											#端口号
      server_name know.jiangxl.com;							#网站的域名,必须要加上,否则无法转发
      rewrite ^(.*) https://$server_name redirect;		#地址重写,任意页面都转发到https://know.jiangxl.com下
    }
    server {
      listen 443 ssl;
      server_name know.jiangxl.com;
      ssl_certificate      /data/know.jiangxl.com/tls.crt;
      ssl_certificate_key  /data/know.jiangxl.com/tls.key;
      location / {
        root /data/code/know_system;
        index index.html;
      }
    }

2.更新yaml配置
[root@k8s-master ~/k8s_1.19_yaml/secret]# kubectl apply -f nginx-configmap.yaml
configmap/nginx-configmap configured

2)修改svc资源指定nodeport端口

由于nginx无法携带除nginx外的一切端口,因此必须将nodeport端口调整为和容器nginx一致的端口号,否则将会转发失败

1.编写yaml文件
[root@k8s-master ~/k8s_1.19_yaml/secret]# vim nginx-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: know-system
spec:
  selector:
    app: nginx-pod
  type: NodePort
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 80				#指定暴露给外部的是80
  - name: https
    port: 443
    targetPort: 443
    nodePort: 443				#指定暴露给外部的是443

2.更新yaml配置
[root@k8s-master ~/k8s_1.19_yaml/secret]# kubectl apply -f nginx-svc.yaml 
service/nginx-service configured


3)重启nginx pod

[root@k8s-master ~/k8s_1.19_yaml/secret]# kubectl replace -f nginx-deploy.yaml 
deployment.apps/deploy-nginx replaced

rancher上pod的重启方式

4)验证地址重写

在Windows的hosts文件中绑定域名,直接使用域名访问即可

可以直接通过rancher上的访问端口,点80也会跳到程序的页面

如果安装了http status谷歌插件后可以明显看到是通过http跳转到https的

4.secret资源密码存储案例配置

使用secret存储一些使用base64加密后的文件内容,挂载到pod对应的目录中

1)对内容使用base64进行加密

[root@k8s-master ~/k8s_1.19_yaml/secret]# echo -n "admin" | base64
YWRtaW4=
[root@k8s-master ~/k8s_1.19_yaml/secret]# echo -n "123456" | base64
MTIzNDU2

2)编写secret资源yaml存储加密内容

1.编写yaml文件
[root@k8s-master ~/k8s_1.19_yaml/secret]# vim admin-secret.yaml 
apiVersion: v1
kind: Secret					#资源类型为Secret
metadata:
  name: admin-secret
  namespace: dev
type: Opaque					#类型为Opaque,Opaque主要存储base64加密后的密码文件
data:							#定义数据
  username: YWRtaW4=			#username为文件名称,YWRtaW4=为文件内容
  password: MTIzNDU2

2.创建资源
[root@k8s-master ~/k8s_1.19_yaml/secret]# kubectl create -f admin-secret.yaml 
secret/admin-secret created

3.查看资源的状态
[root@k8s-master ~/k8s_1.19_yaml/secret]# kubectl get secret admin-secret -n dev
NAME           TYPE     DATA   AGE
admin-secret   Opaque   2      2m47s

4.查看资源的详细信息
[root@k8s-master ~/k8s_1.19_yaml/secret]# kubectl describe secret admin-secret -n dev
Name:         admin-secret
Namespace:    dev
Labels:       
Annotations:  

Type:  Opaque

Data
====
password:  6 bytes				#文件内容这里都是加密以后的
username:  5 bytes

3)将secret资源挂载到pod中

1.编写yaml
[root@k8s-master ~/k8s_1.19_yaml/secret]# vim admin-pod.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: admin-pod
  namespace: dev
spec:
  replicas: 1
  selector:
    matchLabels:
      app: admin-pod
  template:
    metadata:
      labels:
        app: admin-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        ports:
        - containerPort: 80
        volumeMounts:
        - name: admin-secret					#对应的卷名称
          mountPath: /data/
      volumes:
        - name: admin-secret	
          secret:						#secret方式
            secretName: admin-secret		#对应的secret名称

2.创建资源
[root@k8s-master ~/k8s_1.19_yaml/secret]# kubectl create -f admin-pod.yaml
deployment.apps/admin-pod created

3.查看资源的状态
[root@k8s-master ~/k8s_1.19_yaml/secret]# kubectl get pod -n dev
NAME                        READY   STATUS    RESTARTS   AGE
admin-pod-cc5dd7778-cq8bv   1/1     Running   0          8m20s

4)进入容器查看secret存储的文件加密文件内容

[root@k8s-master ~/k8s_1.19_yaml/secret]# kubectl exec -it admin-pod-cc5dd7778-cq8bv bash -n dev
root@admin-pod-cc5dd7778-cq8bv:/# ls -l /data/
total 0
lrwxrwxrwx 1 root root 15 Apr 14 06:15 password -> ..data/password
lrwxrwxrwx 1 root root 15 Apr 14 06:15 username -> ..data/username
root@admin-pod-cc5dd7778-cq8bv:/# more /data/username 
admin
root@admin-pod-cc5dd7778-cq8bv:/# more /data/password 
123456

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5706709.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存