当前位置: 首页 > 后端技术 > Java

k8s配置Secret集成Harbor

时间:2023-04-01 21:58:21 Java

本文主要记录在k8s中如果想从harbor拉取镜像如何操作,介绍k8s中Secret是什么1.什么是Secret1.1Secret概述Secret是一种An包含少量敏感信息(如密码、令牌或密钥)的对象。这些信息可能放在Pod规范或图像中。使用Secret意味着您不需要在应用程序代码中包含秘密数据。由于Secrets可以独立于使用它们的Pod创建,因此在创建、查看和编辑Pod的工作流程中暴露Secrets(及其数据)的风险较小。在集群中运行的Kubernetes和应用程序还可以使用Secrets采取额外的预防措施,例如避免将秘密数据写入非易失性存储。Secret类似于ConfigMap,但旨在保存秘密数据。说白了就是用来保存重要的密码等信息。Pod可以通过以下三种方式之一使用Secret:作为挂载在一个或多个容器的卷上的文件。作为容器的环境变量。在为pod拉取镜像时由kubelet使用。这篇文章主要讲的是如何在Pod拉取镜像的时候使用1.2的Secret类型创建Secret。您可以使用Secret资源的类型字段或其等效的kubectl命令行参数(如果有)为其设置类型。Secret类型有助于以编程方式操作Secret数据。Kubernetes为一些常见的使用场景提供了几种内置类型。对于这些类型中的每一种,Kubernetes执行的合法性检查以及对它们施加的限制各不相同。内置类型用法Opaque用户自定义任意数据kubernetes.io/service-account-token服务账户令牌kubernetes.io/dockercfg~/.dockercfg文件序列化形式kubernetes.io/dockerconfigjson~/.docker/config.json文件序列化用于基本身份验证的kubernetes.io/basic-auth凭据形式io/tokenstartupboottokendata本文主要涉及到kubernetes.io/dockerconfigjsonSecret2.Dockerpulloverview大家都知道在dockerpull镜像之前其实需要dockerlogin才能登录,如下:我去pullharbor的时候,它提示没有进行认证。我们docker登录后,密码被加密保存在~/.docker/config.json中。~/.docker/config.json文件内容如下:{"auths":{"harbor.demo.com:5667":{"username":"admin","password":"Harbor12345","auth":"YWRtaW46SGFyYm9yMTIzNDU="}}}想一想,如果我们让k8s拉这个镜像到harbor上的时候,也必须要认证。让我们试试看。3.写一个部署文件(Secret没有配置),指定镜像拉取地址为harbor,镜像还是之前创建的简单springboot镜像。apiVersion:apps/v1kind:Deployaltymetadata:名称:pull-harbor-web-demospec:选择器:matchLabels:app:pull-harbor-web-demo模板:元数据:标签:app:pull-harbor-web-demo规范:容器:-名称:boot-demoimage:harbor.demo.com:5667/k8s-project/boot-k8s-demo:v2#指定从harbor拉取镜像端口:-containerPort:8081---apiVersion:v1kind:Servicemetadata:name:pull-harbor-web-demospec:selector:app:pull-harbor-web-demoports:-port:8081name:boot-demotargetPort:8081type:NodePort4。部署服务(未认证,失败)kubectlapply-fdeploy-many-container_test。yamlkubectlgetpods#可以看到pod状态为ImagePullBackOffkubectldescribepodsname|grepFailed#可以查看具体信息。可以看到在没有配置secret的情况下,k8s调度pod是因为无法拉取对应的image5.创建Secret5.1文件创建Secret(kubernetes.io/dockerconfigjson)可以使用以下两种类型值之一创建一个Secret来存储访问Docker仓库下载镜像的凭证kubernetes.io/dockercfg旧类型没有扩展kubernetes.io/dockerconfigjson类型kubernetes.io/dockerconfigjson是为了存储序列化形式的JSON数据,JSON也遵循~/.docker/config的格式规则.json文件,是~/.dockercfg的新版本格式。使用这种Secret类型时,Secret对象的data字段必须包含.dockerconfigjson键,其键值为base64编码的字符串,包含~/.docker/config.json文件的内容。下面是一个kubernetes.io/dockercfg类型的例子Secret:apiVersion:v1kind:Secretmetadata:name:secret-dockercfgtype:kubernetes.io/dockerconfigjson#指定类型使用新版本的data:.dockerconfigjson:|《》5.2命令创建Secret(kubernetes.io/dockerconfigjson)kubectlcreatesecretdocker-registryloginharbor\--docker-email=tiger@acme.example\#即可不填--docker-username=admin\--docker-password=Harbor12345\--docker-server=harbor.demo.com:5667#Harbor地址需要添加端口kubectlcreatesecretdocker-registryfixedpartloginharborcustomsecretnamespecifyusernamepassword指定镜像仓库地址kubectlgetsecretloginharbor-oyaml#查看自动生成的secret文件信息tips:注意master节点上不会保留这个~/.docker/config.json,而是保存secret文件信息存储到etcd里面,后面会发送到对应pod引用的节点。通过上面的描述:.dockerconfigjson的key值是一个base64编码的字符串,里面包含了~/.docker/config.json文件的内容,所以我们试试用base64解密看看内容是什么echo"eyJhdXRocyI6eyJoYXJib3IuZGVtby5jb206NTY2NyI6eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJIYXJib3IxMjM0NSIsImF1dGgiOiJZV1J0YVc0NlNHRnlZbTl5TVRJek5EVT0ifX19"|base64-d#Decryptbase64可以看到内容是6.修改部署文件(configureSecret)6.1PodconfigureSecret如果尝试从私有仓库拉取容器镜像到let,每个都需要一个方法node为了能够完成与镜像库的身份认证,可以配置image拉取Secret来实现,Secrets是在Pod级别配置的,Pod的imagePullSecrets字段是引用Secrets的列表Pod所在的namespace,可以使用imagePullSecrets将镜像仓库的访问凭证传递给kubelet,kubelet使用这些信息为你的Pod拉取私有镜像6.2ServiceAccountReferenceSecret可以手动创建imagePullSecret,在ServiceAccount中引用.对于使用这个ServiceAccount创建的所有Pod,或者默认使用这个ServiceAccount创建的Pod,imagePullSecrets字段会被设置为这个服务账号。请直接选择下面第一种方法,修改上面的部署文件,添加imagePullSecrets6.3修改部署文件,添加imagePullSecrets7。再次部署服务(认证,成功)kubectldelete-fdeploy-many-container_test.yamlkubectlapply-fdeploy-many-container_test.yamlkubectldescribepodsname#查看pods详情8.随意测试集群中任意节点的访问,因为上面Servicetype=NodePort总结本文主要介绍Secret在k8s和kubernetes.io中使用/dockerconfigjson类型测试集成Pod拉取Harbor镜像仓库,Secret还是挺简单的,直接点官网就可以实际操作了。欢迎访问个人博客JohnnyHut