kubernetes之ingress-nginx、harbor踩坑总结

本次实验是通过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,因此如果数量一多那就太不安逸了)

kubernetes之ingress-nginx、harbor踩坑总结_第1张图片
每个模块都添加后就可以执行安装了

安装好后查看harbor的状态,是否都为running
kubernetes之ingress-nginx、harbor踩坑总结_第2张图片
额~~~好了,目前工作完成,暂时还无法访问,因为代理没配。
安装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 了。

你可能感兴趣的:(kubernetes之ingress-nginx、harbor踩坑总结)