赞
踩
本次实验是通过kubeadm部署的kubernetes的集群,总共三台节点。
由于时间关系,采用了helm的方式部署(生产环境建议独立部署harbor)
https://github.com/goharbor/harbor-helm
以上是harbor的地址,先下下来。
第一步创建storageClass,本次实验采用nfs存储资源,先创建一个nfs-client
kind: Deployment apiVersion: apps/v1 metadata: name: harbor-data #这个name会被harbor引用 namespace: nfs-data #创建一个自定义命名空间 kubectl create namespace XXXXX spec: replicas: 1 selector: matchLabels: app: harbor-data #关联标签 strategy: type: Recreate template: metadata: labels: app: harbor-data spec: serviceAccountName: harbor-data containers: - name: harbor-data image: quay.io/external_storage/nfs-client-provisioner:latest volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: harbor-data - name: NFS_SERVER value: 10.1.11.146 #nfs存储地址 - name: NFS_PATH value: /data/harbor #nfs存储目录,注意权限配置 volumes: - name: nfs-client-root nfs: server: 10.1.11.146 path: /data/harbor
再创建其权限及账号nfs-client-sa.yaml
apiVersion: v1 kind: ServiceAccount metadata: name: harbor-data namespace: nfs-data --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: harbor-data-runner rules: - apiGroups: [""] resources: ["persistentvolumes"] verbs: ["get", "list", "watch", "create", "delete"] - apiGroups: [""] resources: ["persistentvolumeclaims"] verbs: ["get", "list", "watch", "update"] - apiGroups: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["list", "watch", "create", "update", "patch"] - apiGroups: [""] resources: ["endpoints"] verbs: ["create", "delete", "get", "list", "watch", "patch", "update"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: harbor-data subjects: - kind: ServiceAccount name: harbor-data namespace: nfs-data roleRef: kind: ClusterRole name: harbor-data-runner apiGroup: rbac.authorization.k8s.io
再创建storageClass harbor-sc.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: harbor-data
namespace: nfs-data
provisioner: harbor-data
以上准备工作完成后,先简单修改下harbor-helm目录下的values.yaml(先跑起来在再说)。
主要修改参数如下:
type: ingress 访问模式,此处不用修改,因为开始就打算使用ingress代理。
hosts: 此处是修改域名,可自定义,也可默认。
externalURL: 连接修改,可自定义,也可默认
然后就是各个模块的storageClass修改,不然一直会报not found PersistentVolume.(推荐使用storageClass,因为pv和pvc都是静态的,如果要使用pvc就要先创建一个pv,因此如果数量一多那就太不安逸了)
每个模块都添加后就可以执行安装了
安装好后查看harbor的状态,是否都为running
额~~~好了,目前工作完成,暂时还无法访问,因为代理没配。
安装ingress-nginx ,本次实验采用ingress-nginx 0.30.0版本
https://github.com/kubernetes/ingress-nginx/tree/nginx-0.30.0
进入deploy目录查看docs/deploy,网页上是直接部署,因为本次需要修改参数先用wget 下下来
https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
其有多种部署方式,但本次实验主要使用了ingress-nginx两种部署方式,一种是通过暴露端口nodeport(访问方式是域名加端口,网上教程多数采用此方式),还有一种是hostnetwork(可直接用域名访问,其实就是使用的宿主机的80和443端口),本次实验最大的困扰就是出现在这里,开始我使用的是nodeport方式部署service,网页访问harbor没问题,但一旦docker login就出现各种状况,整了好久忽然才发现docker login 默认使用https协议,用的是443端口,而nodeport则必定是大于30000的端口,因此此处需注意,其他模式还需继续研究。
修改mandatory.yaml
kind: 类型修改成DaemonSet
replicas: 注销掉,因为DaemonSet模式会每个节点运行一个pod
如果master节点是污点的话,还须在spec中用tolerations声明
在添加一条: hostnetwork:true
--- apiVersion: apps/v1 kind: DaemonSet metadata: name: nginx-ingress-controller namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx spec: #replicas: 3 selector: matchLabels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx template: metadata: labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx annotations: prometheus.io/port: "10254" prometheus.io/scrape: "true" spec: # wait up to five minutes for the drain of connections terminationGracePeriodSeconds: 300 serviceAccountName: nginx-ingress-serviceaccount hostNetwork: true nodeSelector: kubernetes.io/os: linux tolerations: - key: node-role.kubernetes.io/master operator: Exists effect: NoSchedule
执行kubectl create -f mandatory.yaml 后,静等几分钟。
现在就可以在在网页用域名进行访问了,但docker 还是无法login,因为还没有给docker添加证书
kubectl get secret -n harbor|grep ingress 查看密钥
kubectl -n harbor get secrets/XXXXX -o jsonpath="{.data.tls.crt}" | base64 --decode >> ca.crt XXXXX为查出来的的secret name
把ca.crt复制到docker client 的/etc/docker/certs.d/XXXX xxxx为与域名相同的目录下(安装各不相同,具体看自己的安装目录)
至此,我docker已经可以正常login、push、pull 了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。