zoukankan      html  css  js  c++  java
  • Kubernetes配置Secret访问Harbor私有镜像仓库

    一.kubernetes配置pod访问私有harbor

    从yaml文件中应用harbor私有库中的镜像时,如果不创建secret会出现401 Unauthorized的错误。

    这里以运行nginx pod,在harbor私有库kubernetes中下载nginx镜像为例,列出kubernetes配置pod访问私有harbor的步骤。

    • 1.在有docker环境的机器上绑定hosts并登录harbor
    vim /etc/hosts
    # 增加:
    172.16.108.7   harbor域名
    
    docker login harbor域名
    Username: ******
    Password: ****** 
    
    • 2.docker官方hub下载nginx镜像,修改标签后上传到本地harbor
    # 搜索、下载镜像
    docker search nginx
    docker pull nginx
    # 修改标签名为本地harbor的kubernetes仓库
    docker tag nginx:latest harbor域名/kubernetes/nginx:latest
    # 上传此镜像到harbor私有仓库kubernetes中
    docker push harbor域名/kubernetes/nginx:latest 
    
    • 3.在harbor的私有库kubernetes中新建机器人账户,可以选择权限,一般只pull权限就足够

    • 4.利用刚才新建机器人账户生成的username和token创建secret
      kubernetes集群使用docker-registry类型的secret来通过仓库的身份验证,进而提取私有镜像

    kubectl create secret docker-registry docker-registry-creds --docker-server="harbor域名"
    --docker-email=test@test.com 
    --docker-username='******' 
    --docker-password='******'
    

    注意:

    --docker-server 是私有docker仓库全限定域名(FQDN)
    --docker-username 是机器人账户的username,需要用单引号引起来。
    --docker-password 是机器人账户生成的token,需要用单引号引起来。
    --docker-email 是docker邮箱(非必须)。
    这样就成功地将集群中的docker凭据设置为名为docker-registry-creds的secret。
    
    • 5.创建nginx pod
    vim nginx.yaml
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: harbor域名/kubernetes/nginx:latest 
        ports:
        - containerPort: 80
      imagePullSecrets:
        - name: docker-registry-creds
    

    利用imagePullSecrets来引用刚创建的docker-registry-creds

    # 查看创建的secret
    kubectl get secrets
    # 创建nginx pod   
    kubectl apply -f nginx.yaml 
    # 查看创建的pod   
    kubectl get pods
    # 查看nginx pod的详细信息
    kubectl describe pod nginx    
    

    这样,在运行创建pod的yaml文件时就可以使用harbor私有库中的镜像了。

    二.不同的namespece配置不同的secret,pod使用secret访问私有harbor

    namespace在很多情况下用于实现多租户的资源隔离,通过将集群内部的资源对象分配到不同的namespace中,形成逻辑上分组的不同项目、小组或用户组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。

    如果不特别指明namespace,则用户创建的pod、RC、service都将被系统创建到这个默认的名为default的namespace中。

    这里以名为test-namespace的namespace,名为test-secret的secret为例,列出创建不同namespace,并使用不同的secret访问harbor私有仓库的步骤。

    • 1.创建namespace

    命令方式创建:

    kubectl create namespace test-namespace
    kubectl get namespaces
    

    yaml文件方式创建:

    vim test-namespace.yaml
    apiVersion: v1
    kind: Namespace
    metadata:
      name: test-namespace
      labels:
        name: test-namespace
    
    kubectl apply -f test-namespace.yaml
    或 
    kubectl create –f test-namespace.yaml
    
    • 2.在harbor页面创建名为test-secret的机器人账户

    • 3.一般情况下创建的secret都是在默认的namespace default中的,这里先创建default下的secret

    # 创建命令
    kubectl create secret docker-registry test-secret --docker-server="harbor域名" 
    --docker-email=test@test.com 
    --docker-username='******' 
    --docker-password='******'
    -n test-namespace   
    
    # --all-namespace可以查看所有namespace下的secrets
    kubectl get secrets --all-namespaces
    # -n参数来查看指定namespace下的secret
    kubectl get secrets -n test-namespace
    

    注意:.dockerconfigjson的值包括了登录harbor的用户名和密码等信息,通过以下命令可以查看

    kubectl get secret test-secret -n test-namespace --output="jsonpath={.data..dockerconfigjson}"|base64 -d
    
    # 输出结果为
    {"auths":{"harbor.pwesports.net":{"username":"robot$kubernetes+test-secret","password":"jjFu85zTNG6AOSvfoNzPU7pt95v0LmIB","email":"zhangyiwen117968@pwrd.com","auth":"cm9ib3Qka3ViZXJuZXRlcyt0ZXN0LXNlY3JldDpqakZ1ODV6VE5HNkFPU3Zmb056UFU3cHQ5NXYwTG1JQg=="}}}
    
    • 4.在该namespace下创建nginx pod时,通过imagePullSecrets来引用刚才创建的test-namespace下的test-secret
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      namespace: test-namespace
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: harbor.pwesports.net/kubernetes/nginx:latest 
        ports:
        - containerPort: 80
      imagePullSecrets:
    - name: test-secret
    
    # 查看pod
    kubectl get pods -n test-namespace
    

    可以看到nginx pod创建成功,不同pod的创建同理,实现了不同namespace下的资源隔离和权限控制。

    三.kubectl patch实现自动关联

    上面已经实现了不同namespace下用不同的secret去访问harbor私有仓库时的资源隔离和权限控制,但每次在创建pod时都需要通过imagePullSecrets字段引用相应namespace下的secret,这样显然不太方便,这里可以通过kubectl patch命令来将namespace和对应的secret相关联,避免繁琐。

    以test-namespace与test-secret为例,关联的命令为:

    kubectl patch serviceaccount default -n test-namespace -p '{"imagePullSecrets":[{"name":"test-secret"}]}'
    
    # 查看详细信息:
    kubectl get pod nginx -n test-namespace -o yaml
    
    spec:
      containers:
      - image: harbor.pwesports.net/kubernetes/nginx:latest
        imagePullPolicy: Always
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
          name: default-token-zwvwv
          readOnly: true
      dnsPolicy: ClusterFirst
      enableServiceLinks: true
      imagePullSecrets:
      - name: test-secret
    

    这样,这个namespace下的所有pod在创建时都不需要指定secrets了。

    参考文档:

    https://kubernetes.io/zh/docs/concepts/configuration/secret/
    https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#patch
    https://docs.rackspace.com/docs/rkaas/v2.1.x/external/rkaas-userguide/configure-docker-registry
    
  • 相关阅读:
    Java——多线程常见面试题
    Java——线程定时器
    Java——多线程练习
    Java——线程池
    Java——线程间通信
    Java——线程死锁问题
    Java——线程同步
    Java多线程安全问题
    Java——多线程面试问题
    Java——多线程小例子
  • 原文地址:https://www.cnblogs.com/even160941/p/15504870.html
Copyright © 2011-2022 走看看