本次实验是通过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 了。