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: MTIzNDU22.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.key2.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删除后,证书也会消失,竟可能选择单个命名空间
建一个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 created2.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-system2.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 created2.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 created2.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.542.8.使用https访问程序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
3.扩展:针对https配置地址重写访问https://任意节点ip:30504端口即可访问到程序
到此采用secret存储证书文件,为nginx提供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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)