Kubernetes(六) - Secret和私有仓库认证
对一个公司来说安全也是最为重要的因为可能一旦出现安全问题可能这个公司就完了,所以对密码管理是一个长久不变的话题,Kubernetes对密码管理提供了Secret组件进行管理,最终映射成环境变量,文件等方式提供使用,统一进行了管理 更换方便,并且开发人员并不需要关心密码降低了密码的受众范围从而保障了安全.
Kubernetes官方文档:https://kubernetes.io/docs/reference/
Kubernetes官方Git地址:https://github.com/kubernetes/kubernetes
PS:本系列中使用 KubernetesV1.8 RancherV1.6.14
1. 初始化Secret
首先我们需要初始化一个Secret,使用Yaml文件创建时需要使用base64之后的内容作为Value
$ echo -n "admin" | base64 YWRtaW4= $ echo -n "1f2d1e2e67df" | base64 MWYyZDFlMmU2N2Rm
老规矩通过yaml的方式创建我们的Secret配置文件可以看到已经生效了
> vim secret.yaml apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: MWYyZDFlMmU2N2Rm > kubectl create -f ./secret.yaml secret "mysecret" created > kubectl get secret NAME TYPE DATA AGE default-token-lnftf kubernetes.io/service-account-token 3 1d mysecret Opaque 2 9s
2. 环境变量
我们在使用Secret第一个场景就是作为容器的环境变量,大部分容器都提供使用环境变量配置密码的功能,你的程序只需要读取到这个环境变量使用这个环境变量的内容去链接到对应的服务就可以正常使用了,如下我们初始化一个Pod服务,使用之前预设好的信息作为用户名密码配置进去
> vim secret-env.yaml apiVersion: v1 kind: Pod metadata: name: secret-env-pod spec: containers: - name: mycontainer image: redis env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: mysecret key: username - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: mysecret key: password restartPolicy: Never > kubectl create -f secret-env.yaml
3.文件(TLS证书)
除了配置成环境变量我们在很多地方也会使用到文件的方式来存放密钥信息,最常用的就是HTTPS这样的TLS证书,使用证书程序(比如Nginx没法使用环境变量来配置证书)需要一个固定的物理地址去加载这个证书,我们吧之前配置用户名和密码作为文件的方式挂在到某个目录下
> vim secret-file.yaml apiVersion: v1 kind: Pod metadata: name: secret-file-pod spec: containers: - name: mypod image: redis volumeMounts: - name: foo mountPath: "/etc/foo" readOnly: true volumes: - name: foo secret: secretName: mysecret > kubectl create -f secret-file.yaml
如果有需要对同的配置分开挂载到不同的地方可以使用如下配置
apiVersion: v1 kind: Pod metadata: name: secret-file-pod spec: containers: - name: mypod image: redis volumeMounts: - name: foo mountPath: "/etc/foo" readOnly: true volumes: - name: foo secret: secretName: mysecret items: - key: username path: my-group/my-username
- username存储在/etc/foo/my-group/my-username文件而不是/etc/foo/username。
- password 不会挂载到磁盘
因为映射成了文件那么对权限也是可以控制的
volumes: - name: foo secret: secretName: mysecret defaultMode: 256
然后,秘密将被挂载,/etc/foo并且由秘密卷挂载创建的所有文件都将具有权限0400。
PS: JSON规范不支持八进制表示法,因此对于0400权限使用值256。如果您使用yaml代替pod的json,则可以使用八进制表示法以更自然的方式指定权限。
您也可以使用映射(如上例所示),并为不同的文件指定不同的权限,如下所示:
volumes: - name: foo secret: secretName: mysecret items: - key: username path: my-group/my-username mode: 511
在这种情况下,生成的文件/etc/foo/my-group/my-username将具有权限值0777。由于JSON限制,您必须以十进制表示法指定模式。
4.Docker私有仓库认证
使用过K8s的小伙伴肯定会遇到一个问题,我们在使用自有的Docker仓库的时候都需要先登录用户名和密码,但是如果使用K8S怎么配置密码呢?在secret中有一个类型是docker-registry我们可以通过命令行的方式创建在获取Docker镜像时使用的用户名和密码
kubectl create secret docker-registry regsecret --docker-server=registry-vpc.cn-hangzhou.aliyuncs.com --docker-username=admin --docker-password=123456 --docker-email=xxxx@qq.com
如果使用编排文件是如下格式
kind: Secret apiVersion: v1 metadata: name: regsecret type: kubernetes.io/dockercfg data: ".dockercfg": eyJyZWdpc3RyeS12cGMuY24taGFuZ3pob3UuYWxpeXVuY3MuY29tIjp7InVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6IjEyMzQ1NiIsImVtYWlsIjoieHh4eEBxcS5jb20iLCJhdXRoIjoiWVdSdGFXNDZNVEl6TkRVMiJ9fQ== # 反base64的结果 : {"registry-vpc.cn-hangzhou.aliyuncs.com":{"username":"admin","password":"123456","email":"xxxx@qq.com","auth":"YWRtaW46MTIzNDU2"}}
然后我们就可以在获取指定镜像的时候为他指定一个获取镜像的Docker凭证
apiVersion: v1 kind: Pod metadata: name: secret-file-pod spec: containers: - name: mypod image: redis imagePullSecrets: # 获取镜像需要的用户名密码 - name: regsecret
本文转自开源中国- Kubernetes(六) - Secret和私有仓库认证 
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
kubernetes中部署DNS
先吐槽一下,最近研究k8s的dns,看了很多相关博客,发现很多都是一样的内容,大部分都是转载或者copy,也不验证一下就发出来,给我无形中挖了很多坑。再次先谴责一下这些人! 开始正题! 使用场景:ubuntu16.04, kubernetes1.4及以上, 集群没有搭建CA等认证!其他场景仅作参考! 1.为什么要部署DNS kubernetes 提供了 service 的概念可以通过 VIP(Service IP 是 virtual IP(VIP)) 访问 pod 提供的服务,但是在使用的时候还有一个问题:怎么知道某个应用的 VIP?比如我们有两个应用,一个 app,一个 是 db,每个应用使用 rc或deployment进行管理,并通过 service 暴露出端口提供服务。app 需要连接到 db 应用,我们只知道 db 应用的名称,但是并不知道它的 VIP 地址。这就涉及到了==服务发现==的问题了。 针对以上问题,k8s提供了三种==服务发现==的方法: 方法1.通过kubernetes 提供的 API 查询 该方法较为简单,但问题较多。首先每个应用都要在启动的时候编写查询依赖服...
- 下一篇
Kubernetes自建虚拟机实验环境(CentOS 7 环境下离线安装)
本文是《Docker自建虚拟机实验环境及基础入门》一文的 续篇,从上文实验环境下继续操作。 Kubernetes节点分为Master和Minion两种类型,Master节点只需一个,Minion节点可以有多个,组成集群。而集群通过ETCD服务保存集群配置信息,通过Flanneld服务协调集群内容器的IP地址段。下图是简单示意: 下面描述如何在一台虚拟机中安装一个伪Kubernetes集群,以实现Kubernetes集群的全部功能,达到学习Kubernetes的目的。 本文所用的文件请去 https://pan.baidu.com/s/1eSei6KM 里提取,下面是文件列表。 下面是安装步骤: 一、 安装ETCD rpm -ivh etcd-3.0.15-1.el7.x86_64.rpm etcd配置: 安装完成后,用下面命令查看etcd服务,找到etcd的启动脚本,然后进行修改: service etcd status Redirecting to /bin/systemctl status etcd.service ● etcd.service - Etcd Server Load...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- MySQL8.0.19开启GTID主从同步CentOS8
- Hadoop3单机部署,实现最简伪集群
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题