K8s:Secret

Secret

作用:

1、数据存储到etcd
2、大小不能超过1M()
3、在同一个namespace

使用场景:

1、使用文件的形式挂载到容器中、给容器提供证书(把证书创建成Secret、挂到容器中使用)。
2、使用Secret给容器提供环境变量。
3、kubelet为pod拉取镜像时候做认证。(与镜像仓库的认证)

使用流程

1、管理员先创建一个Secret(包括创建configmap)————然后把请求发给apiserver
2、apiserver把Secret(包括创建configmap)请求存到etcd(不是存在apiserver、apiserver是负载多节点、多个apiserver数据没办法同步)
3、创建pod:需要申请消费configmap或者Secret、pod需要使用apiserver去etcd下载Secret文件
4、下载好之后、就放在node节点本地、放好之后就通过容器的utfs、挂载给容器使用。

最后总结:Secret先存放在etcd、最后node节点也会下载一份给容器使用。

Secret类型

多种类型:
Opaque 										用户定义的任意数据
kubernetes.io/service-account-token 		ServiceAccount 令牌
kubernetes.io/dockercfg ~/.dockercfg 		文件的序列化形式
kubernetes.io/dockerconfigjson 				~/.docker/config.json 文件的序列化形式
kubernetes.io/basic-auth 					用于基本身份认证的凭据
kubernetes.io/ssh-auth 						用于 SSH 身份认证的凭据
kubernetes.io/tls 							用于 TLS 环境,保存crt证书和key证书
bootstrap.kubernetes.io/token 				启动引导令牌数据

加密和解密

base64
echo  "12345678"  | base64

echo "MTIzNDU2NzgK"  | base64 -d

查看

kubectl  get  secret  secret名字  -n  myserver -o  yaml

存放宿主机

/var/lib/kubelet/

find 直接查找

文件是由kubelet调用apiserver生成的
nginx的secret小实验
1、configmap提供配置
2、secret提供证书

1、创建证书

kubectl create secret tls myserver-tls-key --cert=./server.crt --key=./server.key -n myserver

2、查看

kubectl  get secret  myserver-tls-key  -n myserver
kubectl  get secret  myserver-tls-key  -n myserver		-o  json

编写yaml文件

1、ConfigMap

2、Deployment(pod)

3、Service

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
  namespace: myserver
data:
 default: |
    server {
       listen       80;
       server_name  www.mysite.com;
       listen 443 ssl;
       ssl_certificate /etc/nginx/conf.d/certs/tls.crt;
       ssl_certificate_key /etc/nginx/conf.d/certs/tls.key;

       location / {
           root /usr/share/nginx/html;
           index index.html;
           if ($scheme = http ){  #未加条件判断,会导致死循环
              rewrite / https://www.mysite.com permanent;
           }

           if (!-e $request_filename) {
               rewrite ^/(.*) /index.html last;
           }
       }
    }

---
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myserver-myapp-frontend-deployment
  namespace: myserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myserver-myapp-frontend
  template:
    metadata:
      labels:
        app: myserver-myapp-frontend
    spec:
      containers:
      - name: myserver-myapp-frontend
        image: nginx:1.20.2-alpine
        ports:
          - containerPort: 80
        volumeMounts:
          - name: nginx-config
            mountPath:  /etc/nginx/conf.d/myserver
          - name: myserver-tls-key
            mountPath:  /etc/nginx/conf.d/certs
      volumes:
      - name: nginx-config
        configMap:
          name: nginx-config
          items:
             - key: default
               path: mysite.conf
      - name: myserver-tls-key
        secret:
          secretName: myserver-tls-key


---
apiVersion: v1
kind: Service
metadata:
  name: myserver-myapp-frontend
  namespace: myserver
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30018
    protocol: TCP
  - name: htts
    port: 443
    targetPort: 443
    nodePort: 30019
    protocol: TCP
  selector:
    app: myserver-myapp-frontend


生产环境

1、镜像自己打
2、做好优化
3、server_name 都用configmap挂载映射
4、证书使用浏览器信任(一般都是公司购买)
通过Secret给k8s提供认证信息
docker镜像仓库

/root/.docker/config.json			###生成认证文件

1、基于这个认证文件创建一个Secret(如果多个namespace需要认证、都要创建一下)
2、通过命令行直接创建

1.1、先创建Secret

1、先登录一下仓库地址(为了获取json文件)(/root/.docker/config.json)
2、使用这个文件去创建Secret
docker login --username=rooroot@aliyun.com registry.cn-qingdao.aliyuncs.com
kubectl create secret generic aliyun-registry-image-pull-key \ --from-file=.dockerconfigjson=/root/.docker/config.json \ --type=kubernetes.io/dockerconfigjson \ -n myserver

1.2、编写yaml文件

测试:验证pod启动时候、拉取镜像策略是不是使用了Secret

#apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myserver-myapp-frontend-deployment
  namespace: myserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myserver-myapp-frontend
  template:
    metadata:
      labels:
        app: myserver-myapp-frontend
    spec:
      containers:
      - name: myserver-myapp-frontend
        image: registry.cn-qingdao.aliyuncs.com/zhangshijie/nginx:1.16.1-alpine-perl
        ports:
          - containerPort: 80
      imagePullSecrets:
        - name: aliyun-registry-image-pull-key

---
apiVersion: v1
kind: Service
metadata:
  name: myserver-myapp-frontend
  namespace: myserver
spec:
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30018
    protocol: TCP
  type: NodePort
  selector:
    app: myserver-myapp-frontend

注意:如果不添加imagePullSecrets: 直接去拉取镜像会失败、添加imagePullSecrets:后、再次去apply -f yaml的配置文件时候、上一个pod会临时running、因为镜像拉取成功时候、上一个pod会有短暂running、然后立即被删除。

posted @ 2024-07-21 21:59  姬高波  阅读(32)  评论(0)    收藏  举报