​​‌‌​​​‌‌​‌​​‌‌‍​‌​‌‌‌​​‌‌‌‌​‌​‍​‌​​‌​​​‌​​​‌‌​‍​‌​‌‌​​​‌‌​​​​​‍​​‌​‌‌‌‌‌‌‌‌​​​‍​‌‌​​‌‌‌​‌‌​​‌‌‌‍​‌‌​​​‌‌‌​​​‌​‌‍​​‌‌‌‌‌‌‌‌​​‌‌‍‌​‌‌​‌​​‍‌‌​​​‌‌‌‍‌​‌​‌‌​​‍​‌‌​‌​​‌​​‌‌‌​​‌‍​​​​​​​​‌​‌‌​‌‌‍​​‌​​‌​​​​​​‌​​‍​‌​‌‌​‌​‌​‌‌‌‌‌‍​​​​‌‌​​​‌‌‌‌‌​‍​​‌‌​​​‌‌‌‌​‌‌​‍​‌‌​‌​‌​‌​‌​​​‌‌‍​‌​‌‌‌‌​​‌‌​​​​‍​‌‌​​​‌​​‌​‌‌​​‍​‌​​​​‌​‌‌​‌‌​​‍​​‌‌‌‌‌‌‌‌​​‌​‍​​​​​​​​‌‌‌‌​​‌‌‍​​​‌​‌​‌‌​​‌‌‌​‍‌​​‌‌‌‌​‍‌​​‌‌​‌‌‍‌​​‌​​‌​‍‌​​‌​‌‌​‍‌​​‌​​​‌‍​‌‌​​​‌​‌‌‌​​​‌‍‌‌​​‌‌​‌‍‌‌​​‌‌‌‌‍‌‌​​‌‌‌​‍‌‌​​​‌‌​‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌‌‌​‍‌‌​‌​​‌​‍‌‌​​‌‌‌​‍‌‌​​​‌‌‌‍​‌​‌‌​‌‌‌‌​​‌​​‍​‌‌​​​​‌​‌​​​‌‌‍​​​​​​​​‌‌‌‌​​‌‌‍​‌​‌‌​​​‌‌​​​​​‍​​‌‌​‌​​‌‌‌‌​​​‍​‌​‌​​​‌‌​​‌‌‌‌‍​‌​‌​​​‌​‌‌‌‌‌‌‍​​​​​​​​‌‌‌​​‌​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌‌‍‌​​​‌‌‌‌‍‌​​​‌‌​​‍‌‌​​​‌​‌‍‌​‌​​​‌‌‍‌​‌​​​‌‌‍‌​​‌​‌‌​‍‌​​‌​‌​​‍‌​​‌​‌‌​‍‌​​​‌​​​‍‌​​‌​‌‌​‍‌‌​‌​​​‌‍‌​​‌​​‌​‍‌​​‌‌​‌​‍‌​‌​​​‌‌‍‌​​‌‌‌‌​‍‌​​​‌‌​‌‍‌​​‌‌‌​​‍‌​​‌​‌‌‌‍‌​​‌​‌‌​‍‌​​​‌​​‌‍‌​​‌‌​‌​‍‌​​​‌‌​​‍‌​‌​​​‌‌‍‌‌​​‌​​‌‍‌‌​​‌‌‌‌‍‌‌​‌​​​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​‌​​‌​‍‌​​‌​​‌‌

k8s集群使用私有镜像仓库有两种方式实现。

创建Secret

1、k8s集群使用类型为docker-registry的Secret来提供身份认证,首先为docker私有仓库创建账户密码信息:

$ kubectl -n monitoring create secret docker-registry registry-key \
--docker-server=registry.jiagouyun.com \
--docker-username=wj \
--docker-password=xxxxxx

注意使用 -n 参数指定命名空间,所创建的secret类型资源只对当前namespace有效。

2、查看刚创建的Secret

$ kubectl get secret registry-key -n monitoring
NAME           TYPE                             DATA   AGE
registry-key   kubernetes.io/dockerconfigjson   1       1h

3、建立部署应用文件,在pod中引用imagePullSecrets标签指定拉取镜像时的身份验证信息

$ cat logis-web.yml 
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  namespace: monitoring
  name: logis-web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: logis-web
  template:
    metadata:
      labels:
         app: logis-web
    spec:
      containers:
      - image: registry.jiagouyun.com/smart-logistics/logistics-platform:pre
        name: logis-web
        ports:
        - containerPort: 80
      imagePullSecrets:
      - name: registry-key
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: logis-web
  namespace: monitoring
  labels:
    app: logis-web
spec:
  type: NodePort
  ports:
    - nodePort: 30190
      targetPort: 80
      port: 80
      protocol: TCP
  selector:
    app: logis-web

4、创建应用以验证:

$ kubectl create -f logis-web.yml

注意:

对每一个使用私有仓库的pod,都需要在相应位置做以上修改。

如果想让当前所创建的secret对整个命名空间里的所有Pod生效,可以通过在serviceAccount 资源中设置imagePullSecrets自动设置imagePullSecrets

创建serviceAccount

1、查看当前命名空间下的sa

$ kubectl -n monitoring get serviceaccount
NAME      SECRETS   AGE
default   1         14h

2、更新sa,将imagePullSecrets引入默认的sa中

$ kubectl -n monitoring patch serviceaccount default -p '{"imagePullSecrets": [{"name":"registry-key"}]}'
$ kubectl get sa -n monitoring
NAME      SECRETS   AGE
default   1          1h

3、查看当前空间默认的sa内容

$ kubectl -n monitoring get serviceaccounts default -o yaml
apiVersion: v1
imagePullSecrets:
- name: registry-key
kind: ServiceAccount
metadata:
  creationTimestamp: "2018-12-14T16:16:13Z"
  name: default
  namespace: monitoring
  resourceVersion: "9155"
  selfLink: /api/v1/namespaces/monitoring/serviceaccounts/default
  uid: 9375ee5d-ffbb-11e8-9b51-525400c9c704
secrets:
- name: default-token-fvrst

这样配置以后,在当前命名空间下创建的Pod都会自动设置imagePullSecrets,不需要在每个Pod下单独添加对应字段了。

验证方法和前面的delpoyment文件类似,只需要去掉部署文件中的imagePullSecrets相关字段。